> ## 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_intervals

> Validity windows derived from RWA value events, retaining price meaning and unit basis for point-in-time analysis.

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.nav_intervals` turns the discrete value events in [`nav`](/data-catalog/curated/rwa/valuation/nav) into validity windows. Grain: one row per value per asset with a `valid_from` / `valid_to` range, keyed on `unique_key`. Use it for source-level NAV analysis. For cross-chain token-unit valuation, prefer [`rwa_multichain.prices`](/data-catalog/curated/rwa/valuation/prices).

<PremiumDatasetAccessCard />

## Why it exists

NAV is published irregularly — daily for some issuers, weekly or on demand for others. Valuing a transfer that happened between two publications means finding the most recent NAV at or before that timestamp. Doing that inline is a correlated subquery or a window function over the full NAV history, repeated for every join.

This table forward-fills instead: each NAV value carries the window over which it was the prevailing value, so a point-in-time join becomes a plain range predicate. The most recent value per asset has `valid_to IS NULL`, meaning it is still in force.

## Table schema

| Column | Type | Description |
| - | - | - |
| `blockchain` | `VARCHAR` | Chain where the NAV was published |
| `chain_id` | `BIGINT` | Numeric chain identifier |
| `asset_address` | `VARBINARY` | Legacy binary asset identifier. Representation differs by chain |
| `oracle_address` | `VARBINARY` | Native oracle/source identifier bytes |
| `usd_nav_price` | `DOUBLE` | Backward-compatible USD value column |
| `usd_price` | `DOUBLE` | Generic USD value without implying accounting NAV |
| `value_kind` | `VARCHAR` | `accounting_nav`, `redemption_rate`, `tracker_price`, `commodity_reference`, or `par_value` |
| `price_basis` | `VARCHAR` | `token_unit`, `display_unit`, `share_unit`, or `reference_unit` |
| `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 |
| `issuer` | `VARCHAR` | Issuer of the asset |
| `symbol` | `VARCHAR` | Asset ticker |
| `valid_from` | `TIMESTAMP WITH TIME ZONE` | Start of the window, inclusive |
| `valid_to` | `TIMESTAMP WITH TIME ZONE` | End of the window, exclusive. `NULL` for the open-ended interval |
| `block_time` | `TIMESTAMP WITH TIME ZONE` | When the underlying update was published onchain |
| `block_number` | `BIGINT` | Block height of the underlying update |
| `tx_hash` | `VARBINARY` | Transaction that published the update |
| `evt_index` | `BIGINT` | Event position within the transaction |
| `trace_address` | `ARRAY(BIGINT)` | Trace position, where NAV was read from a call |
| `unique_key` | `VARCHAR` | Row identifier |
| `_updated_at` | `TIMESTAMP WITH TIME ZONE` | When this row was last refreshed |

## The EVM point-in-time join pattern

Two things to get right: the half-open range predicate, and the EVM `VARBINARY`-to-hex address conversion.

```sql theme={null}
-- Value each transfer at the NAV in force when it happened
SELECT
  t.block_time,
  t.token_symbol,
  n.issuer,
  t.amount,
  n.usd_price,
  n.value_kind,
  t.amount * n.usd_price AS amount_usd_at_nav
FROM rwa_multichain.transfers AS t
INNER JOIN rwa_multichain.nav_intervals AS n
  ON n.blockchain = t.blockchain
  AND '0x' || lower(to_hex(n.asset_address)) = t.token_address
  AND t.block_time >= n.valid_from
  AND (n.valid_to IS NULL OR t.block_time < n.valid_to)
WHERE t.block_date >= current_date - INTERVAL '7' day
  AND t.blockchain = 'ethereum'
ORDER BY t.block_time DESC
LIMIT 100
```

`valid_to IS NULL` must be handled explicitly. Without it, every row priced by the open-ended NAV interval drops out of the result, which silently biases any total toward historical activity.

The `0x` + `to_hex(asset_address)` expression is EVM-only. Solana, Stellar, and XRPL textual ids use `from_utf8(asset_address)`; Sui stores package bytes. For daily cross-chain data, use `prices`, or compare on dates with a chain-correct identifier:

```sql theme={null}
  AND b.day >= date(n.valid_from)
  AND (n.valid_to IS NULL OR b.day < date(n.valid_to))
```

<Note>
  `balances.balance_usd` already uses curated RWA prices. Join this table when you need source-level NAV semantics or a different valuation timestamp.
</Note>


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