Get balance of ERC-20 from address - RPC call

Tatum provides you access to the blockchain via RPC.

Here's a guide on how to retrieve the token balance of an ERC-20 token from a blockchain address via RPC call.

Steps

  1. Fetch the Smart Contract Address.
    • For example USDC over ETH: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
  2. Fetch the Wallet Address from which you want to retrieve the token balance
    • For example: 0xCD531Ae9EFCCE479654c4926dec5F6209531Ca7b
  3. Make an RPC call with the method eth_call, where:
    • "to" is the ContractAddress for USDC
    • "data" has three parts:
      • Method ID: 70a08231 - This is the 4-byte function selector for ABI balanceOf(address).
      • Padding: "000000000000000000000000"
      • Wallet Address: CD531Ae9EFCCE479654c4926dec5F6209531Ca7b - The address to query the balance for, padded to 32 bytes (64 characters) CD531Ae9EFCCE479654c4926dec5F6209531Ca7b
      • The full data field will be: "0x70a08231" + "000000000000000000000000" + "CD531Ae9EFCCE479654c4926dec5F6209531Ca7b"
curl --location 'https://api.tatum.io/v3/blockchain/node/ethereum-mainnet/' \
--header 'Content-Type: application/json' \
--header 'x-api-key: ••••••' \
--data '{
    "jsonrpc":"2.0",
    "method":"eth_call",
    "params":[
      {
        "to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "data": "0x70a08231000000000000000000000000CD531Ae9EFCCE479654c4926dec5F6209531Ca7b"
      },
      "latest"
    ],
    "id":1
  }'
//response:
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x0000000000000000000000000000000000000000000000000000000000f4240"
}
  1. Interpret and convert the response.

    1. The "result" field is the balance in hexadecimal (Wei).
    2. Convert the result in hex to decimal and adjust for the token's decimals (USDC uses 6 decimals).
    3. Code example:
    # Example response balance in hexadecimal
    balance_hex = "0x0000000000000000000000000000000000000000000000000000000000f4240"
    
    # Convert hexadecimal to integer
    balance_wei = int(balance_hex, 16)
    
    # USDC uses 6 decimals
    decimals = 6
    
    # Convert to human-readable format
    balance_human_readable = balance_wei / (10 ** decimals)
    
    print(balance_human_readable)
    

Good to know

  • Depending on the Smart Contract code, the method to fetch the balance may vary.
  • Tatum staff generally does not troubleshoot RPC requests, unless there's an error explicitly related to our infrastructure.