> ## Documentation Index
> Fetch the complete documentation index at: https://dune-automated-update-duneapi-openapi-files.mintlify.site/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>
