> ## 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"}) => <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.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

## 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                                                  |
| `balance_raw`         | `DOUBLE`    | Raw token balance in native precision                                                     |
| `balance`             | `DOUBLE`    | Decimals-adjusted balance                                                                 |
| `balance_usd`         | `DOUBLE`    | USD value from NAV, where coverage exists                                                 |
| `address_category`    | `VARCHAR`   | Top-level holder classification, e.g. `cex`, `lending`, `custodian`, `treasury`, `bridge` |
| `address_subcategory` | `VARCHAR`   | Finer classification within `address_category`                                            |
| `address_project`     | `VARCHAR`   | Project or entity name. `NULL` for unlabeled addresses                                    |
| `address_label`       | `VARCHAR`   | Label value. `NULL` for unlabeled addresses                                               |
| `is_smart_contract`   | `BOOLEAN`   | Whether the holder is a contract                                                          |
| `last_updated`        | `TIMESTAMP` | UTC timestamp when the balance last changed                                               |

## Unlabeled holders are the majority

Most holder addresses carry no label, and that is expected — label coverage skews toward large, well-known entities. `address_category` is `NULL` for unlabeled holders, so treat them as a distinct bucket rather than dropping them:

```sql theme={null}
COALESCE(address_category, 'unlabeled') AS holder_type
```

Dropping `NULL` categories understates total supply, sometimes severely. Any concentration figure should state what share of supply is attributed versus unlabeled.

## Table schema notes

`balance_usd` carries the same NAV-coverage caveat as [`balances`](/data-catalog/curated/rwa/holders-supply/balances): it is populated only where the asset has an onchain NAV feed, so `NULL` means missing price coverage rather than zero value.

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
  COALESCE(address_category, 'unlabeled') 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_project,
  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
```
