One row per fungible token movement in facts_tokens.transfers: a transfer, a mint or a burn, on every chain we decode. amount_raw is the amount in the token’s smallest unit, so divide by 10^decimals from dimensions.tokens to read whole tokens.
Coverage
Every chain we cover token transfers on.
acalaalephzeroevmalgorandaptosarbitrumastaravalanchebaseberachainblastbobbobanetworkbsccardanocelestiacelocentrifugechainflipcosmoshubdydxethereumfantomflowflowevmfraxtalgnosisgravityalphahederahydradxhydradxevmhyperevmimmutablezkevminjectiveinjectiveevminkinterlayiotexkatananetworklineamantamantaatlanticmantramantrachainmantraevmmegaethmonadmoonbeammovementnearneurowebnobleopbnboptimismosmosispeaqphalaplasmapolimecpolkadexpolkadotassethubpolygonripplerobinhoodchainroninrootstockscrollseiseievmsolanasonicstacksstarknetstellarsuitempotontronunichainvictionworldchainxaixdcxlayerzksyncera
Columns
| Column | Type | Description |
|---|
partition_key | TIMESTAMP | The month the row belongs to. The table is partitioned on it, so a date filter is cheapest when it names this alongside block_timestamp. |
block_timestamp | TIMESTAMP | When the block was produced. |
block_number | INT64 | Block height, or the slot on Solana. |
transaction_hash | STRING | Transaction the movement belongs to. Null on hydradx, where a transfer can be emitted by a block hook instead of by a transaction. |
transaction_index | INT64 | Position of the transaction in its block. Solana only. |
outer_event_index | INT64 | Enclosing instruction position on Solana. Null on the log-shaped chains, which have one nesting level, and null on Solana wherever the instruction is top level and has nothing enclosing it. |
event_index | INT64 | Position within the transaction: the log index, or the instruction index on Solana. |
chain_id | STRING | Chain the movement happened on. |
token_type | STRING | Token standard: erc20, spl or trc20. |
token_id | STRING | Join key to dimensions.tokens. |
token_address | STRING | The token. Filter on this. Null on the Solana transfers whose token account the upstream decode could not resolve, which leaves token_id null on the same rows. |
event_type | STRING | transfer, mint or burn. |
from_address | STRING | Account debited. Null on a mint. |
to_address | STRING | Account credited. Null on a burn. |
to_owner | STRING | Holder behind to_address. Solana transfers only: null on exactly the rows where token_address is, and always null on mints and burns. |
authority_address | STRING | Account that authorised the instruction. Solana only. |
transaction_signer | STRING | Signer of the enclosing transaction. Solana only. |
executing_account | STRING | Program that executed the instruction. Solana only. |
amount_raw | STRING | Amount in the token’s smallest unit, as a decimal string, because a uint256 exceeds every BigQuery numeric type. Divide by 10^decimals. |
surrogate_key | BYTES | Row identity, a 128-bit hash of the columns that define the grain. Stable across rebuilds; compare it with from_hex. |
Sample queries
This table is large and split by month on partition_key. Bound block_timestamp and filter chain_id on every query, or you read the whole table and the whole table is billed to you.
dimensions.asset_tokens turns one asset into its deployments, and dimensions.tokens has the decimals that turn amount_raw into whole tokens.The fact has token amounts, so USD comes from a join to metrics_tokens.price_daily on token_id and the day the transfer falls in. from_address and chain_id together identify the sender, because the same address on two chains is two accounts.