Skip to main content
Dune provides curated token balance tables for portfolio analysis, holder distribution, treasury tracking, and wallet activity across EVM networks.
Maintained by: Dune · Refresh: hourly · Token standards: native, ERC20

Get This Data

Access balance data via API, Datashare, or the Dune App.

Available Datasets

Latest Balances

Most recent balance per (address, token) with USD value

Daily Balance Updates

Sparse validity-interval table for historical balance reconstruction. The default for time-series analysis.

Balance Updates

Per-block balance changes

Choosing a Table

QuestionUse
What does this wallet hold right now?balances_<chain>.latest
What did this wallet hold on day X? Over the last N days?balances_<chain>.daily_updates
Exactly when did the balance change?balances_<chain>.updates
For most historical analysis, balances_<chain>.daily_updates is the right default. It trades off granularity for query speed and includes USD values. Drop down to balances_<chain>.updates only when you need block-level resolution. balances_<chain>.daily_updates is sparse: it stores one row per balance change with a validity interval [valid_from, valid_to), not one row per day per pair. The interval layout means you can reconstruct the balance for any (address, token) on any past day by joining a calendar table or expanding the interval. See the page’s usage notes for the recommended filter pattern and address_prefix partition key.

Cross-chain

The tables are per-chain. For a wallet’s portfolio across chains, UNION ALL per-chain totals from balances_<chain>.latest:
SELECT 'ethereum' AS chain, sum(balance_usd) AS total_usd
FROM balances_ethereum.latest
WHERE address = 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
UNION ALL
SELECT 'arbitrum', sum(balance_usd)
FROM balances_arbitrum.latest
WHERE address = 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
UNION ALL
SELECT 'optimism', sum(balance_usd)
FROM balances_optimism.latest
WHERE address = 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
UNION ALL
SELECT 'base', sum(balance_usd)
FROM balances_base.latest
WHERE address = 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
ORDER BY total_usd DESC NULLS LAST

Coverage

arbitrum, avalanche_c, base, bnb, ethereum, flare, gnosis, hyperevm, ink, linea, mantle, monad, optimism, plasma, polygon, sei, sonic, unichain, worldchain, zksync. Token standards: native and erc20. NFT balances (ERC721/ERC1155) are not included. Native tokens use the standardized contract address from dune.blockchains for that chain (zero address on most EVMs, 0x0000…1010 on Polygon).

Methodology

Balances are read directly from chain state at the blocks where activity is observed, rather than being accumulated from transfer events. Between observed activity, the most recent value is carried forward. Balance changes that occur without surfacing any tracked activity (for example, a rebase that emits no Transfer) are not detected until the next surfacing event. balances_<chain>.daily_updates and balances_<chain>.latest include balance_usd joined from prices.day and prices.latest respectively. balances_<chain>.updates is intentionally unpriced. See its docs for how to attach a price that fits your analysis.
  • tokens.transfers for token transfer events
  • prices.day / prices.latest for token prices
  • tokens_<chain>.erc20 for ERC20 metadata (name, symbol, decimals)

Enterprise Data Solutions

Need custom balance datasets or dedicated support? Talk to our enterprise team.

Build Custom Models

Build private balance tracking pipelines with the dbt Connector.