Skip to main content
hyperliquid.perp_market_details is the market dimension for the Hyperliquid perp dataset, covering first-party markets (coin unprefixed, e.g. BTC) and HIP-3 builder-deployed markets (coin = dex:SYMBOL, e.g. xyz:TSLA). Grain: one row per (perp_dex, coin), current state. coin is the join key used by every market-grained table in the dataset (perp_accounts_daily is per trader and carries none).

Table schema

A live view, current state only

The table is a VIEW over the deduped registry snapshots, so a newly listed market appears with no build and no refresh anywhere in the dataset — on the next registry write covering its dex, measured at a median of 32 minutes after the on-chain registration and 18.2 hours worst case. Coverage is every first-party and HIP-3 builder-dex market; Hyperliquid spot and HIP-4 outcome markets are out of scope. There is no valid_from / valid_to: this is not an SCD. The upstream registry only has change history from 2026-06-29, and intervals would break the one-row-per-market contract that every join here assumes.

Joins from fact tables drop nothing

Delisted markets stay tombstoned in the registry rather than disappearing, so every coin that has traded since the 2025-07-27 fills floor has a row here — verified by an unbounded all-history anti-join over every coin that had traded. An inner join from a fact table is therefore safe. The reverse is not a market list: registered-but-never-traded markets are here too.

max_leverage is not always the cap that applies

margin_table_id 1-50 is the implicit single-tier ladder where the id is the leverage value; there margin_tiers is synthesised from max_leverage and the two agree. Ids 51+ are deployer-defined and the only genuinely tiered markets. On those, max_leverage is a top-tier cap that a large enough position does not get, and the applicable cap is the last tier whose lowerBound the notional clears.
Where a trader never set leverage, Hyperliquid’s account default is least(20, max_leverage).

Classification is here and nowhere else

market_category, asset_class, asset_type, underlying_ticker and description are LEFT JOINed from hyperliquid.perp_market_metadata and stored on no fact table, so a reclassification rebuilds only that ~500-row table. asset_class takes credit, fixed_income, cash_equivalent, equities, multi_asset, commodities, real_estate, fx or other — the vocabulary the tokenized-RWA models use. It is null on every crypto market and on the compute markets, where no value in that vocabulary applies. asset_type names the exposure rather than a wrapper: a single-name perp is equities_synthetic whether the name is listed or pre-IPO, an index perp is equities_index, and a perp on an ETF is equities_exchange_traded_funds because there the reference genuinely is a fund.
perp_trades holds both legs of every match, hence the is_taker filter; hyperliquid.perp_market_metrics_daily is already taker-side if you only need the volume. The IS NULL arm matters: market_category’s not_null test runs at warning severity so a newly listed market keeps reporting while it is unclassified, and a bare <> 'crypto' would silently drop it.