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

> Daily RWA holder balances with entity attribution — CEX, lending protocol, custodian, and treasury labels.

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.balances_enriched` extends [`balances`](/data-catalog/curated/rwa/holders-supply/balances) with entity attribution, so you can tell how much of an asset sits with centralized exchanges, lending protocols, and custodians versus unattributed wallets. Grain: one row per holder per token per chain per day, same as `balances`.

<PremiumDatasetAccessCard />

## What it answers

Raw balances tell you an address holds 40% of an asset. They do not tell you whether that address is a custodian holding on behalf of thousands of end investors, an exchange omnibus wallet, or a single whale — three very different market-structure readings of the same number. The label columns resolve that:

* How much of supply sits with CEXs, protocols, or custodians versus unknown wallets
* Who the labeled top holders are
* What an asset's DeFi exposure is, via labeled lending-protocol holdings
* How much of outstanding supply is circulating versus issuer, bridge, or distributor inventory

## Table schema

| Column | Type | Description | | |
| - | - | - | - | - |
| `blockchain` | `VARCHAR` | Chain for the native balance source | | |
| `day` | `DATE` | Balance snapshot date | | |
| `address` | `VARCHAR` | Normalized holder address | | |
| `token_symbol` | `VARCHAR` | RWA token symbol | | |
| `token_address` | `VARCHAR` | Normalized native token identifier | | |
| `token_id` | `VARCHAR` | Normalized cross-chain token identifier | | |
| `token_standard` | `VARCHAR` | Native token standard or asset namespace, including `tip20` for Tempo | | |
| `token_product_id` | `VARCHAR` | \`blockchain | token\_standard | token\_id`. Join key to `tokens\_reference\_data\` |
| `currency` | `VARCHAR` | Token metadata currency where available | | |
| `balance_raw` | `DOUBLE` | Raw token balance in native precision | | |
| `balance` | `DOUBLE` | Decimals-adjusted balance | | |
| `balance_usd` | `DOUBLE` | USD value using curated RWA prices | | |
| `address_label` | `VARCHAR` | Label value. `NULL` for unlabeled addresses | | |
| `address_category` | `VARCHAR` | Top-level holder classification. Unlabeled rows use `unidentified` or `unidentified_smart_contract` | | |
| `address_subcategory` | `VARCHAR` | Finer classification, or the top-level / unidentified fallback | | |
| `address_label_source` | `VARCHAR` | Exact RWA label source. `NULL` for unidentified holders | | |
| `address_label_method` | `VARCHAR` | RWA label extraction method. `NULL` for unidentified holders | | |
| `is_smart_contract` | `BOOLEAN` | Whether the holder is a deployed EVM smart contract. `NULL` on Robinhood and non-EVM chains | | |
| `is_circulating` | `BOOLEAN` | `false` for xStocks system wallets holding xStocks, bridge lockboxes, issuer inventory, and custodian distributor omnibus. CEX, DEX, lending, and unidentified wallets stay `true`. [`supply.circulating_supply`](/data-catalog/curated/rwa/holders-supply/supply) sums this flag. | | |
| `last_updated` | `TIMESTAMP` | UTC timestamp when the balance last changed | | |

## Holder attribution

Known entities carry their resolved label and category. Other rows are preserved with `address_category = 'unidentified'`; supported EVM contracts use `unidentified_smart_contract`. `address_category` and `address_subcategory` are non-null, so no `COALESCE(..., 'unlabeled')` is needed.

`token_product_id` is the exact join key to [`tokens_reference_data`](/data-catalog/curated/rwa/registry/tokens-reference-data). Do not join the two tables on `product_id`: one product may have many chain deployments.

Tempo smart-contract classification uses `tempo.creation_traces`. More specific entity and protocol labels retain precedence over the generic `unidentified_smart_contract` classification.

## Table schema notes

Because one row per holder per day is preserved, zero balances persist after a holder exits. Filter `balance > 0` when counting holders.

## Example query

```sql theme={null}
-- Supply attribution by holder type
SELECT
  address_category AS holder_type,
  COUNT(DISTINCT address) AS holders,
  SUM(balance_usd) AS balance_usd
FROM rwa_multichain.balances_enriched
WHERE day = CURRENT_DATE - INTERVAL '1' DAY
  AND balance > 0
GROUP BY 1
ORDER BY 3 DESC NULLS LAST
```

**Labeled top holders for one asset:**

```sql theme={null}
SELECT
  address,
  address_label,
  address_category,
  is_smart_contract,
  balance,
  balance_usd
FROM rwa_multichain.balances_enriched
WHERE day = CURRENT_DATE - INTERVAL '1' DAY
  AND token_symbol = 'BUIDL'
  AND balance > 0
ORDER BY balance DESC
LIMIT 25
```

**CEX-held share of an asset over time:**

```sql theme={null}
SELECT
  day,
  SUM(CASE WHEN address_category = 'cex' THEN balance ELSE 0 END) / SUM(balance) AS cex_share
FROM rwa_multichain.balances_enriched
WHERE day >= CURRENT_DATE - INTERVAL '90' DAY
  AND token_symbol = 'BUIDL'
  AND balance > 0
GROUP BY 1
ORDER BY 1 DESC
```


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