> ## 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_reference_data

> Token-grain RWA reference data — token-list class and issuer, plus legal product fields when the token is registered.

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_reference_data` is the classification table for every token in [`rwa_multichain.tokens`](/data-catalog/curated/rwa/registry/tokens). Grain: one row per token per chain, keyed on `(blockchain, token_standard, token_id)`.

<PremiumDatasetAccessCard />

## Why it is separate from `tokens`

`tokens` answers "does this token exist and what is its identifier". `tokens_reference_data` answers "what kind of asset is it, who issued it, and which product does it map to". Tokens without an associated product remain available with `product_id` null.

A product and a token are not the same thing. One product — say Franklin Templeton's BENJI fund — has a row per chain it is deployed on, and the product-level columns repeat identically across those rows. Deduplicate on `product_id` when you are counting products rather than deployments. For the product catalog itself, use [`product_reference_data`](/data-catalog/curated/rwa/registry/product-reference-data).

## Join keys

| Join to                                               | Key                      | Notes                                                      |
| ----------------------------------------------------- | ------------------------ | ---------------------------------------------------------- |
| `tokens`, `transfers`, `balances`, `supply`, `prices` | `(blockchain, token_id)` | Default activity join                                      |
| `balances_enriched`                                   | `token_product_id`       | `concat(blockchain, '\|', token_standard, '\|', token_id)` |
| `product_reference_data`                              | `product_id`             | Null for unregistered tokens                               |

Do **not** join `balances_enriched` on `product_id`. One product has many chain tokens, so that join fans out.

## Two class vocabularies

| Column                | Vocab            | Shape                                                                                                                |
| --------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------- |
| `asset_class`         | Token-list       | Title-case, e.g. `Equities`, `Credit`, `Commodities`                                                                 |
| `product_asset_class` | Product taxonomy | Snake-case, shared with Hyperliquid: `equities`, `credit`, `fixed_income`, `cash_equivalent`, `commodities`, `fx`, … |

`issuer` is the token-list label. `issuer_name` is the legal issuer from product metadata. They are not interchangeable.

Token-list `asset_class` values: `Active Strategies`, `AI & Compute Infrastructure`, `Carbon Credits`, `Collectibles & Luxury Goods`, `Commodities`, `Credit`, `Equities`, `Fixed Income`, `Multi-Asset RWAs`, `Private Equity & Venture`, `Real Estate`, `Tokenized Stocks`, `Venture Capital`.

Legal `product_asset_class` values: `credit`, `fixed_income`, `cash_equivalent`, `equities`, `multi_asset`, `commodities`, `real_estate`, `fx`, `other`. Use that vocab when comparing tokenized exposure to [`rwa_hyperliquid.markets`](/data-catalog/curated/rwa/registry/hyperliquid-markets).

## Table schema

**Token identity**

| Column              | Type      | Description                                                                              |
| ------------------- | --------- | ---------------------------------------------------------------------------------------- |
| `blockchain`        | `VARCHAR` | Chain the token instance lives on                                                        |
| `token_standard`    | `VARCHAR` | `erc20`, `spl`, `aptos_asset`, `sui_coin`, `xrpl_asset`, `stellar_asset`                 |
| `token_id`          | `VARCHAR` | Normalized token identifier. Join key to `tokens`, `balances`, `transfers`, and `supply` |
| `token_product_id`  | `VARCHAR` | `blockchain\|token_standard\|token_id`. Join key to `balances_enriched`                  |
| `symbol`            | `VARCHAR` | Display symbol                                                                           |
| `asset`             | `VARCHAR` | Human-readable asset name                                                                |
| `asset_class`       | `VARCHAR` | Token-list taxonomy (title-case)                                                         |
| `asset_subclass`    | `VARCHAR` | Finer token-list class when it is more granular than `asset_class`                       |
| `issuer`            | `VARCHAR` | Token-list issuer label. For XRPL this is `asset_issuer`, not the on-chain account       |
| `balance_semantics` | `VARCHAR` | Balance behavior: `standard` or `indexed`. Populated for EVM tokens                      |

**Product attach** (null when `product_id` is null)

| Column                                        | Type      | Description                                                     |
| --------------------------------------------- | --------- | --------------------------------------------------------------- |
| `product_id`                                  | `VARCHAR` | Registry product identifier                                     |
| `product_name`                                | `VARCHAR` | Legal/product name                                              |
| `issuer_id` / `issuer_name`                   | `VARCHAR` | Legal issuing entity                                            |
| `platform_id` / `platform_name`               | `VARCHAR` | Tokenization or distribution platform                           |
| `product_asset_class`                         | `VARCHAR` | Product asset class                                             |
| `asset_type`                                  | `VARCHAR` | Product subtype, e.g. `money_market_fund`, `equities_synthetic` |
| `underlying_asset`                            | `VARCHAR` | What backs the token                                            |
| `underlying_ticker` / `underlying_exchange`   | `VARCHAR` | Independent market ticker and venue                             |
| `denomination_currency`                       | `VARCHAR` | ISO 4217 currency of account                                    |
| `transfer_restriction`                        | `VARCHAR` | `NONE`, `ALLOWLIST`, `PLATFORM_INTERNAL`, `NON_TRANSFERABLE`    |
| `acquisition_access`                          | `VARCHAR` | `PERMISSIONLESS`, `KYC_ONBOARDING`, `PLATFORM_ACCOUNT_ONLY`     |
| `transfer_model`                              | `VARCHAR` | Free-text detail behind the two columns above                   |
| `product_status`                              | `VARCHAR` | Lifecycle state                                                 |
| `issuance_date`                               | `VARCHAR` | Product issuance date where known                               |
| `jurisdiction_country` / `jurisdiction_iso2`  | `VARCHAR` | Domicile of the issuing legal entity                            |
| `legal_wrapper_type`                          | `VARCHAR` | Legal form of the wrapper                                       |
| `asset_manager_entity`                        | `VARCHAR` | Portfolio manager when distinct from the issuer                 |
| `custodian_entity`                            | `VARCHAR` | Institution holding the underlying                              |
| `transfer_agent_entity`                       | `VARCHAR` | Appointed transfer agent                                        |
| `regulatory_framework` / `regulator`          | `VARCHAR` | Offering regime and supervising authority                       |
| `issuer_entity` / `issuer_lei` / `issuer_cik` | `VARCHAR` | Exact legal registrant and identifiers                          |
| `eligible_investors`                          | `VARCHAR` | Investor class permitted to hold the product                    |
| `redemption_mechanism`                        | `VARCHAR` | `INSTANT_ONCHAIN`, `T_PLUS_N_OFFCHAIN`, `SECONDARY_MARKET_ONLY` |
| `last_updated`                                | `DATE`    | Date another cell on the product row last changed               |

## Do not join on symbol

Token symbols are not a safe product key. The same product carries different tickers across access channels, unrelated products share tickers, and scam tokens squat real tickers on other chains. Join on `(blockchain, token_id)` or `token_product_id`, never on `symbol` or `underlying_ticker`.

## Example queries

**AUM, holders, and product count by legal asset class:**

```sql theme={null}
SELECT
  r.product_asset_class,
  COUNT(DISTINCT r.product_id) AS products,
  COUNT(DISTINCT b.address) AS holders,
  SUM(b.balance_usd) AS aum_usd
FROM rwa_multichain.balances AS b
INNER JOIN rwa_multichain.tokens_reference_data AS r
  ON r.blockchain = b.blockchain
  AND r.token_id = b.token_id
WHERE b.day = CURRENT_DATE - INTERVAL '1' DAY
  AND b.balance > 0
GROUP BY 1
ORDER BY 4 DESC NULLS LAST
```

**Join enriched balances on `token_product_id`:**

```sql theme={null}
SELECT
  r.product_name,
  r.issuer_name,
  e.address_category,
  SUM(e.balance_usd) AS balance_usd
FROM rwa_multichain.balances_enriched AS e
INNER JOIN rwa_multichain.tokens_reference_data AS r
  ON r.token_product_id = e.token_product_id
WHERE e.day = CURRENT_DATE - INTERVAL '1' DAY
  AND e.balance > 0
GROUP BY 1, 2, 3
ORDER BY 4 DESC NULLS LAST
LIMIT 50
```
