Skip to main content
rwa_hyperliquid.perp_trades is the fill table for RWA perpetual futures — synthetic exposure to a real-world asset with no tokenized share involved. Grain: one taker-leg fill per row, keyed on (block_month, block_date, unique_key). It covers Hyperliquid HIP-3 builder-deployed markets.

Taker leg only

Each row represents the taker leg of a fill. As a result, SUM(notional_usd) matches the volume Hyperliquid reports for the market without double-counting both sides.

Leverage and margin, per fill

Three columns carry the trader’s risk posture at fill time, and nothing else in the RWA catalog has them — not even the pre-aggregated metrics tables:

Table schema

asset_id is INTEGER here, so it joins to rwa_hyperliquid.markets.asset_id with no cast. Do not join it to markets.token_address, which is the same value typed as VARCHAR.A perp has no token_id and never joins to rwa_multichain.tokens — there is no token behind it.

fill_type matters for volume

Liquidations, auto-deleveraging (adl), and market-delisting settlement fills are not discretionary trading. order fills dominate, followed by twap, with forced closes a small tail. Keep only user-initiated fills when measuring genuine trading demand:
TWAP fills are one order sliced into many small fills, so they inflate trade counts far more than volume — the fill count runs orders of magnitude above the number of distinct orders behind it. Count distinct twap_id rather than rows if you want order-level counts.

Getting asset class

This table has no asset_class. Join rwa_hyperliquid.markets for classification, issuer, and leverage caps:

leverage_setting decides whether leverage is a choice

market_default fills use Hyperliquid’s default of min(20, max_leverage) rather than trader-selected leverage. Filter to explicit whenever you are measuring trader risk appetite — mixing the two makes the default look like a popular choice:

margin_mode here is the trader’s choice, not the market’s rule

Two different columns share this name, and they mean different things:
  • rwa_hyperliquid.markets.margin_mode is the regime the deployer set for the market: cross, noCross, or strictIsolated.
  • perp_trades.margin_mode is what the trader actually used on that position: cross or isolated.
A market with margin_mode = 'cross' permits both, and in practice sees both — traders on cross-enabled markets still pick isolated a meaningful share of the time. A noCross or strictIsolated market only ever produces isolated fills. So the market-level column tells you what was allowed and the trade-level column tells you what was chosen; they are not interchangeable.

Example query

Was leverage elevated going into a liquidation cluster?
For pre-aggregated volume, open interest, and funding rather than raw fills, use perp_metrics_hourly or perp_metrics_daily. Neither carries leverage — this table is the only source for it.