Skip to main content
The /markets page is the action-oriented browser over the protocol’s nine markets — the same surface a trader scans before choosing a position to protect or a market to underwrite. Everything on it is live RPC right now: no subgraph, no engine, no cached snapshot. One multicall, one block, nine rows.
This is the action market browser. For the conceptual model behind it — why there are exactly 9 markets over one vault, how the marketId is derived, and the three-way parity that pins it — see Markets & marketId. For the public, wallet-free data-moat heat-matrix of the same clearing-load surface, see /app/data.

What the page is

The grid renders the 9 markets — 3 fee tiers (0.05% / 0.30% / 1.00%) crossed with 3 durations (7d / 30d / 90d) — each with its on-chain clearing load and fair premium, read live via an RPC multicall with no indexer in the path. The header restates the load-bearing framing — the in-range convexity hedge, the min(realized_IL, MaxIL) cap — and names the clearing load for what it is: “the Path-A pool floor an MM must undercut to win the fill”. That last phrase is the whole point of the page. The clearing load is the price-to-beat: the bps markup over on-chain fair value that the always-on cvAMM pool (Path A) charges right now. A competing market maker (Path B) wins the route only by quoting strictly below it. Reading this grid is how an MM finds the market where the pool floor is fattest — the most room to undercut and still profit.

The columns, row by row

Each row is one market. The layout:

Clearing load — the price-to-beat

This is the headline number. It is the live Path-A pool load in basis points over the fair premium — the markup the mechanical pool demands today for taking the risk. It is the floor a Path-B MM must come in under. Formally the premium an LP pays on the pool rail is the fair premium scaled up by the load: PoolPremium=FairPremium⋅(1+clearingLoadbps10,000),FairPremium=fairRate(σref2 T)⋅MaxIL\text{PoolPremium} = \text{FairPremium}\cdot\Big(1 + \tfrac{\text{clearingLoad}_{\text{bps}}}{10{,}000}\Big), \qquad \text{FairPremium} = \text{fairRate}\big(\sigma_{\text{ref}}^2\, T\big)\cdot \text{MaxIL} The clearing load is itself a stack — a regime base floor plus utilization and dispersion skews, clamped to the per-market maxLoadBps (invariant I10). The full decomposition lives in the load stack; on /markets you see the clamped total, which is exactly what an MM has to beat.
The fattest clearing load is where the alpha is. Sort the grid by clearing load and the top row is the market where the pool floor is highest — the most bps of room for a competing MM quote to undercut while still being paid for the convexity it is short. This is the grid an MM reads before signing a quote.

Pool premium — fair · cap

Next to the load, each row shows the dollar pool premium for a representative fill, with a sub-line breaking it into fair … · cap … — the on-chain fair premium (the Φ-sum floor) and the MaxIL cap the premium is a fraction of. Premiums are denominated in the dUSDC numéraire (6 decimals) — fmtUsd divides the raw 1_000_000n-per-dollar integer by 1e6. MaxIL, V0, fair premium and the pool premium are all 6-dec raw on the wire.

σ_ref · regime

All nine markets share one dWETH oracle and one σ_ref — the EWMA realized vol of the volatile token. σ_ref is a WAD (1e18) ratio. The regime badge — calm / normal / stressed — is σ_ref read against the protocol’s load bands, and it is the same regime that sets the base floor of the clearing load. See σ_ref for how the reference vol is computed and the load stack for how the regime maps to a base load.
Why one σ_ref across all nine rows. The reference vol is a property of the pair, not of any single market. What differs across the grid is the duration (TT) and the fee tier (the pool the position lives in) — not the vol input. So the same σ_ref flows into all nine fair-rate computations, and the S-curve in σ2T\sigma^2 T is what makes the 7d / 30d / 90d rows price differently for identical geometry. MaxIL, by contrast, is pure geometry and is identical across all three durations.

Status badge + actions

Every row carries a status badge — live, paused, unregistered, or oracle degraded — and two action links, Protect and Underwrite, each carrying the row’s marketId in the query so the destination page opens pre-selected on that market.

Protect this market

Carries the marketId into /protect so the LP flow opens on the market you clicked — pick a position, preview the premium, buy.

Underwrite this market

Carries the marketId into /underwrite so the MM quote builder opens on the market whose clearing load you want to undercut.

Summary stats + live block

Above the grid, four summary stats put the surface in context:
1

Markets — 9 (3 × 3)

The fixed grid size: 3 fee tiers × 3 durations for the dWETH/dUSDC pair.
2

Priceable now

How many of the 9 currently resolve to a live price — i.e. have a live oracle and a σ_ref. A market that can’t be priced this block is counted out here and shows a reason badge in its row, never a fabricated number.
3

σ_ref (dWETH)

The shared EWMA reference vol that feeds every row.
4

Regime

σ_ref read against the load bands — calm / normal / stressed — the protocol-wide regime that sets the base floor of every clearing load.
The header right-side prints the live block number of the multicall that produced the grid — a deliberate trust signal: every visible number was read at that block, in one call, from the chain.

How the data is fetched

The whole grid is one multicall, refetched every 15 seconds — there is no per-row RPC fan-out and no indexer in the path:
getCurrentLoadSurface is RPC-only and returns the clearing load and premiums for all nine markets in a single round-trip; getSurfaceSigmaRef reads the shared dWETH vol; and a per-row getMarketConfig supplies the active flag behind the status badge. None of these touch the subgraph.
The pool load is computed client-side via the SDK’s parity-locked TypeScript port of CvammPricing — the deployed library is delegatecall-only and cannot be eth_call-ed directly, so the SDK reproduces it exactly and pins the parity in tests. The fair premium underneath it comes from the on-chain Stylus FairValueOracle, never reimplemented off-chain.

