Skip to main content
One row per fungible token movement: 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 it by 10^decimals from dimensions.tokens to read whole tokens.

Columns

ColumnTypeDescription
partition_keyTIMESTAMPThe month the row belongs to, as its first instant. The table is partitioned on it, so bound it alongside block_timestamp.
block_timestampTIMESTAMPTime of the block containing the movement.
block_numberINT64Block height, or the slot on Solana.
transaction_hashSTRINGTransaction the movement belongs to. Null on hydradx, where a transfer can be emitted by a block hook rather than by a transaction.
transaction_indexINT64Position of the transaction in its block. Solana only: a decoded Transfer event on the log-shaped chains is the log, and the transaction around it lives in that chain’s own transaction table.
outer_event_indexINT64Enclosing instruction position on Solana. A log has one position and an instruction has two, so this is null on the log-shaped chains, and null on a top-level Solana instruction, which has nothing enclosing it.
event_indexINT64Position within the transaction: the log index, or the instruction index on Solana.
chain_idSTRINGChain the movement happened on.
token_typeSTRINGToken standard: erc20, spl or trc20.
token_idSTRINGJoin key to dimensions.tokens and the asset tables, which are laid out on it: {token_address}-{chain_id}.
token_addressSTRINGThe token, and the leading cluster key: filter on this with chain_id to read one token, and on this alone to read the address across every chain in one pass. erc20 addresses are stored lowercase and every other standard as the chain writes it, spl and trc20 being base58. Null on the Solana transfers whose token account the upstream decode could not resolve, which leaves token_id null with it.
event_typeSTRINGtransfer, mint or burn. Solana’s token program names it; on the log-shaped chains it is read from the EIP-20 zero address, so a burn sent to some other dead address reads as transfer.
from_addressSTRINGAccount debited: a wallet on the log-shaped chains, an SPL token account on Solana. Null on a mint.
to_addressSTRINGAccount credited: a wallet on the log-shaped chains, an SPL token account on Solana. Null on a burn.
to_ownerSTRINGHolder behind to_address, on Solana transfers, where one wallet can own several token accounts. On the log-shaped chains to_address is already the holder. Null on exactly the rows where token_address is null, since one upstream decode resolves a token account to both its mint and its owner, and null on Solana mints and burns, whose upstream tables hold no owner column.
authority_addressSTRINGAccount that authorised the instruction. Solana only.
transaction_signerSTRINGSigner of the enclosing transaction. Solana only.
executing_accountSTRINGProgram that executed the instruction. Solana only.
amount_rawSTRINGAmount in the token’s smallest unit, as a decimal string, because a uint256 exceeds every BigQuery numeric type. Divide by 10^decimals.
surrogate_keyBYTESRow 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. Bound partition_key and filter chain_id on every query, or you read the whole table and the whole table is billed to you.
token_address and chain_id are the cluster keys and partition_key names the month, so the three together read only the blocks this token occupies. Cast amount_raw to BIGNUMERIC and divide by 10^decimals from dimensions.tokens for whole tokens.