> ## 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_hyperliquid.perp_metrics_hourly

> Hourly volume, open interest, funding rate, and taker activity per RWA perpetual market on Hyperliquid HIP-3.

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_hyperliquid.perp_metrics_hourly` pre-aggregates RWA perp activity into hourly buckets with market classification already joined on. Grain: one row per market per hour, keyed on `(block_month, block_hour, perp_dex, market_symbol)`. Use it instead of aggregating [`perp_trades`](/data-catalog/curated/rwa/activity/perp-trades) yourself whenever hourly resolution is enough.

<PremiumDatasetAccessCard />

## Table schema

| Column | Type | Description |
| - | - | - |
| `block_month` | `DATE` | Partition column |
| `block_date` | `DATE` | Date of the hour bucket |
| `block_hour` | `TIMESTAMP` | Start of the hour bucket, UTC |
| `perp_dex` | `VARCHAR` | Builder DEX short code |
| `market_symbol` | `VARCHAR` | Market ticker within the builder DEX |
| `coin` | `VARCHAR` | Full market id in `dex:SYMBOL` form |
| `asset_id` | `INTEGER` | HIP-3 asset id |
| `asset_class` | `VARCHAR` | Shared RWA product taxonomy |
| `asset_type` | `VARCHAR` | Finer classification within `asset_class` |
| `underlying_ticker` | `VARCHAR` | Ticker of the referenced real-world instrument |
| `builder_name` | `VARCHAR` | Builder DEX full name |
| `trades_count` | `BIGINT` | Taker fills in the hour |
| `volume_usd` | `DOUBLE` | Taker-leg notional volume in USD |
| `volume_units` | `DOUBLE` | Volume in contract units |
| `buy_volume_usd` | `DOUBLE` | Taker buy volume |
| `sell_volume_usd` | `DOUBLE` | Taker sell volume |
| `unique_takers` | `BIGINT` | Distinct taker addresses in the hour |
| `vwap` | `DOUBLE` | Volume-weighted average fill price |
| `open_interest_units` | `DOUBLE` | Open interest in contract units, **both sides summed** |
| `open_interest_usd` | `DOUBLE` | Open interest valued in USD |
| `open_positions` | `BIGINT` | Count of open positions |
| `funding_rate` | `DOUBLE` | Funding rate for the hour |
| `funding_rate_annualized` | `DOUBLE` | Funding rate annualized |
| `_updated_at` | `TIMESTAMP` | When this row was last refreshed |

## Open interest is both-sides

`open_interest_units` and `open_interest_usd` sum longs and shorts, matching what the Hyperliquid UI displays. Classical one-sided open interest — the convention most traditional venues report — is **half** this number.

```sql theme={null}
open_interest_units / 2 AS one_sided_open_interest
```

Pick one convention and state it. Comparing an unadjusted figure here against a one-sided figure from another venue overstates Hyperliquid by 2x.

## The newest hour is always partial

The most recent bucket is incomplete by construction, since the hour has not finished. Filter it out for any trend or comparison:

```sql theme={null}
WHERE block_hour < date_trunc('hour', now())
```

Leaving it in produces a phantom drop at the right edge of every chart.

## Volume is taker-leg

`volume_usd` inherits the taker-leg-only convention from [`perp_trades`](/data-catalog/curated/rwa/activity/perp-trades), so it matches Hyperliquid's own reported market volume rather than double-counting both sides. `buy_volume_usd` and `sell_volume_usd` split that same taker volume by direction, so the two sum to `volume_usd`.

## Example query

```sql theme={null}
-- Hourly volume and open interest for a market
SELECT
  block_hour,
  market_symbol,
  volume_usd,
  unique_takers,
  open_interest_usd,
  open_interest_units / 2 AS one_sided_oi_units,
  funding_rate_annualized
FROM rwa_hyperliquid.perp_metrics_hourly
WHERE block_hour >= now() - INTERVAL '7' day
  AND block_hour < date_trunc('hour', now())
  AND underlying_ticker = 'TSLA'
ORDER BY 1 DESC
```

**Funding rate extremes across markets:**

```sql theme={null}
SELECT
  block_hour,
  market_symbol,
  asset_class,
  funding_rate_annualized,
  open_interest_usd
FROM rwa_hyperliquid.perp_metrics_hourly
WHERE block_hour >= now() - INTERVAL '2' day
  AND block_hour < date_trunc('hour', now())
  AND open_interest_usd > 100000
ORDER BY abs(funding_rate_annualized) DESC
LIMIT 25
```

<Note>
  For daily rollups, use [`perp_metrics_daily`](/data-catalog/curated/rwa/activity/perp-metrics-daily) rather than aggregating this table — open interest is a point-in-time stock, not a flow, so summing hourly values across a day is wrong.
</Note>


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