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

# rwa_multichain.tokens

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

export const PremiumDatasetAccessCard = ({href = "https://dune.com/enterprise#contact-form"}) => <Card title="Premium dataset access" icon="info" href={href}>
    This dataset is part of a premium offering and requires additional access. Contact the Dune enterprise team to request access.
  </Card>;

`rwa_multichain.tokens` is the dimension table for every tokenized RWA Dune tracks. Grain: one row per token per chain, keyed on `(blockchain, token_standard, token_id)`. It currently holds 5,194 rows covering 4,721 distinct tokens across 19 chains.

<PremiumDatasetAccessCard />

## Why token\_id exists

Each chain identifies a token differently: EVM uses 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 keeps all of those in their native columns *and* normalizes them into a single `VARCHAR` `token_id`. Join on `(blockchain, token_id)` and one query works across all 19 chains — that key resolves every row in `balances` and `transfers`.

## 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`, `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                                               |
| `contract_address`   | `VARBINARY` | Native EVM contract address. `NULL` for non-EVM assets                                                                    |
| `token_mint_address` | `VARCHAR`   | Native Solana token mint address. `NULL` for non-Solana assets                                                            |
| `asset_type`         | `VARCHAR`   | Native Aptos asset type. `NULL` for non-Aptos assets                                                                      |
| `coin_type`          | `VARCHAR`   | Native Sui coin type. `NULL` for non-Sui assets                                                                           |
| `xrpl_asset_id`      | `VARCHAR`   | Native XRPL asset identifier. `NULL` for non-XRPL assets                                                                  |
| `stellar_identifier` | `VARCHAR`   | Native Stellar asset identifier. `NULL` for non-Stellar assets                                                            |
| `currency`           | `VARCHAR`   | Native currency code from the canonical token-list model                                                                  |

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

## Asset class and issuer

This table is an identity registry, not a classification table. It does not carry `asset_class`, `asset_type`, or `issuer_name` — those live in [`token_metadata`](/data-catalog/curated/rwa/registry/token-metadata) alongside the legal and regulatory attributes of the product, and join on `(blockchain, token_id)`. Join the two 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 b
JOIN rwa_multichain.tokens 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
```
