UNPKG

@metamask/ethjs-query

Version:

A simple query layer for the Ethereum RPC.

748 lines (727 loc) 30.2 kB
"use strict"; require('hard-rejection')(); var _require = require('chai'), assert = _require.assert; var _require2 = require('@metamask/ethjs-util'), getBinarySize = _require2.getBinarySize; var Ganache = require('ganache-cli'); var BigNumber = require('bn.js'); var abi = require('ethjs-abi'); var Eth = require('../index.js'); var Eth2 = require('../index.js'); describe('ethjs-query', function () { var provider; beforeEach(function () { provider = Ganache.provider(); }); describe('construction', function () { it('should construct normally', function () { var eth = new Eth(provider); assert.equal(typeof eth, 'object'); assert.equal(typeof eth.accounts, 'function'); assert.equal(typeof eth.getBalance, 'function'); assert.equal(typeof eth.sendTransaction, 'function'); assert.equal(typeof eth.sendRawTransaction, 'function'); assert.equal(typeof eth.personal_sign, 'function'); assert.equal(typeof eth.personal_ecRecover, 'function'); }); it('should construct normally with non Eth name', function () { var eth = new Eth2(provider); assert.equal(typeof eth, 'object'); assert.equal(typeof eth.accounts, 'function'); assert.equal(typeof eth.getBalance, 'function'); assert.equal(typeof eth.sendTransaction, 'function'); assert.equal(typeof eth.sendRawTransaction, 'function'); }); it('should fail when provider is not valid', function (done) { try { var eth = new Eth(''); // eslint-disable-line } catch (error) { assert.equal(typeof error, 'object'); done(); } }); it('should fail when provider is not valid', function (done) { try { var eth = new Eth(342323); // eslint-disable-line } catch (error) { assert.equal(typeof error, 'object'); done(); } }); it('debugger should function', function (done) { var eth = new Eth(provider, { debug: true, logger: { log: function log(message) { assert.equal(typeof message, 'string'); } } }); // eslint-disable-line eth.accounts(function (err, result) { assert.equal(err, null); assert.equal(Array.isArray(result), true); done(); }); }); it('should fail with response error payload', function (done) { var eth = new Eth({ sendAsync: function sendAsync(opts, cb) { cb(false, { error: 'bad data..' }); } }); // eslint-disable-line eth.accounts(function (err, result) { assert.equal(typeof err, 'object'); assert.equal(result, null); done(); }); }); it('should handle empty getTransactionReceipt', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.getTransactionReceipt('0x7f9de10bdd8686734c1b2dd2b7e53ea3e1ffe7fd4698a3a521ec8e09570ca121', function (err, result) { assert.equal(typeof err, 'object'); assert.equal(result, null); done(); }); }); it('should fail with invalid payload response (formatting error)', function (done) { var eth = new Eth({ sendAsync: function sendAsync(opts, cb) { cb(false, { result: [38274978, 983428943] }); } }); // eslint-disable-line eth.accounts(function (err, result) { assert.equal(typeof err, 'object'); assert.equal(result, null); done(); }); }); it('should fail with invalid method input (formatting error)', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.getBalance(234842387, function (err, result) { assert.equal(typeof err, 'object'); assert.equal(result, null); done(); }); }); it('should fail when no new flag is present', function (done) { try { var eth = Eth2(provider); // eslint-disable-line } catch (error) { assert.equal(typeof error, 'object'); done(); } }); it('should fail nicely when too little params on getBalance', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.getBalance(function (err, result) { assert.equal(typeof err, 'object'); assert.equal(result, null); done(); }); }); it('should fail nicely when too many paramsEncoded on getBalance', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.getBalance('fsdfsd', 'sdffsd', 'dsfdfssf', function (error, result) { assert.equal(typeof error, 'object'); assert.equal(result, null); done(); }); }); it('should check if the rpc is eth_syncing', function (done) { var eth = new Eth(provider); eth.syncing(function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'boolean'); done(); }); }); it('should function while eth_coinbase', function (done) { var eth = new Eth(provider); eth.coinbase(function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 42); done(); }); }); it('should function while eth_coinbase using promise', function (done) { var eth = new Eth(provider); eth.coinbase().then(function (result) { assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 42); done(); })["catch"](function (err) { assert.equal(err, null); }); }); it('should get acconts with promise', function (done) { var eth = new Eth(provider); eth.accounts().then(function (result) { assert.equal(typeof result, 'object'); assert.equal(result.length > 0, true); done(); })["catch"](function (err) { assert.equal(err, null); }); }); it('should reject bad getBalance call with an error', function (done) { var eth = new Eth(provider); eth.accounts(function (accountsError, accounts) { eth.sendTransaction({ from: accounts[0], to: accounts[1], gas: 10, value: 100000, data: '0x' })["catch"](function (err) { assert.equal(typeof err, 'object'); done(); }); }); }); it('should function while eth_getBalance using promise', function (done) { var eth = new Eth(provider); eth.coinbase().then(function (result) { assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 42); eth.getBalance(result).then(function (balance) { assert.equal(typeof balance, 'object'); done(); })["catch"](function (err) { assert.equal(err, null); }); })["catch"](function (err) { assert.equal(err, null); }); }); it('should function while eth_getBalance, optional and non optional latest', function (done) { var eth = new Eth(provider); eth.coinbase(function (err, coinbase) { assert.equal(err, null); assert.equal(typeof coinbase, 'string'); assert.equal(getBinarySize(coinbase), 42); eth.getBalance(coinbase, function (balanceError, balance) { assert.equal(balanceError, null); assert.equal(typeof balance, 'object'); eth.getBalance(coinbase, 'latest', function (balanceLatestError, balanceLatest) { assert.equal(balanceLatestError, null); assert.equal(typeof balanceLatest, 'object'); assert.equal(balance.toString(10), balanceLatest.toString(10)); done(); }); }); }); }); it('should function while get_accounts', function (done) { var eth = new Eth(provider); eth.accounts(function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'object'); assert.equal(Array.isArray(result), true); assert.equal(result.length > 0, true); assert.equal(typeof result[0], 'string'); assert.equal(getBinarySize(result[0]), 42); done(); }); }); it('should function while eth_blockNumber', function (done) { var eth = new Eth(provider); eth.blockNumber(function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'object'); assert.equal(result.toNumber() >= 0, true); done(); }); }); it('should function while eth_estimateGas', function (done) { var eth = new Eth(provider); eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransactionObject = { from: accounts[0], to: accounts[4], gas: new BigNumber(23472), gasPrice: '92384242', data: '0x' }; eth.estimateGas(testTransactionObject, function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'object'); assert.equal(typeof result.toString(10), 'string'); assert.equal(result.toNumber(10) > 0, true); done(); }); }); }); it('should function while eth_gasPrice', function (done) { var eth = new Eth(provider); eth.gasPrice(function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'object'); assert.equal(result.toNumber() > 0, true); done(); }); }); it('should function while eth_getBalance', function (done) { var eth = new Eth(provider); eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); eth.getBalance(accounts[0], function (err, result) { assert.equal(err, null); assert.equal(typeof result, 'object'); assert.equal(result.gt(0), true); eth.getBalance(accounts[0], 'latest', function (err2, result2) { assert.equal(err2, null); assert.equal(typeof result2, 'object'); assert.equal(result2.gt(0), true); done(); }); }); }); }); it('should function while eth_getBlockByNumber', function (done) { // eslint-disable-line var eth = new Eth(provider); eth.getBlockByNumber(0, true, function (blockError, result) { assert.equal(blockError, null); assert.equal(typeof result, 'object'); assert.equal(getBinarySize(result.hash), 66); assert.equal(getBinarySize(result.sha3Uncles), 66); assert.equal(getBinarySize(result.parentHash), 66); assert.equal(result.size.toNumber(10) > 0, true); assert.equal(result.gasLimit.toNumber(10) > 0, true); assert.equal(result.timestamp.toNumber(10) > 0, true); done(); }); }); it('should function while eth_getBlockByHash', function (done) { var eth = new Eth(provider); eth.getBlockByNumber(0, true, function (blockError, block) { assert.equal(blockError, null); assert.equal(typeof block, 'object'); eth.getBlockByHash(block.hash, true, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'object'); assert.equal(getBinarySize(result.hash), 66); assert.equal(getBinarySize(result.sha3Uncles), 66); assert.equal(getBinarySize(result.parentHash), 66); assert.equal(result.size.toNumber(10) > 0, true); assert.equal(result.gasLimit.toNumber(10) > 0, true); assert.equal(result.timestamp.toNumber(10) > 0, true); done(); }); }); }); it('should function while eth_getCode', function (done) { var eth = new Eth(provider); // eslint-disable-line done(); }); it('should function while eth_hashrate', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.hashrate(function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'object'); assert.equal(result.toNumber(10) >= 0, true); done(); }); }); it('should function while eth_mining', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.mining(function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'boolean'); done(); }); }); it('should function while eth_getTransactionCount', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); eth.getTransactionCount(accounts[0], function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'object'); assert.equal(result.toNumber(10) >= 0, true); done(); }); }); }); it('should function while eth_getTransactionByBlockHashAndIndex', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransaction = { from: accounts[0], to: accounts[2], gas: 3000000, data: '0x' }; eth.sendTransaction(testTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); eth.getTransactionReceipt(result, function (receiptError, receipt) { assert.equal(receiptError, null); assert.equal(typeof receipt, 'object'); eth.getTransactionByBlockHashAndIndex(receipt.blockHash, 0, function (blockError, block) { assert.equal(blockError, null); assert.equal(typeof block, 'object'); assert.equal(getBinarySize(block.blockHash), 66); assert.equal(block.gas.toNumber(10) >= 0, true); assert.equal(block.gasPrice.toNumber(10) >= 0, true); assert.equal(block.transactionIndex.toNumber(10) >= 0, true); assert.equal(block.blockNumber.toNumber(10) >= 0, true); done(); }); }); }); }); }); it('should function while eth_getTransactionByBlockNumberAndIndex', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransaction = { from: accounts[0], to: accounts[2], gas: 3000000, data: '0x' }; eth.sendTransaction(testTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); eth.getTransactionReceipt(result, function (receiptError, receipt) { assert.equal(receiptError, null); assert.equal(typeof receipt, 'object'); eth.getTransactionByBlockNumberAndIndex(1, 0, function (blockError, block) { assert.equal(blockError, null); assert.equal(typeof block, 'object'); assert.equal(getBinarySize(block.blockHash), 66); assert.equal(block.gas.toNumber(10) >= 0, true); assert.equal(block.gasPrice.toNumber(10) >= 0, true); assert.equal(block.transactionIndex.toNumber(10) >= 0, true); assert.equal(block.blockNumber.toNumber(10) >= 0, true); done(); }); }); }); }); }); it('should function while eth_sendTransaction', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransaction = { from: accounts[0], to: accounts[2], gas: 3000000, data: '0x' }; eth.sendTransaction(testTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); done(); }); }); }); it('should function while eth_sendTransaction with contract', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransaction = { from: accounts[0], gas: '3000000', data: '606060405234610000575b61016a806100186000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063119c56bd1461004e57806360fe47b11461008e5780636d4ce63c146100c1575b610000565b346100005761005b6100e4565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34610000576100a960048080359060200190919050506100f5565b60405180821515815260200191505060405180910390f35b34610000576100ce61015f565b6040518082815260200191505060405180910390f35b60006000610d7d91503390505b9091565b6000816000819055507f10e8e9bc5a1bde3dd6bb7245b52503fcb9d9b1d7c7b26743f82c51cc7cce917d60005433604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600190505b919050565b600060005490505b9056' }; eth.sendTransaction(testTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); done(); }); }); }); it('should function while eth_sign', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTxData = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'; eth.sign(accounts[0], testTxData, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result) > 0, true); done(); }); }); }); it('should function while eth_getTransactionReceipt', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testTransaction = { from: accounts[0], to: accounts[2], gas: 3000000, data: '0x' }; eth.sendTransaction(testTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); setTimeout(function () { eth.getTransactionReceipt(result, function (receiptError, receipt) { assert.equal(receiptError, null); assert.equal(typeof receipt, 'object'); assert.equal(getBinarySize(receipt.transactionHash), 66); assert.equal(receipt.transactionIndex.toNumber(10) >= 0, true); assert.equal(receipt.blockNumber.toNumber(10) >= 0, true); assert.equal(receipt.cumulativeGasUsed.toNumber(10) >= 0, true); assert.equal(receipt.gasUsed.toNumber(10) >= 0, true); assert.equal(Array.isArray(receipt.logs), true); done(); }); }, 340); }); }); }); it('should function while deploy, use contract via eth_call, eth_getCode', function (done) { var eth = new Eth(provider); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testContractTransaction = { from: accounts[0], gas: 3000000, data: '606060405234610000575b61016a806100186000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063119c56bd1461004e57806360fe47b11461008e5780636d4ce63c146100c1575b610000565b346100005761005b6100e4565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34610000576100a960048080359060200190919050506100f5565b60405180821515815260200191505060405180910390f35b34610000576100ce61015f565b6040518082815260200191505060405180910390f35b60006000610d7d91503390505b9091565b6000816000819055507f10e8e9bc5a1bde3dd6bb7245b52503fcb9d9b1d7c7b26743f82c51cc7cce917d60005433604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600190505b919050565b600060005490505b9056' }; var contractABI = [{ 'constant': false, 'inputs': [], 'name': 'setcompeltereturn', 'outputs': [{ 'name': '_newValue', 'type': 'uint256' }, { 'name': '_sender', 'type': 'address' }], 'payable': false, 'type': 'function' }, { 'constant': false, 'inputs': [{ 'name': '_value', 'type': 'uint256' }], 'name': 'set', 'outputs': [{ 'name': '', 'type': 'bool' }], 'payable': false, 'type': 'function' }, { 'constant': false, 'inputs': [], 'name': 'get', 'outputs': [{ 'name': 'storeValue', 'type': 'uint256' }], 'payable': false, 'type': 'function' }, { 'anonymous': false, 'inputs': [{ 'indexed': false, 'name': '_newValue', 'type': 'uint256' }, { 'indexed': false, 'name': '_sender', 'type': 'address' }], 'name': 'SetComplete', 'type': 'event' }]; // eslint-disable-line eth.sendTransaction(testContractTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); setTimeout(function () { eth.getTransactionReceipt(result, function (receiptError, receipt) { assert.equal(receiptError, null); assert.equal(typeof receipt, 'object'); assert.equal(getBinarySize(receipt.transactionHash), 66); assert.equal(receipt.transactionIndex.toNumber(10) >= 0, true); assert.equal(receipt.blockNumber.toNumber(10) >= 0, true); assert.equal(receipt.cumulativeGasUsed.toNumber(10) >= 0, true); assert.equal(receipt.gasUsed.toNumber(10) >= 0, true); assert.equal(Array.isArray(receipt.logs), true); assert.equal(typeof receipt.contractAddress, 'string'); var uintValue = 350000; var setMethodTransaction = { from: accounts[0], to: receipt.contractAddress, gas: 3000000, data: abi.encodeMethod(contractABI[1], [uintValue]) }; eth.sendTransaction(setMethodTransaction, function (setMethodError, setMethodTx) { assert.equal(setMethodError, null); assert.equal(typeof setMethodTx, 'string'); assert.equal(getBinarySize(setMethodTx), 66); setTimeout(function () { var callMethodTransaction = { to: receipt.contractAddress, data: abi.encodeMethod(contractABI[2], []) }; eth.call(callMethodTransaction, function (callError, callResult) { // eslint-disable-line assert.equal(setMethodError, null); var decodedUint = abi.decodeMethod(contractABI[2], callResult); assert.equal(decodedUint[0].toNumber(10), uintValue); eth.getCode(receipt.contractAddress, 'latest', function (codeError, codeResult) { assert.equal(codeError, null); assert.equal(typeof codeResult, 'string'); done(); }); }); }, 400); }); }); }, 1000); }); }); }); it('should function while deploy, use contract via eth_call, eth_getCode with debug, logger', function (done) { var eth = new Eth(provider, { debug: true, logger: { log: function log() {} }, jsonSpace: 2 }); // eslint-disable-line eth.accounts(function (accountsError, accounts) { assert.equal(accountsError, null); assert.equal(typeof accounts, 'object'); var testContractTransaction = { from: accounts[0], gas: 3000000, data: '606060405234610000575b61016a806100186000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063119c56bd1461004e57806360fe47b11461008e5780636d4ce63c146100c1575b610000565b346100005761005b6100e4565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34610000576100a960048080359060200190919050506100f5565b60405180821515815260200191505060405180910390f35b34610000576100ce61015f565b6040518082815260200191505060405180910390f35b60006000610d7d91503390505b9091565b6000816000819055507f10e8e9bc5a1bde3dd6bb7245b52503fcb9d9b1d7c7b26743f82c51cc7cce917d60005433604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600190505b919050565b600060005490505b9056' }; var contractABI = [{ 'constant': false, 'inputs': [], 'name': 'setcompeltereturn', 'outputs': [{ 'name': '_newValue', 'type': 'uint256' }, { 'name': '_sender', 'type': 'address' }], 'payable': false, 'type': 'function' }, { 'constant': false, 'inputs': [{ 'name': '_value', 'type': 'uint256' }], 'name': 'set', 'outputs': [{ 'name': '', 'type': 'bool' }], 'payable': false, 'type': 'function' }, { 'constant': false, 'inputs': [], 'name': 'get', 'outputs': [{ 'name': 'storeValue', 'type': 'uint256' }], 'payable': false, 'type': 'function' }, { 'anonymous': false, 'inputs': [{ 'indexed': false, 'name': '_newValue', 'type': 'uint256' }, { 'indexed': false, 'name': '_sender', 'type': 'address' }], 'name': 'SetComplete', 'type': 'event' }]; // eslint-disable-line eth.sendTransaction(testContractTransaction, function (error, result) { assert.equal(error, null); assert.equal(typeof result, 'string'); assert.equal(getBinarySize(result), 66); setTimeout(function () { eth.getTransactionReceipt(result, function (receiptError, receipt) { assert.equal(receiptError, null); assert.equal(typeof receipt, 'object'); assert.equal(getBinarySize(receipt.transactionHash), 66); assert.equal(receipt.transactionIndex.toNumber(10) >= 0, true); assert.equal(receipt.blockNumber.toNumber(10) >= 0, true); assert.equal(receipt.cumulativeGasUsed.toNumber(10) >= 0, true); assert.equal(receipt.gasUsed.toNumber(10) >= 0, true); assert.equal(Array.isArray(receipt.logs), true); assert.equal(typeof receipt.contractAddress, 'string'); var uintValue = 350000; var setMethodTransaction = { from: accounts[0], to: receipt.contractAddress, gas: 3000000, data: abi.encodeMethod(contractABI[1], [uintValue]) }; eth.sendTransaction(setMethodTransaction, function (setMethodError, setMethodTx) { assert.equal(setMethodError, null); assert.equal(typeof setMethodTx, 'string'); assert.equal(getBinarySize(setMethodTx), 66); setTimeout(function () { var callMethodTransaction = { to: receipt.contractAddress, data: abi.encodeMethod(contractABI[2], []) }; eth.call(callMethodTransaction, function (callError, callResult) { // eslint-disable-line assert.equal(setMethodError, null); var decodedUint = abi.decodeMethod(contractABI[2], callResult); assert.equal(decodedUint[0].toNumber(10), uintValue); eth.getCode(receipt.contractAddress, 'latest', function (codeError, codeResult) { assert.equal(codeError, null); assert.equal(typeof codeResult, 'string'); done(); }); }); }, 400); }); }); }, 1000); }); }); }); }); });