FairPremium = fairRate · MaxIL, the risk-neutral expectation of the capped payoff. Fair value is the floor below which writing coverage is negative-EV. It is not the price. The price is fair value plus a load: the structural volatility-risk premium an underwriter must earn for taking the tail, plus two inventory-state skews that price scarcity and concentration. This page is the third and final layer of the pricing stack.
with the whole thing hard-clamped at FairPremium · (1 + maxLoad) — that clamp is invariant I10, true by construction for any inputs on both rails.
The mental model that separates the three layers cleanly: MaxIL is pure geometry (the how much capital);
fairRate is pure stochastics (the how risky); the load stack is pure inventory state (the how scarce). They multiply — premium = fairRate · MaxIL · (1 + load). MaxIL and fairRate are the same for everyone seeing the same geometry and σ; only the load reflects this underwriter’s book at this moment.CvammPricing library inside ConvexityVault (deployments) and mirrored in the Python source of truth. No primitive on this page is hardcoded — every regime band, every knee/slope/power/cap, and maxLoadBps itself are read from the calibrated risk-parameter set via LoadParams. Hardcoding any of these is the exact failure the audit flagged.
1. Why a load at all — the lone-writer CVaR gap
Fair value is the mean of the capped payoff. A single risk-averse writer does not reserve against the mean; they reserve against the tail of what they may pay. That is the gap the load exists to close. Quantify the tail with CVaR95 — the expected payout in the worst 5% of price paths, as a fraction of MaxIL. For a lone writer of a single contract, the model puts that number at ~91–100% of MaxIL almost everywhere. In words: in a bad month a single uncharged writer pays out nearly the entire collateral they posted. A writer charging only fair value (which can be a small fraction of MaxIL — see the worked example) is badly underpriced against that tail.1.1 Diversification collapses the gap
The whole reason a pool can underwrite cheaply where a lone MM cannot is diversification. Model a pool ofN identical-geometry contracts under a one-factor correlation structure:
Z_common is the systemic factor every contract shares; Z_i is the idiosyncratic shock unique to contract i. The correlation ρ dials between two regimes:
- ρ = 0 — full diversification
- ρ = 1 — synchronized book
Distinct durations, staggered entries, decorrelated idiosyncratic shocks. Per-contract CVaR95 collapses from ~100% to 78.5% as
N grows 1 → 100 (at σ=60%, ±10%, 30d; this rounds to ~78.7%). The pool can charge well below a lone MM’s ~100% reservation and still cover its own tail. This is the pool’s structural reason to exist.1.2 Sizing baseLoad inside the envelope
baseLoad is sized inside the envelope [fair, diversified-CVaR]. The pool must charge ≥ fair (else negative-EV) and can charge up to the diversified-pool CVaR while still undercutting a lone MM (whose CVaR is ~100%):
The capital_fraction walks the charged rate from the fair floor toward the diversified-CVaR ceiling. The result is keyed to the σ_ref regime band — calm books need less reserve than stressed ones.
1.3 Calibrated baseLoad — keyed by σ_ref regime
baseLoad is read from the calibrated risk-parameter set keyed by which volatility regime σ_ref is in (CvammPricing.baseLoadWad):
baseLoad alone does not meet the depositor safety targets. It delivers strongly positive long-run growth, but the binding tail constraints (1-in-100 monthly loss ≤ 10%, P(losing month) ≤ 15%) are intrinsic to single-asset volatility selling and need the structural levers — the utilization cap, the senior/junior tranche, and (roadmap) the pool hedge. See the tranches and the no-bad-debt math. The depositor heavy run uses the same calm/normal/stressed = 0.20/0.30/0.50.2. The load stack — the full formula
The two skews ride on top ofbaseLoad. Both are inventory-state functions — they depend on this pool’s current book, not on the geometry of the position being priced.
clamped at FairPremium · (1 + maxLoad). Everything is WAD-scaled — 1e18 = 1.0 = 100% load, 1 bps = 1e14 WAD. The contract rounds the final premium up (round-up favors the pool, via CvammPricing.premiumFromLoad).
Both rails use the same fair value. Path A (cvAMM) computes the whole load stack on-chain. Path B (MM) carries a single loadBps and the contract derives the MM premium as FairPremium · (1 + loadBps/1e4), requiring loadBps ≤ maxLoadBps. The LP gets the cheaper of the two via createSwapRouted.
3. util_skew — utilization scarcity (the drawdown lever)
util_skew prices marginal capacity up as the pool nears full commitment, on utilization u = locked/(locked+free):
It is flat below knee (spare capacity is cheap) and rises convexly toward full commitment. The shape matters: pricing turns up before the pool is over-committed, not after.
Calibrated values:
This is the same
locked/free accounting that powers the withdrawal-delay run defense. Pricing new coverage up before over-commitment and gating junior withdrawals below totalLocked are two uses of one accumulator in ConvexityVault. See the vaults.u = 0.40 → P(3y DD>50%) = 2.7% versus u = 0.60 → 18.0%. That single dial is why the disciplined operating point exists; see the depositor disclosure.
4. dispersion_skew — single-pair concentration (the honest analogue)
dispersion_skew prices the book up as outstanding coverage clusters in one corner of the width × moneyness × duration grid. It is the honest single-pair analogue of cross-asset concentration: many positions bunched at the same edge all hit MaxIL together in one move — exactly the ρ → 1 regime from §1.1.
Concentration is measured by a normalized Herfindahl–Hirschman index (HHI) over the MaxIL-weighted coverage histogram across the grid: h = 0 is perfectly dispersed, h = 1 is all coverage in one cell. Then:
Calibrated values:
A well-dispersed book is charged ~0; full concentration adds +0.5 load. On-chain the HHI is computed O(1) from an incremental
Σ lockedByMarket² accumulator (ConvexityVault.concentrationWad) — no per-fill histogram scan.
Why this is single-asset calibrated and not the dead cross-asset skew. On a single-pair (ETH/USDC) book, a cross-asset concentration skew degenerates to a useless constant (
k ≈ 1.0 — everything is correlated, so the skew never moves). dispersion_skew is the honest replacement: it measures concentration within the one pair’s geometry grid, where dispersion genuinely varies.5. The I10 clamp — overcharge impossible by code
The three loads sum, then the sum is clamped before it touches the premium: Because the sum of loads is clamped tomaxLoad, the bound
holds for any inputs, on both rails. That bound is invariant I10.
I10 — Price cap, by construction
premium ≤ FairPremium · (1 + maxLoadBps) on both paths, by construction, upstream of settle.- Path A — a mechanical deterministic clamp (
CvammPricing.totalLoadWad). No MM discretion; holds for all state sequences and all price paths, in FULL and PARTIAL alike. - Path B —
require(loadBps ≤ maxLoadBps)elseLoadExceedsMax.
settle, the MaxIL formula, or I1–I9. It is a pure pricing clamp in the read/pricing phase. See the invariants.maxLoad itself.
6. Sizing maxLoad — the principled ceiling is premium ≤ MaxIL
What shouldmaxLoad actually be? The principled answer falls straight out of the second cap above: you never charge more than the maximum possible payout, MaxIL. Set the ceiling at premium = MaxIL:
Cancel MaxIL and solve for the load:
This is naturally width/duration/σ-conditional — it falls as fairRate rises, with no extra parameters. The on-chain preferred form evaluates it live and clamps to a sane band:
6.1 Calibrated maxLoadBps ceiling
Static ceiling atσ_ref = 0.75 (normal regime), clamped at 16000:
7. Worked example — one position, three prices
A 50,000 USDC position, ±10% geometric range,σ_ref = 60%, baseLoad = +15%, both skews = 0. MaxIL = 1,280 USDC (2.56% of V0) — identical for all three durations. Only fairRate moves, and the load rides on the resulting FairPremium:
Each published price is
FairPremium · 1.15. Walking the 30d cell through the load dial: @+5% → 952 USDC, @+15% → 1,042 USDC, @+30% → 1,178 USDC, where the ceiling is FairPremium · (1 + maxLoad). The collateral (MaxIL) is constant throughout — over 90d the ±10% band is touched ~75% of the time versus ~24% over 7d, and the S-curve does all the work. Full numbers on the worked-example page.
8. Live on-chain confirmation
The 2026-06-05 create→settle lifecycle on the fresh stack exercises the whole stack and the routing:Path A — cvAMM pool
V0 = $270,531.28, MaxIL = $1,669.24, premium = $9.70 (0.58% of MaxIL), realized IL at settlement = $148.64, payout = $148.64 paid from the
ConvexityVault. The tiny premium fraction reflects a wide/short position — low fairRate, lots of convexity value.Path B — MM won the route
createSwapRouted chose the MM: premium $8.93 (loadBps = 1000) strictly beat the cvAMM price of $13.80. MaxIL = $3,215.65, the MM’s own collateral was locked and paid the realized $245.66 payout from UnderwriterVault. Floor-of-liquidity / ceiling-of-price routing, end to end.9. Summary
The full formula in one line
The full formula in one line
CvammPricing library, mirrored in cvamm.clamp_load. FairPremium comes from the Φ-sum; MaxIL from the geometry.Each term, what it prices, where it lives
Each term, what it prices, where it lives
None of these are hardcoded
None of these are hardcoded
Every regime band, skew curve parameter, and
maxLoadBps is read from the calibrated risk-parameter set (cvAMM block) via LoadParams, set by the owner through InflexionCore.setLoadParams. fairRate itself has no calibrated coefficients — it is an exact closed form. Hardcoding any load/skew/σ primitive is the exact failure the audit flagged.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.