rweb3
v1.1.0
Published
Runebase JavaScript API comunicating to runebase node over RPC
Downloads
6
Maintainers
Readme
Rweb3.js - Web3.js for Runebase
Rweb3 is a library for dApps to interract with the Runebase blockchain. Rweb3 communicates to a Runebase node via the provider provided.
https://www.npmjs.com/package/rweb3
Get Started
Run the following in your project folder:
npm install rweb3 --save
Rweb3.js
Instantiate a new instance of Rweb3
:
const { Rweb3 } = require('rweb3');
// Instantiate Rweb3 with HttpProvider
// Pass in the URL of your Runebase node RPC port with auth credentials.
// Default Runebase RPC ports: testnet=13889 mainnet=3889
const rweb3 = new Rweb3('http://bodhi:bodhi@localhost:13889');
// Instantiate Rweb3 with QryptoRPCProvider
// QryptoRPCProvider is a provider for the Qrypto Wallet Chrome Extension.
// Please note QryptoRPCProvider only allows the rawCall() method to be used.
// It is specifically used for sendtocontract and callcontract only.
const rweb3 = new Rweb3(new QryptoRPCProvider());
isConnected()
Checks if you are connected properly to the local runebase node.
async function isConnected() {
return await rweb3.isConnected();
}
getHexAddress(address)
Converts a Runebase address to hex format.
async function getHexAddress() {
return await rweb3.getHexAddress('qKjn4fStBaAtwGiwueJf9qFxgpbAvf1xAy');
}
fromHexAddress(hexAddress)
Converts a hex address to Runebase format.
async function fromHexAddress() {
return await rweb3.fromHexAddress('17e7888aa7412a735f336d2f6d784caefabb6fa3');
}
getBlockCount()
Gets the current block height of your local Runebase node.
async function getBlockCount() {
return await rweb3.getBlockCount();
}
getTransaction(txid)
Gets the transaction details of the transaction id.
async function getTransaction(args) {
const {
transactionId, // string
} = args;
return await rweb3.getTransactionReceipt(transactionId);
}
getTransactionReceipt(txid)
Gets the transaction receipt of the transaction id.
async function getTransactionReceipt(args) {
const {
transactionId, // string
} = args;
return await rweb3.getTransactionReceipt(transactionId);
}
listUnspent()
Gets the unspent outputs that can be used.
async function listUnspent() {
return await rweb3.listUnspent();
}
searchLogs(fromBlock, toBlock, addresses, topics, contractMetadata, removeHexPrefix)
Gets the logs given the params on the blockchain.
The contractMetadata
param contains the contract names and ABI that you would like to parse. An example of one is:
# contract_metadata.js
module.exports = {
EventFactory: {
address: 'd53927df927be7fc51ce8bf8b998cb6611c266b0',
abi: [{ constant: true, inputs: [{ name: '', type: 'bytes32' }], name: 'topics', outputs: [{ name: '', type: 'address' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [{ name: '_oracle', type: 'address' }, { name: '_name', type: 'bytes32[10]' }, { name: '_resultNames', type: 'bytes32[10]' }, { name: '_bettingEndBlock', type: 'uint256' }, { name: '_resultSettingEndBlock', type: 'uint256' }], name: 'createTopic', outputs: [{ name: 'topicEvent', type: 'address' }], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [{ name: '_name', type: 'bytes32[10]' }, { name: '_resultNames', type: 'bytes32[10]' }, { name: '_bettingEndBlock', type: 'uint256' }, { name: '_resultSettingEndBlock', type: 'uint256' }], name: 'doesTopicExist', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'view', type: 'function' }, { inputs: [{ name: '_addressManager', type: 'address' }], payable: false, stateMutability: 'nonpayable', type: 'constructor' }, { anonymous: false, inputs: [{ indexed: true, name: '_topicAddress', type: 'address' }, { indexed: true, name: '_creator', type: 'address' }, { indexed: true, name: '_oracle', type: 'address' }, { indexed: false, name: '_name', type: 'bytes32[10]' }, { indexed: false, name: '_resultNames', type: 'bytes32[10]' }, { indexed: false, name: '_bettingEndBlock', type: 'uint256' }, { indexed: false, name: '_resultSettingEndBlock', type: 'uint256' }], name: 'TopicCreated', type: 'event' }],
},
TopicEvent: {
abi: [{ constant: false, inputs: [{ name: '_resultIndex', type: 'uint8' }, { name: '_sender', type: 'address' }, { name: '_amount', type: 'uint256' }], name: 'voteFromOracle', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [], name: 'totalBotValue', outputs: [{ name: '', type: 'uint256' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [{ name: '_oracleIndex', type: 'uint8' }], name: 'getOracle', outputs: [{ name: '', type: 'address' }, { name: '', type: 'bool' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [{ name: '', type: 'address' }], name: 'didWithdraw', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'resultSet', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'status', outputs: [{ name: '', type: 'uint8' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'getFinalResult', outputs: [{ name: '', type: 'uint8' }, { name: '', type: 'string' }, { name: '', type: 'bool' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [{ name: '', type: 'uint256' }], name: 'resultNames', outputs: [{ name: '', type: 'bytes32' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [{ name: '', type: 'uint256' }], name: 'oracles', outputs: [{ name: 'didSetResult', type: 'bool' }, { name: 'oracleAddress', type: 'address' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [], name: 'finalizeResult', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: false, inputs: [{ name: '_oracle', type: 'address' }, { name: '_resultIndex', type: 'uint8' }, { name: '_consensusThreshold', type: 'uint256' }], name: 'centralizedOracleSetResult', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [], name: 'totalRunebaseValue', outputs: [{ name: '', type: 'uint256' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [{ name: '_consensusThreshold', type: 'uint256' }], name: 'invalidateOracle', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [], name: 'getBetBalances', outputs: [{ name: '', type: 'uint256[10]' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'owner', outputs: [{ name: '', type: 'address' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'calculateRunebaseContributorWinnings', outputs: [{ name: '', type: 'uint256' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'getVoteBalances', outputs: [{ name: '', type: 'uint256[10]' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'getTotalVotes', outputs: [{ name: '', type: 'uint256[10]' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [{ name: '_better', type: 'address' }, { name: '_resultIndex', type: 'uint8' }], name: 'bet', outputs: [], payable: true, stateMutability: 'payable', type: 'function' }, { constant: false, inputs: [{ name: '_resultIndex', type: 'uint8' }, { name: '_currentConsensusThreshold', type: 'uint256' }], name: 'votingOracleSetResult', outputs: [{ name: '', type: 'bool' }], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [], name: 'getTotalBets', outputs: [{ name: '', type: 'uint256[10]' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'getEventName', outputs: [{ name: '', type: 'string' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'invalidResultIndex', outputs: [{ name: '', type: 'uint8' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'numOfResults', outputs: [{ name: '', type: 'uint8' }], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [], name: 'withdrawWinnings', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: false, inputs: [{ name: '_newOwner', type: 'address' }], name: 'transferOwnership', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' }, { constant: true, inputs: [], name: 'calculateBotContributorWinnings', outputs: [{ name: '', type: 'uint256' }], payable: false, stateMutability: 'view', type: 'function' }, { inputs: [{ name: '_owner', type: 'address' }, { name: '_centralizedOracle', type: 'address' }, { name: '_name', type: 'bytes32[10]' }, { name: '_resultNames', type: 'bytes32[10]' }, { name: '_bettingEndBlock', type: 'uint256' }, { name: '_resultSettingEndBlock', type: 'uint256' }, { name: '_addressManager', type: 'address' }], payable: false, stateMutability: 'nonpayable', type: 'constructor' }, { payable: true, stateMutability: 'payable', type: 'fallback' }, { anonymous: false, inputs: [{ indexed: true, name: '_eventAddress', type: 'address' }, { indexed: false, name: '_finalResultIndex', type: 'uint8' }], name: 'FinalResultSet', type: 'event' }, { anonymous: false, inputs: [{ indexed: true, name: '_winner', type: 'address' }, { indexed: false, name: '_runebaseTokenWon', type: 'uint256' }, { indexed: false, name: '_botTokenWon', type: 'uint256' }], name: 'WinningsWithdrawn', type: 'event' }, { anonymous: false, inputs: [{ indexed: true, name: '_previousOwner', type: 'address' }, { indexed: true, name: '_newOwner', type: 'address' }], name: 'OwnershipTransferred', type: 'event' }],
},
};
Usage:
const ContractMetadata = require('./contract_metadata');
async function(args) {
let {
fromBlock, // number
toBlock, // number
addresses, // string array
topics // string array
} = args;
if (addresses === undefined) {
addresses = [];
}
if (topics === undefined) {
topics = [];
}
// removeHexPrefix = true removes the '0x' hex prefix from all hex values
return await rweb3.searchLogs(fromBlock, toBlock, addresses, topics, contractMetadata, true);
}
Contract.js
Instantiate a new instance of Contract
:
const { Rweb3 } = require('rweb3');
const rweb3 = new Rweb3('http://bodhi:bodhi@localhost:13889');
// contractAddress = The address of your contract deployed on the blockchain
const contractAddress = 'f7b958eac2bdaca0f225b86d162f263441d23c19';
// contractAbi = The ABI of the contract
const contractAbi = [{"constant":false,"inputs":[{"name":"_eventAddress","type":"address"},{"name":"_eventName","type":"bytes32[10]"},{"name":"_eventResultNames","type":"bytes32[10]"},{"name":"_numOfResults","type":"uint8"},{"name":"_lastResultIndex","type":"uint8"},{"name":"_arbitrationEndBlock","type":"uint256"},{"name":"_consensusThreshold","type":"uint256"}],"name":"createDecentralizedOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_eventAddress","type":"address"},{"name":"_eventName","type":"bytes32[10]"},{"name":"_eventResultNames","type":"bytes32[10]"},{"name":"_numOfResults","type":"uint8"},{"name":"_lastResultIndex","type":"uint8"},{"name":"_arbitrationEndBlock","type":"uint256"},{"name":"_consensusThreshold","type":"uint256"}],"name":"doesDecentralizedOracleExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oracle","type":"address"},{"name":"_eventAddress","type":"address"},{"name":"_eventName","type":"bytes32[10]"},{"name":"_eventResultNames","type":"bytes32[10]"},{"name":"_numOfResults","type":"uint8"},{"name":"_bettingEndBlock","type":"uint256"},{"name":"_resultSettingEndBlock","type":"uint256"},{"name":"_consensusThreshold","type":"uint256"}],"name":"createCentralizedOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_oracle","type":"address"},{"name":"_eventAddress","type":"address"},{"name":"_eventName","type":"bytes32[10]"},{"name":"_eventResultNames","type":"bytes32[10]"},{"name":"_numOfResults","type":"uint8"},{"name":"_bettingEndBlock","type":"uint256"},{"name":"_resultSettingEndBlock","type":"uint256"},{"name":"_consensusThreshold","type":"uint256"}],"name":"doesCentralizedOracleExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"oracles","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_addressManager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_contractAddress","type":"address"},{"indexed":true,"name":"_oracle","type":"address"},{"indexed":true,"name":"_eventAddress","type":"address"},{"indexed":false,"name":"_name","type":"bytes32[10]"},{"indexed":false,"name":"_resultNames","type":"bytes32[10]"},{"indexed":false,"name":"_numOfResults","type":"uint8"},{"indexed":false,"name":"_bettingEndBlock","type":"uint256"},{"indexed":false,"name":"_resultSettingEndBlock","type":"uint256"},{"indexed":false,"name":"_consensusThreshold","type":"uint256"}],"name":"CentralizedOracleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_contractAddress","type":"address"},{"indexed":true,"name":"_eventAddress","type":"address"},{"indexed":false,"name":"_name","type":"bytes32[10]"},{"indexed":false,"name":"_resultNames","type":"bytes32[10]"},{"indexed":false,"name":"_numOfResults","type":"uint8"},{"indexed":false,"name":"_lastResultIndex","type":"uint8"},{"indexed":false,"name":"_arbitrationEndBlock","type":"uint256"},{"indexed":false,"name":"_consensusThreshold","type":"uint256"}],"name":"DecentralizedOracleCreated","type":"event"}]
// Create a Contract instance from the Rweb3 instance
const contract = rweb3.Contract(contractAddress, contractAbi);
call(methodName, params)
Executes a callcontract
// callcontract on a method named 'bettingEndBlock'
async function exampleCall(args) {
const {
senderAddress, // address
} = args;
return await contract.call('bettingEndBlock', {
methodArgs: [],
senderAddress: senderAddress,
});
}
send(methodName, params)
Executes a sendtocontract
// sendtocontract on a method named 'setResult'
async function exampleSend(args) {
const {
resultIndex, // number
senderAddress, // address
} = args;
return await contract.send('setResult', {
methodArgs: [resultIndex],
gasLimit: 1000000, // setting the gas limit to 1 million
senderAddress: senderAddress,
});
}
Encoder
Encoder
static functions are exposed in Rweb3 instances.
const { Rweb3 } = require('rweb3');
const rweb3 = new Rweb3('http://bodhi:bodhi@localhost:13889');
rweb3.encoder.objToHash(abiObj, isFunction);
rweb3.encoder.addressToHex(address);
rweb3.encoder.boolToHex(value);
rweb3.encoder.intToHex(num);
rweb3.encoder.uintToHex(num);
rweb3.encoder.stringToHex(string, maxCharLen);
rweb3.encoder.stringArrayToHex(strArray, numOfItems);
rweb3.encoder.padHexString(hexStr);
rweb3.encoder.constructData(abi, methodName, args);
Decoder
Decoder
static functions are exposed in Rweb3 instances.
const { Rweb3 } = require('rweb3');
const rweb3 = new Rweb3('http://bodhi:bodhi@localhost:13889');
rweb3.decoder.toRunebaseAddress(hexAddress, isMainnet);
rweb3.decoder.removeHexPrefix(value);
rweb3.decoder.decodeSearchLog(rawOutput, contractMetadata, removeHexPrefix);
rweb3.decoder.decodeCall(rawOutput, contractABI, methodName, removeHexPrefix);
Utils
Utils
static functions are exposed in Rweb3 instances.
const { Rweb3 } = require('rweb3');
const rweb3 = new Rweb3('http://bodhi:bodhi@localhost:13889');
rweb3.utils.paramsCheck(methodName, params, required, validators);
rweb3.utils.appendHexPrefix(value);
rweb3.utils.trimHexPrefix(str);
rweb3.utils.chunkString(str, length);
rweb3.utils.toUtf8(hex);
rweb3.utils.fromUtf8(str);
rweb3.utils.isJson(str);
rweb3.utils.isRunebaseAddress(address);
Running Tests
You need to create a .env
file in the root folder with the following variables in the following formats. Change it to how your environment is setup.
RUNEBASE_RPC_ADDRESS='http://bodhi:bodhi@localhost:13889'
SENDER_ADDRESS='qMZK8FNPRm54jvTLAGEs1biTCgyCkcsmna'
WALLET_PASSPHRASE='bodhi'