> ## Documentation Index
> Fetch the complete documentation index at: https://tokenterminal.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To query the Token Terminal data catalog, read https://tokenterminal.com/docs/catalog/agents-manual.md first. It is the whole catalog as one page: table naming grammar, key columns, partition and cluster rules, units, additivity, and the tables that are documented but not served yet.
> Never query a catalog table on a time bound alone. Also filter its cluster key, which you read from INFORMATION_SCHEMA.COLUMNS; an empty result means the object is a view, whose pruning contract is on its page. Compute is billed to the caller's own Google Cloud project.

# Transfers

> Every stablecoin transfer, mint and burn.

One row per stablecoin movement: a transfer, a mint or a burn of one deployment, at the moment it happened onchain. `amount_raw` is the movement in the token's smallest unit; divide by `10^decimals` from [`dimensions.tokens`](https://tokenterminal.com/docs/catalog/tokens/registry) for a token amount.

## Columns

<table>
  <thead>
    <tr>
      <th width="230">Column</th>
      <th width="120">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`partition_key`</td><td>`TIMESTAMP`</td><td>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`.</td></tr>
    <tr><td>`block_timestamp`</td><td>`TIMESTAMP`</td><td>When the block was produced.</td></tr>
    <tr><td>`block_number`</td><td>`INT64`</td><td>Block height, or the slot on Solana.</td></tr>
    <tr><td>`transaction_hash`</td><td>`STRING`</td><td>Transaction the movement belongs to. Null on `hydradx`, where a transfer can be emitted by a block hook rather than by a transaction.</td></tr>
    <tr><td>`transaction_index`</td><td>`INT64`</td><td>Position of the transaction in its block. Solana only.</td></tr>
    <tr><td>`outer_event_index`</td><td>`INT64`</td><td>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.</td></tr>
    <tr><td>`event_index`</td><td>`INT64`</td><td>Position within the transaction: the log index, or the instruction index on Solana.</td></tr>
    <tr><td>`chain_id`</td><td>`STRING`</td><td>Chain the movement happened on.</td></tr>
    <tr><td>`token_type`</td><td>`STRING`</td><td>Token standard: `erc20`, `spl` or `trc20`.</td></tr>
    <tr><td>`token_id`</td><td>`STRING`</td><td>Join key to [`dimensions.tokens`](https://tokenterminal.com/docs/catalog/tokens/registry) and to [`dimensions.asset_tokens`](https://tokenterminal.com/docs/catalog/assets/registry), which is what names the stablecoin.</td></tr>
    <tr><td>`token_address`</td><td>`STRING`</td><td>The token. Filter on this. Null on the Solana transfers whose token account the upstream decode could not resolve, which also leaves `token_id` null.</td></tr>
    <tr><td>`event_type`</td><td>`STRING`</td><td>`transfer`, `mint` or `burn`.</td></tr>
    <tr><td>`from_address`</td><td>`STRING`</td><td>Account debited. Null on a mint.</td></tr>
    <tr><td>`to_address`</td><td>`STRING`</td><td>Account credited. Null on a burn.</td></tr>
    <tr><td>`to_owner`</td><td>`STRING`</td><td>Holder behind `to_address`. Solana transfers only: null on exactly the rows where `token_address` is, and always null on mints and burns.</td></tr>
    <tr><td>`authority_address`</td><td>`STRING`</td><td>Account that authorised the instruction. Solana only.</td></tr>
    <tr><td>`transaction_signer`</td><td>`STRING`</td><td>Signer of the enclosing transaction. Solana only.</td></tr>
    <tr><td>`executing_account`</td><td>`STRING`</td><td>Program that executed the instruction. Solana only.</td></tr>
    <tr><td>`amount_raw`</td><td>`STRING`</td><td>Amount in the token's smallest unit, as a decimal string, because a uint256 exceeds every BigQuery numeric type. Divide by `10^decimals`.</td></tr>
    <tr><td>`surrogate_key`</td><td>`BYTES`</td><td>Row identity, a 128-bit hash of the columns that define the grain. Stable across rebuilds; nothing else needs it.</td></tr>
  </tbody>
</table>

## Sample queries

> [!WARNING]
>
> This table is large and split by day. Bound `block_timestamp` and filter `chain_id` on every query, or you read the whole table and the whole table is billed to you.

**One stablecoin, one day**

Joining `dimensions.asset_tokens` on `token_id` is what keeps the stablecoin rows, and the same join names the asset. The table is clustered on `token_address` then `chain_id`, and naming the pair reads less than the address alone.

```sql theme={null}
select
    transfers.block_timestamp,
    transfers.transaction_hash,
    transfers.from_address,
    transfers.to_address,
    cast(transfers.amount_raw as bignumeric) / pow(10, tokens.decimals) as amount
from `facts_tokens.transfers` as transfers
join `dimensions.asset_tokens` as deployments
    using (token_id)
join `dimensions.tokens` as tokens
    on tokens.token_id = transfers.token_id
where deployments.asset_id = 'usdc'
  and transfers.chain_id = 'ethereum'
  and transfers.block_timestamp >= timestamp('2026-08-01')
  and transfers.block_timestamp < timestamp('2026-08-02')
limit 100
```

**Largest native movements**

`bridged_status` keeps the natively issued deployments, the side that answers a question about the issuer.

```sql theme={null}
select
    assets.symbol,
    transfers.block_timestamp,
    transfers.transaction_hash,
    cast(transfers.amount_raw as bignumeric) / pow(10, tokens.decimals) as amount
from `facts_tokens.transfers` as transfers
join `dimensions.asset_tokens` as deployments
    using (token_id)
join `dimensions.assets` as assets
    on assets.asset_id = deployments.asset_id
join `dimensions.tokens` as tokens
    on tokens.token_id = transfers.token_id
where assets.asset_type = 'stablecoin'
  and deployments.bridged_status = 'native'
  and transfers.chain_id = 'ethereum'
  and transfers.block_timestamp >= timestamp('2026-08-01')
  and transfers.block_timestamp < timestamp('2026-08-08')
order by amount desc
limit 20
```

**Issuance in a window**

`event_type` separates the three movements, and a mint leaves `from_address` empty and a burn `to_address`. The daily totals behind the same events are `mints` and `redemptions` on [Metrics](https://tokenterminal.com/docs/catalog/stablecoins/metrics.md).

```sql theme={null}
select
    transfers.event_type,
    count(*) as movements,
    sum(cast(transfers.amount_raw as bignumeric) / pow(10, tokens.decimals)) as amount
from `facts_tokens.transfers` as transfers
join `dimensions.asset_tokens` as deployments
    using (token_id)
join `dimensions.tokens` as tokens
    on tokens.token_id = transfers.token_id
where deployments.asset_id = 'usdc'
  and transfers.chain_id = 'ethereum'
  and transfers.event_type in ('mint', 'burn')
  and transfers.block_timestamp >= timestamp('2026-08-01')
  and transfers.block_timestamp < timestamp('2026-08-08')
group by transfers.event_type
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.