Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in Blockchain by (4.1k points)

how display balance of token through Ethereum RPC?

$id = 0;
$data = array();
$data['jsonrpc'] = '2.0';
$data['id'] = $id++;
$data['method'] = 'eth_call';
$data['params'] = [['from' => '0x0...', 'to' => '0x0...', 'data' => 'contract byte code here 0x0...'], 'latest'];

$ch = curl_init();
...

Return: 

{"jsonrpc":"2.0","id":0,"result":"0x"}

What to do next? Call contract method balanceOf? How to do that?

1 Answer

0 votes
by (14.4k points)

For fetching the token balance with eth_call, you need 'to' and 'data' parameters. 

To refers to the contract address. And here we need to generate the data parameter. 

data: DATA - (optional) Hash of the method signature and encoded parameters. 

Take this EOS token transaction as an example.

Contract address:0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0

Token Holder address:0x0b88516a6d22bf8e0d3657effbd41577c5fd4cb7

You can see the contract code here.

contract ERC20 {

    function totalSupply() constant returns (uint supply);

    function balanceOf( address who ) constant returns (uint value);

    function allowance( address owner, address spender ) constant returns (uint _allowance);

    function transfer( address to, uint value) returns (bool ok);

    function transferFrom( address from, address to, uint value) returns (bool ok);

    function approve( address spender, uint value ) returns (bool ok);

    event Transfer( address indexed from, address indexed to, uint value);

    event Approval( address indexed owner, address indexed spender, uint value);

}

Now comes the Function Selector

>>> from web3 import Web3

>>> Web3.sha3("balanceOf(address)")

HexBytes('0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be')

Take the first four bytes 70a08231

Argument Encoding

address: equivalent to uint160, except for the assumed interpretation and language typing.

int: enc(X) is the big-endian two's complement encoding of X, padded on the higher-order (left) side with 0xff for negative X and with zero bytes for positive X such that the length is a multiple of 32 bytes.

Padding the 20 bytes token address to 32 bytes with 0 to token holder address:

0000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7

Then concat the function selector and encoded parameter, we get data parameter:

0x70a082310000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7

Make the request with:

curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to": "0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0", "data":"0x70a082310000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7"}, "latest"],"id":67}' -H "Content-Type: application/json" http://127.0.0.1:8545/

here is the curl result (You may get different answer here, as there may be some transaction with this address done after my polling the request)

{"jsonrpc":"2.0","id":67,"result":"0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800"}

You can change convert hex format balance to decimal

>>> 0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800

6090978215900000000000

Check the result,

enter image description here

Welcome to Intellipaat Community. Get your technical queries answered by top developers!

30.5k questions

32.5k answers

500 comments

108k users

Browse Categories

...