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

> Product reference data for every tracked RWA token — asset class, issuer, platform, legal wrapper, custodian, regulator, and investor eligibility.

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.token_metadata` describes the real-world product behind each token in [`rwa_multichain.tokens`](/data-catalog/curated/rwa/registry/tokens): what backs it, who issues it, which platform brought it onchain, and the legal and regulatory structure holders actually buy into. Grain: one row per token per chain, keyed on `(blockchain, token_id)`. It covers roughly 2,300 products from 218 issuers across 125 tokenization platforms.

<PremiumDatasetAccessCard />

## Why it is separate from `tokens`

`tokens` answers "does this token exist and what is its identifier on each chain". `token_metadata` answers "what is the product, and how is it structured". Keeping them apart means the registry can add a chain deployment without waiting on research, and research can be revised without rewriting the registry.

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.

## Table schema

**Token identity**

| Column           | Type      | Description                                                                                  |
| ---------------- | --------- | -------------------------------------------------------------------------------------------- |
| `blockchain`     | `VARCHAR` | Chain the token instance lives on                                                            |
| `token_id`       | `VARCHAR` | Normalized token identifier. Join key to `tokens`, `balances`, `transfers`, and `supply`     |
| `token_standard` | `VARCHAR` | Chain-specific standard: `erc20`, `spl`, `stellar_asset`, `xrpl_iou`, `aptos_fa`, `sui_coin` |
| `symbol`         | `VARCHAR` | The token's own onchain symbol, as returned by `symbol()` or the chain equivalent            |

**Product identity**

| Column          | Type      | Description                                                                                                           |
| --------------- | --------- | --------------------------------------------------------------------------------------------------------------------- |
| `product_id`    | `VARCHAR` | Stable lowercase product identifier, unique per product. Often resembles the token symbol but is not resolved from it |
| `product_name`  | `VARCHAR` | The product's official name as used by its issuer or platform                                                         |
| `issuer_id`     | `VARCHAR` | Stable identifier for the legal issuing entity, shared across every product it issues                                 |
| `issuer_name`   | `VARCHAR` | Canonical legal issuer name, written identically everywhere it appears                                                |
| `platform_id`   | `VARCHAR` | Stable identifier for the tokenization or distribution platform                                                       |
| `platform_name` | `VARCHAR` | Canonical platform display name                                                                                       |

**Asset classification**

| Column                | Type      | Description                                                                                                                                     |
| --------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `asset_class`         | `VARCHAR` | Top-level category of the backing exposure. See values below                                                                                    |
| `asset_type`          | `VARCHAR` | Finer classification, constrained by `asset_class`. See values below                                                                            |
| `underlying_asset`    | `VARCHAR` | Description of specifically what backs the token, precise enough to verify against a primary source                                             |
| `underlying_ticker`   | `VARCHAR` | Market ticker of the underlying instrument, where one trades independently of the token. Not the token's own symbol                             |
| `underlying_exchange` | `VARCHAR` | Listing venue for `underlying_ticker`, with its ISO 10383 MIC where known — e.g. `Nasdaq (XNAS)`. Disambiguates ticker collisions across venues |

**Product mechanics and lifecycle**

| Column                 | Type      | Description                                                                                                             |
| ---------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------- |
| `product_design`       | `VARCHAR` | Plain-language narrative of how the product is issued, held, moved, and redeemed                                        |
| `transfer_restriction` | `VARCHAR` | What the token contract enforces on transfers: `NONE`, `ALLOWLIST`, `PLATFORM_INTERNAL`, `NON_TRANSFERABLE`             |
| `acquisition_access`   | `VARCHAR` | How a fresh wallet can come to hold it: `PERMISSIONLESS`, `KYC_ONBOARDING`, `PLATFORM_ACCOUNT_ONLY`                     |
| `transfer_model`       | `VARCHAR` | Free-text detail behind the two columns above — allowlisting rules, cross-chain burn-and-mint behavior, DEX eligibility |
| `redemption_mechanism` | `VARCHAR` | How a holder gets liquidity out: `INSTANT_ONCHAIN`, `T_PLUS_N_OFFCHAIN`, `SECONDARY_MARKET_ONLY`                        |
| `product_status`       | `VARCHAR` | Lifecycle state: `ACTIVE`, `MATURED`, `WOUND_DOWN`, `DEFAULTED`                                                         |

**Jurisdiction and legal structure**

| Column                 | Type      | Description                                                                                                                                      |
| ---------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `jurisdiction_country` | `VARCHAR` | Domicile of the issuing legal entity — not the platform's, manager's, or custodian's                                                             |
| `jurisdiction_iso2`    | `VARCHAR` | Two-letter ISO country code matching `jurisdiction_country`                                                                                      |
| `legal_wrapper_type`   | `VARCHAR` | Legal form through which holders obtain exposure. See values below                                                                               |
| `asset_manager_entity` | `VARCHAR` | Entity managing the underlying portfolio, when distinct from the issuer — e.g. Amundi for Spiko funds                                            |
| `custodian_entity`     | `VARCHAR` | Institution holding the underlying non-digital asset: a bank or trust company for securities and cash, a vault operator for physical commodities |
| `regulatory_framework` | `VARCHAR` | The specific exemption, registration, or regime the offering relies on                                                                           |
| `regulator`            | `VARCHAR` | Supervising authority as a canonical short name. Shared acronyms are disambiguated by country — `FMA (Liechtenstein)` vs `FMA (Austria)`         |
| `issuer_entity`        | `VARCHAR` | Exact legal registrant named in this product's filing. Can be more specific than `issuer_name`, e.g. a named sub-fund                            |
| `issuer_lei`           | `VARCHAR` | The issuer's 20-character GLEIF Legal Entity Identifier                                                                                          |
| `issuer_cik`           | `VARCHAR` | The issuer's numeric SEC filer identifier, where applicable                                                                                      |
| `eligible_investors`   | `VARCHAR` | Investor class legally permitted to hold the product. See values below                                                                           |

**Research provenance**

| Column                     | Type         | Description                                                                                                                                                     |
| -------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `confidence`               | `VARCHAR`    | `HIGH` (primary evidence, no material gaps), `MEDIUM` (primary source found, some detail unconfirmed), `LOW` (inference or secondary evidence remains material) |
| `verification_status`      | `VARCHAR`    | `VERIFIED` when every material populated claim has been checked, otherwise `PARTIAL`                                                                            |
| `flagged_for_human_review` | `VARCHAR`    | Blank when nothing is outstanding; otherwise a short statement of the open question. Treat a populated row as unsettled                                         |
| `notes`                    | `VARCHAR`    | Caveats, aliases, and dated correction history. Corrections are appended rather than overwriting, so the field carries an audit trail                           |
| `researched_date`          | `DATE`       | Date the row's research was performed. Not a source-freshness timestamp                                                                                         |
| `sources`                  | `ARRAY(ROW)` | Ordered evidence records, capped at ten per product. See below                                                                                                  |

### Blank versus NOT\_APPLICABLE

Two sentinels carry different meanings and you should filter on them differently:

* **Blank** means the value is not currently known for this product.
* **`NOT_APPLICABLE`** means the field has been shown not to apply — a basket product has no single `underlying_ticker`, a non-SEC issuer has no `issuer_cik`.

No other placeholder ever appears: there is no `N/A`, `UNKNOWN`, or `UNDISCLOSED` in this table. So `WHERE custodian_entity <> ''` gives you products with a known custodian, and `WHERE custodian_entity = 'NOT_APPLICABLE'` gives you products that genuinely have none.

`asset_class` and `asset_type` are populated for effectively every product. The deep legal fields are populated where a primary source confirms them, so expect blanks on `custodian_entity`, `issuer_lei`, and `issuer_cik` for long-tail products.

### asset\_class values

| Value             | Meaning                                                |
| ----------------- | ------------------------------------------------------ |
| `credit`          | Private credit, loans, receivables, or debt exposure   |
| `equities`        | Public or private company shares, or equity funds      |
| `commodities`     | Physical or commodity-linked goods                     |
| `cash_equivalent` | T-bills, government debt, and money-market instruments |
| `real_estate`     | Property or property-backed interests                  |
| `other`           | Exposure that does not fit the preceding classes       |

By product count, `credit` and `equities` dominate — private credit facilities and tokenized stock lineups both run to hundreds of products each — while `cash_equivalent` holds far fewer products but most of the AUM.

### asset\_type values

`asset_type` is constrained by its parent class:

| Parent class      | Values                                                                                                                                                                                                                  |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `credit`          | `corporate_bonds_high_yield`, `corporate_bonds_investment_grade`, `credit_fund`, `private_credit`, `private_credit_fund`, `private_credit_senior_secured_loans`, `securitized_products`                                 |
| `equities`        | `equities_cash`, `equities_exchange_traded_funds`, `equities_fund`, `equities_index_fund`, `equities_preferred`, `equities_synthetic`, `multi_asset_allocation_fund`, `private_equity`, `venture_capital_fund_interest` |
| `commodities`     | `agriculture`, `carbon_credits`, `gemstones`, `metals`                                                                                                                                                                  |
| `cash_equivalent` | `government_debt_non_us`, `government_debt_us`, `money_market_funds_non_us`, `money_market_funds_us`                                                                                                                    |
| `real_estate`     | `residential_real_estate`                                                                                                                                                                                               |
| `other`           | `crypto_hedge_fund`, `fine_art`, `hedge_fund`, `insurance_linked_securities`                                                                                                                                            |

Two values are deliberately cross-class, assigned from the product's actual exposure rather than inferred from the value alone: `energy` appears under both `commodities` and `credit`, and `fixed_income_diversified` under `cash_equivalent`, `credit`, and `other`. Filter on the pair when this matters, not on `asset_type` alone.

### legal\_wrapper\_type values

| Value                       | Meaning                                                         |
| --------------------------- | --------------------------------------------------------------- |
| `DIRECT_TOKENIZED_EQUITY`   | The token itself is the legal equity interest                   |
| `LEDGER_BASED_SECURITY`     | The DLT-native register is the legal register of title          |
| `SPECIAL_PURPOSE_VEHICLE`   | A product-specific SPV holds the asset                          |
| `REGISTERED_FUND`           | A formally registered or regulated collective fund              |
| `ETF_PASSTHROUGH_WRAPPER`   | The token wraps shares of an existing ETF                       |
| `STRUCTURED_NOTE`           | A debt instrument contractually tracking an underlying          |
| `STRUCTURED_CREDIT_TRANCHE` | A securitized tranche backed by pooled credit                   |
| `DERIVATIVE_CONTRACT`       | Synthetic exposure without ownership of the underlying          |
| `CUSTODIAL_RECEIPT`         | A receipt representing a specifically custodied asset           |
| `WRAPPED_RWA_TOKEN`         | A wrapper around another tokenized RWA product                  |
| `DEFI_VAULT_SHARE`          | A share of a smart-contract vault or pool                       |
| `OTHER`                     | A structure outside the taxonomy, explained in `product_design` |

This is one axis only. It is distinct from `regulatory_framework` (which regime the offering relies on) and `jurisdiction_country` (where the issuer is domiciled) — a BVI-domiciled fund can be a `REGISTERED_FUND` under SEC oversight.

### eligible\_investors values

`UNRESTRICTED`, `US_RETAIL`, `US_ACCREDITED`, `US_QUALIFIED_PURCHASER`, `NON_US_REG_S`, `EU_PROFESSIONAL_QUALIFIED`, `KYC_GATED_GENERAL`.

Two products from the same issuer can differ here, because eligibility follows each offering's own terms rather than the issuer. A direct government-bills fund distributed broadly under Reg S and that same issuer's swap-based fund restricted to EU professional investors will not share a value.

### The sources array

`sources` holds the evidence behind the row, ordered and capped at ten records per product. Each record has these fields:

| Field              | Type             | Description                                                            |
| ------------------ | ---------------- | ---------------------------------------------------------------------- |
| `source_order`     | `INTEGER`        | Stable order, contiguous from 1                                        |
| `url`              | `VARCHAR`        | Exact page the claim was read from                                     |
| `label`            | `VARCHAR`        | Short human-readable citation label                                    |
| `authority`        | `VARCHAR`        | `PRIMARY`, `PRIMARY_LEGAL`, `REGISTRY`, `EXPLORER`, or `SECONDARY`     |
| `verifies`         | `ARRAY(VARCHAR)` | Column names this source specifically supports                         |
| `status`           | `VARCHAR`        | Retrieval state: `ACTIVE`, `BLOCKED`, `REMOVED`, `ERROR`, or `MISSING` |
| `last_verified_at` | `DATE`           | Date the URL and its claim scope were last checked                     |
| `content_hash`     | `VARCHAR`        | SHA-256 of the normalized scraped page, for change detection           |

Because `verifies` is scoped per column, you can check whether a specific field on a specific product is backed by a primary legal source rather than trusting the row-level `confidence` alone.

## Issuer, platform, and asset manager

Three separate entities, and they diverge often enough that picking the wrong one skews a league table:

* **`issuer_name`** is the legal entity that issues the product. Attribute AUM here for asset-manager rankings.
* **`platform_name`** is the venue that brought it onchain. Attribute here when measuring tokenization-infrastructure market share. Ondo Global Markets is the platform for tokenized iShares ETFs whose issuer is BlackRock.
* **`asset_manager_entity`** runs the underlying portfolio when that is a third party — Amundi manages the Spiko funds, Franklin Advisers manages BENJI.

## 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. `token_id` resolves each onchain instance to exactly one product, so join on `(blockchain, token_id)` and never on `symbol` or `underlying_ticker`.

## Example queries

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

```sql theme={null}
SELECT
  m.asset_class,
  COUNT(DISTINCT m.product_id) AS products,
  COUNT(DISTINCT b.address) AS holders,
  SUM(b.balance_usd) AS aum_usd
