---
title: Check a VERI balance
description: Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
url: https://veri.how/veri/check-balance
area: veri
kind: howto
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
  - id: eip155:1:0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
    name: Veritaseum
    verified:
      date: 2026-10-13
sources:
  - title: VERI verified source, Etherscan
    url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code
  - title: "EIP-20: Token Standard"
    url: https://eips.ethereum.org/EIPS/eip-20
  - title: Ethereum JSON-RPC, eth_call
    url: https://ethereum.org/developers/docs/apis/json-rpc/#eth-call
---

# Check a VERI balance

Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.

## Facts

| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |

You need an address to look up and `curl`. The example uses the contract owner, 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE; replace it with the address you want.

## 1. Build the calldata

`balanceOf(address)` has the selector `0x70a08231`. Append the address, without its `0x`, left-padded with zeros to 32 bytes (64 hex characters), as the [ABI specification](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector-and-argument-encoding) describes:

```
0x70a08231
  000000000000000000000000
  82c48875c17ee5812f909a9d75c0f64f7a8719fe
```

Joined: `0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe`. Case doesn't matter in calldata.

With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command builds it for you, and the later steps show `cast` doing the call and the conversion too:

```sh
# 0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe
cast calldata 'balanceOf(address)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
```

## 2. Call the contract

Send an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Ethereum JSON-RPC endpoint. Either of these works without a key:

```sh
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe"},"latest"]}'

curl -s https://eth.drpc.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe"},"latest"]}'
```

The answer is one 32-byte word in `result`, for example `"result":"0x0000000000000000000000000000000000000000000000001ae18cdf42a3beab"`.

```sh
export ETH_RPC_URL=https://ethereum-rpc.publicnode.com

# 1936984205269647019 [1.936e18], the same word decoded as a number
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
```

## 3. Convert to VERI

The word is the balance in base units. VERI has 18 decimals, so divide by 10^18:

```sh
python3 -c 'print(int("0x0000000000000000000000000000000000000000000000001ae18cdf42a3beab", 16) / 10**18)'
# 1.936984205269647
```

```sh
# 1.936984205269647019
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE | xargs cast from-wei
```

A result of `0x0000…0000` means the address holds no VERI.

## On Etherscan

Etherscan's Read Contract view runs `balanceOf` from the verified source, so the same three steps work in a browser:

1. Open the [contract page](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#readContract), choose the **Contract** tab, then **Read Contract**. Functions that take no input, such as `decimals` and `totalSupply`, show their value at once.
2. Open `balanceOf`, paste the address into the `_owner` field and press **Query**.
3. The result is labelled `uint256` and is the balance in base units, the same number `curl` returns in hex. Divide it by 10^18 for VERI.

The [token page](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) shows the balance already divided once you paste the address into the holder filter. Blockscout lists VERI with the other tokens on the address page, `https://eth.blockscout.com/address/<address>?tab=tokens`.

## Why not sum the Transfer logs

The VERI contract changed balances twice without emitting a `Transfer`: when it allocated the whole supply to the deployer, and when `transferOwnership` moved all of it to the current owner. A balance rebuilt from logs alone starts from zero for those addresses and is wrong for everything downstream. `balanceOf` reads the contract's own storage and is always right. See [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md).

## For agents and tools

The committed [ABI](https://veri.how/abi/veri.json) decodes `balanceOf` and the other calls; `decimals()` returns `uint256` in it, not `uint8`. [/tokenlist.json](https://veri.how/tokenlist.json) and [/facts.json](https://veri.how/facts.json) carry the address and decimals; the [data files](https://veri.how/data.md) page lists every file. A historical balance (`"latest"` replaced by a block number in hex, or `--block <number>` with `cast`) needs an archive node; `https://eth.drpc.org` serves those without a key.

## Sources

1. [VERI verified source, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)
2. [EIP-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20)
3. [Ethereum JSON-RPC, eth_call](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call)

## Related

- [VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://veri.how/veri/contract.md): VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
- [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md): The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
- [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md): VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
