> ## Documentation Index
> Fetch the complete documentation index at: https://dune-automated-update-duneapi-openapi-files.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# rwa_multichain.tokens

> Canonical registry of tokenized real-world assets across 21 chains, with a normalized token_id for cross-chain joins.

export const PremiumDatasetAccessCard = ({href = "https://dune.com/enterprise#contact-form", note = null}) => <Card title="Gated dataset" icon="lock" href={href}>
    Querying this dataset requires an entitlement on your workspace. See <a href="/data-catalog/overview#access-tiers-public-vs-gated-datasets">access tiers</a>, or contact the Dune team to enable access.
    {note && <><br /><br />{note}</>}
  </Card>;

`rwa_multichain.tokens` is the identity table for every tokenized RWA Dune tracks. Grain: one row per token per chain, keyed on `(blockchain, token_standard, token_id)`. Native identifiers are already stored in `token_id`; there are no separate `contract_address` / `token_mint_address` columns on this view.

<PremiumDatasetAccessCard />

## Why token\_id exists

Each chain identifies a token differently: EVM-compatible chains use a contract address, Solana a mint address, Aptos an asset type, Sui a coin type, and XRPL and Stellar their own asset identifiers. This table normalizes all of those into a single `VARCHAR` `token_id`. Join on `(blockchain, token_id)` and one query works across all 21 chains. That key resolves every row in `balances`, `transfers`, and `supply`.

## Table schema

| Column              | Type      | Description                                                                                                                        |
| ------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `blockchain`        | `VARCHAR` | Chain for the native token identifier                                                                                              |
| `token_standard`    | `VARCHAR` | Native token standard or asset namespace. One of `erc20`, `tip20`, `spl`, `aptos_asset`, `sui_coin`, `xrpl_asset`, `stellar_asset` |
| `token_id`          | `VARCHAR` | Normalized token identifier for cross-chain joins. Use this as the join key                                                        |
| `currency`          | `VARCHAR` | Native currency code from the canonical token-list model                                                                           |
| `balance_semantics` | `VARCHAR` | Balance behavior for the token: `standard` or `indexed`                                                                            |

<Note>
  `token_standard` here uses coarse namespaces. The `transfers` table uses finer-grained values (`bep20`, `tip20`, `spl_token`, `spl_token_2022`, `classic`, `soroban`, `issued`), so do not join the two tables on `token_standard`. Use `(blockchain, token_id)`.
</Note>

`balance_semantics = 'indexed'` identifies rebasing or indexed-share tokens. The curated [`balances`](/data-catalog/curated/rwa/holders-supply/balances) table applies the correct semantics for each token.

## Tempo coverage

Tempo is EVM-compatible, but its tokens use TIP-20. Tempo rows therefore use `token_standard = 'tip20'` and must not be interpreted as ERC-20 deployments.

The canonical Tempo RWA deployments in this registry are:

* BUIDL: `0xb5ff12bd8010baef823d1bfa2ce6bdc0109cbb24`
* BRSRV: `0xe36e2e79beb1b7f618201eead6106a7d737695e3`
* syrupUSDC: `0x20c0000000000000000000008191667423f70e67`

BRSRV is canonical and remains in the registry even when no supply is outstanding.

Two other Tempo deployments are intentionally excluded from RWA coverage. sUSDe (`0x20c000000000000000000000bd95bfb69fbe6ce3`) is excluded because it is classified as a stablecoin and yield-bearing asset; this does not imply that sUSDe is absent from RWA coverage on other chains. The non-canonical syrupUSDC deployment (`0x20c000000000000000000000c4ba4256aa07ce38`) is also excluded. It recorded five historical transfers from 2026-04-28 through 2026-05-01.

## Asset class and issuer

This table is an identity registry, not a classification table. It does not carry `asset_class` or `issuer`. Those live in [`tokens_reference_data`](/data-catalog/curated/rwa/registry/tokens-reference-data) (token grain) and [`product_reference_data`](/data-catalog/curated/rwa/registry/product-reference-data) (product grain). Join `tokens_reference_data` on `(blockchain, token_id)` whenever you need to slice by asset class or attribute activity to an issuer.

## Example query

```sql theme={null}
-- Token coverage by chain and standard
SELECT
  blockchain,
  token_standard,
  COUNT(DISTINCT token_id) AS tokens
FROM rwa_multichain.tokens
GROUP BY 1, 2
ORDER BY 3 DESC
```

**Resolve holder balances to the registry:**

```sql theme={null}
SELECT
  t.blockchain,
  t.token_standard,
  b.token_symbol,
  COUNT(DISTINCT b.address) AS holders
FROM rwa_multichain.balances AS b
INNER JOIN rwa_multichain.tokens AS t
  ON t.blockchain = b.blockchain
  AND t.token_id = b.token_id
WHERE b.day = CURRENT_DATE - INTERVAL '1' DAY
  AND b.balance > 0
GROUP BY 1, 2, 3
ORDER BY 4 DESC
LIMIT 50
```
