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

> Onchain net asset value update events for tokenized real-world assets, sourced from issuer and oracle contracts across 18 chains.

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.nav` is the pricing backbone for tokenized RWAs. Grain: one row per onchain NAV update event, keyed on `unique_key`. Coverage is 366 assets across 18 chains from 48 issuers.

<PremiumDatasetAccessCard />

## Why NAV rather than market price

A tokenized money-market fund does not have a meaningful market price — it has a net asset value published by its issuer or an oracle. Most tokenized RWAs either barely trade onchain or trade at a price pinned to NAV. This table reads NAV directly from the verified onchain source contract for each asset, so USD valuations do not depend on there being a liquid market.

For assets that also trade as ordinary crypto tokens, `prices.day` and `prices.hour` remain the right source for market price.

## Table schema

| Column           | Type            | Description                                                                                                                 |
| ---------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `blockchain`     | `VARCHAR`       | Chain where the NAV update was published                                                                                    |
| `chain_id`       | `BIGINT`        | Numeric chain identifier                                                                                                    |
| `asset_address`  | `VARBINARY`     | Token the NAV applies to. **`VARBINARY`, unlike `token_address` on the activity tables**                                    |
| `oracle_address` | `VARBINARY`     | Contract that published the update                                                                                          |
| `usd_nav_price`  | `DOUBLE`        | NAV in USD per token. This is the column to use for valuation                                                               |
| `nav_raw`        | `UINT256`       | Raw NAV value as emitted onchain                                                                                            |
| `nav_decimals`   | `INTEGER`       | Decimal precision of `nav_raw`                                                                                              |
| `quote_currency` | `VARCHAR`       | Currency the source published in. Mostly `USD`; also `EUR`, `GBP`, `CHF`, `CNY`, `HKD`                                      |
| `issuer`         | `VARCHAR`       | Issuer of the asset                                                                                                         |
| `symbol`         | `VARCHAR`       | Asset ticker                                                                                                                |
| `block_time`     | `TIMESTAMP`     | When the update was published onchain                                                                                       |
| `block_date`     | `DATE`          | Date of the update                                                                                                          |
| `block_month`    | `DATE`          | Partition column                                                                                                            |
| `block_number`   | `BIGINT`        | Block height                                                                                                                |
| `tx_hash`        | `VARBINARY`     | Transaction that published the update                                                                                       |
| `evt_index`      | `BIGINT`        | Event position within the transaction                                                                                       |
| `trace_address`  | `ARRAY(BIGINT)` | Trace position, for NAV read from a call rather than an event                                                               |
| `effective_at`   | `TIMESTAMP`     | When the NAV takes effect. May differ from `block_time` when a source publishes a value dated to an earlier valuation point |
| `unique_key`     | `VARCHAR`       | Row identifier                                                                                                              |
| `_updated_at`    | `TIMESTAMP`     | When this row was last written by the pipeline                                                                              |

<Note>
  `usd_nav_price` is normalized to USD even when `quote_currency` is not USD, so you can aggregate across assets without converting. Keep `quote_currency` in mind when reconciling against an issuer's own published figures, which will be in the native currency.
</Note>

## Use nav\_intervals for point-in-time joins

Because this table holds discrete events, valuing a balance or transfer from it means finding the most recent update at or before a given timestamp — a correlated subquery or a window function. [`nav_intervals`](/data-catalog/curated/rwa/valuation/nav-intervals) precomputes exactly that as `valid_from` / `valid_to` ranges. **Prefer `nav_intervals` for any join to activity data**; use `nav` when you want the update events themselves, for example to measure publication frequency or detect a stale feed.

## Address type mismatch

`asset_address` is `VARBINARY`. The corresponding column on the activity tables (`balances.token_address`, `transfers.token_address`) is `VARCHAR` — 0x-hex on EVM, base58 on Solana. Cast when joining:

```sql theme={null}
'0x' || lower(to_hex(n.asset_address)) = b.token_address
```

## Example query

```sql theme={null}
-- Latest NAV per asset, with publication recency
SELECT
  blockchain,
  symbol,
  issuer,
  quote_currency,
  usd_nav_price,
  block_time AS last_update
FROM (
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY blockchain, asset_address ORDER BY effective_at DESC) AS rn
  FROM rwa_multichain.nav
  WHERE block_date >= current_date - INTERVAL '30' day
)
WHERE rn = 1
ORDER BY last_update DESC
```

**Find feeds that have gone stale:**

```sql theme={null}
SELECT
  blockchain,
  symbol,
  issuer,
  MAX(effective_at) AS last_nav,
  date_diff('day', MAX(effective_at), now()) AS days_stale
FROM rwa_multichain.nav
GROUP BY 1, 2, 3
HAVING date_diff('day', MAX(effective_at), now()) > 7
ORDER BY 5 DESC
```
