rwa_multichain.tokens_reference_data is the classification table for every token in rwa_multichain.tokens. Grain: one row per token per chain, keyed on (blockchain, token_standard, token_id).
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.
Join keys
Do not join
balances_enriched on product_id. One product has many chain tokens, so that join fans out.
Two class vocabularies
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.
Table schema
Token identity
Product attach (null when
product_id is null)
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:token_product_id: