/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: The clearing load is itself a stack — a regime base floor plus utilization and dispersion skews, clamped to the per-marketmaxLoadBps (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.
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 intofair … · 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 () 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
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.
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.
The pending footer — framed, not naked
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: 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
pendingstate — 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 · chainId421614 · deploy block 274081134 (subgraph startBlock) · deployed 2026-06-05
Core protocol
Stylus & libraries
Oracles
Uniswap
Chainlink feeds
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.