> ## 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 identity with attached product classification, legal, and operational metadata.

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 reference 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` adds the issuer label, balance behavior, and every public field from `product_reference_data`. Tokens without an associated product remain available with `product_id` and the attached product fields 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` | Use when you need one row per product instead of one row per token |

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

## Product classification

`asset_class` and `asset_type` are the canonical product classification fields. They are sourced from [`product_reference_data`](/data-catalog/curated/rwa/registry/product-reference-data) and mirrored here for token-grain queries. Tokens with a null `product_id` have null product fields.

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

## Table schema

**Token identity**

| Column | Type | Description |
| - | - | - |
| `blockchain` | `VARCHAR` | Chain the token instance lives on |
| `token_standard` | `VARCHAR` | `erc20`, `tip20`, `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 |
| `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 |
| `asset_class` | `VARCHAR` | Canonical product asset class |
| `asset_type` | `VARCHAR` | Canonical product subtype |
| `underlying_asset` | `VARCHAR` | What backs the token |
| `underlying_ticker` / `underlying_exchange` | `VARCHAR` | Independent market ticker and venue |
| `iex_blocked` | `BOOLEAN` | Whether IEX pricing is disabled while the product needs human review |
| `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 |
| `deployments` | `ARRAY(ROW("chain" VARCHAR, "token_address" VARCHAR))` | All registered chain deployments for the attached product |

## 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.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
```


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