Per-row degradation is inlined, never thrown

This is the page’s signature behavior. Degradation is per-row, inline, and honest. A market that can’t be priced this block is not dropped and never throws — it shows a muted ”—” in the price columns with a reason badge, and stays in the grid: A degraded row keeps its label, its marketId, and its Protect/Underwrite links — only the price columns degrade. This mirrors the protocol-wide contract that reads are graceful and never throw: any read needing a reverting oracle, an absent event, or the not-yet-deployed subgraph returns a typed { available: false } / { priceable: false } envelope and renders a calm pending/degraded state.
“Pending” ≠ “error.” A — with an “oracle degraded” badge is a correct answer to “what is the price right now?”, not a failure. The grid telling you a cell is unpriceable is the same trust signal as it telling you another cell’s exact clearing load — both are honest reports of on-chain state at the live block.
The page closes with a footer that draws the live/pending line explicitly. The limitation is never exposed naked — it is stated with its cause and its path-forward:
Limit — some surfaces are not on this page yet. Per-market volume, MM win-rate / share, and the historical clearing-load surface (the term structure over time) are not shown on /markets.Why. These are aggregate / time-series quantities. They require an indexer that folds the rich on-chain events emitted since the deploy (SwapPriced, QuoteFilled) into per-market history — and the subgraph is deployed but not yet indexed (events have been on-chain since block 274081134). A point-in-time multicall, which is all /markets does, cannot reconstruct history.Mitigation. Everything visible on the grid — clearing load, fair premium, pool premium, σ_ref, regime, status — is live RPC right now, independent of the subgraph. The historical and aggregate surfaces degrade to a typed pending state that names the future route, never a fabricated number and never an error. When the indexer finishes, those columns light up with zero changes to the live ones.
So the partition is clean and worth stating plainly:
  • Live today (this page, RPC multicall): clearing load (the price-to-beat), pool premium with fair · cap, σ_ref, regime, per-row status, the live block number.
  • Pending the subgraph: per-market volume, MM win-rate / share, the historical clearing-load surface (the convexity term structure over time).

How this page fits the moat

The clearing-load surface you read here is Signal 1 of the data moat — clearing load over a transparent σ_ref, bucketed by geometry — and it is the one signal that is fully live today, the same surface the public /app/data heat-matrix renders for a wallet-free audience. The grid is the structure; the dynamics (how the surface and the pool-vs-MM spread move with real flow) mature as MMs compete and volume accumulates.
Structures ship from day one; the full DYNAMICS (pool-vs-MM spread as a forward-vol signal) mature with multiple competing MMs and volume. The dataset begins at the single redeploy; the off-chain telemetry halves begin at the first interaction logged.What Inflexion offers today is the architecture and the first public view into the microstructure of the DeFi LP volatility-risk premium — not yet a mature dataset:
  • Structures are present day-one. All five non-circular behavioral signals are defined and queryable from launch.
  • Dynamics mature with volume. The richer signal — the pool-vs-MM spread read as a forward-vol indicator — only sharpens once multiple market makers compete and real flow accumulates.
  • The dataset begins at the single redeploy, and the off-chain telemetry halves begin at the first interaction logged. History is served live from the subgraph via the API; if a backing (subgraph URL / RPC / telemetry) is absent, surfaces degrade to a typed pending state — never an error.

Where this connects in the app

Protect — buy IL cover

The LP flow the Protect link lands in: pick a position, preview the premium, buy min(IL, MaxIL) cover on the cheaper of pool vs MM.

Underwrite — quote a market

The MM flow the Underwrite link lands in: build a per-market firm quote that undercuts the clearing load you saw here.

Earn — pooled underwriting

Supply the cvAMM vault that backs the Path-A clearing load across all 9 markets.

Data — the moat heat-matrix

The public, wallet-free view of this same clearing-load surface as a fee × duration heat grid (Signal 1, live).

Concepts behind the columns

Markets & marketId

Why exactly 9 markets over one vault, and the keccak marketId that keys every row.

The load stack

How the clearing load decomposes into base + util + dispersion, clamped by I10.

Fair value & the S-curve

The on-chain Φ-sum fair premium under the load — and why duration moves the price.

Routing — pool vs MM

How the clearing load becomes the price-to-beat: createSwapRouted picks the cheaper.

Live registry

Network: Arbitrum Sepolia · chainId 421614 · deploy block 274081134 (subgraph startBlock) · deployed 2026-06-05

Core protocol

Stylus & libraries

Oracles

Uniswap

Demo tokens / pool / LP

Lifecycle swaps

Live create→settle lifecycle (2026-06-05, short 300s fee-500 market 0xb8bbd684f213d5833886ade7b531a6949d85522249881a2b5d46a5cc76e439c2):
  • Path A (cvAMM convexity) — swapId 1, LP tokenId 3220 · V0 $270,531.28 · MaxIL $1,669.24 · premium $9.70 (0.58% of MaxIL) · settled payout $148.64 from ConvexityVault.
  • Path B (MM routing) — swapId 2, LP tokenId 3221 · MM beat cvAMM ($8.93 vs $13.80) · MaxIL $3,215.65 · MM collateral locked $3,215.65 · settled payout $245.66 from MM collateral.