FROM rwa_multichain.balances b
JOIN rwa_multichain.token_metadata m
  ON m.blockchain = b.blockchain
  AND m.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
```

**Issuer league table for tokenized money market funds:**

```sql theme={null}
SELECT
  m.issuer_name,
  m.platform_name,
  m.custodian_entity,
  COUNT(DISTINCT m.product_id) AS products,
  SUM(b.balance_usd) AS aum_usd
FROM rwa_multichain.balances b
JOIN rwa_multichain.token_metadata m
  ON m.blockchain = b.blockchain
  AND m.token_id = b.token_id
WHERE b.day = CURRENT_DATE - INTERVAL '1' DAY
  AND b.balance > 0
  AND m.asset_type IN ('money_market_funds_us', 'money_market_funds_non_us')
GROUP BY 1, 2, 3
ORDER BY 5 DESC NULLS LAST
LIMIT 25
```

**Products a US retail investor can hold, by legal wrapper and regulator:**

```sql theme={null}
SELECT
  m.legal_wrapper_type,
  m.regulator,
  m.jurisdiction_iso2,
  COUNT(DISTINCT m.product_id) AS products
FROM rwa_multichain.token_metadata m
WHERE m.eligible_investors = 'US_RETAIL'
  AND m.legal_wrapper_type <> ''
GROUP BY 1, 2, 3
ORDER BY 4 DESC
```

**Only well-evidenced rows, for a research or ratings model:**

```sql theme={null}
SELECT
  product_id,
  product_name,
  issuer_name,
  asset_class,
  asset_type,
  legal_wrapper_type,
  custodian_entity,
  redemption_mechanism,
  researched_date
FROM rwa_multichain.token_metadata
WHERE verification_status = 'VERIFIED'
  AND confidence = 'HIGH'
  AND flagged_for_human_review = ''
  AND blockchain = 'ethereum'
ORDER BY researched_date DESC
```
