> ## 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"}) => <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_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, coin)`. 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                                                                          |
| `blockchain`              | `VARCHAR`   | Always `hyperliquid`                                                                                   |
| `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`   | RWA classification: `rates`, `equities`, `credit`, `fx`, `commodities`, `private_funds`, `real_estate` |
| `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 written by the pipeline                                                         |

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