loadBps or an LP’s geometry/duration choice — measured
against the transparent mechanical baseline, never derived from it. The load
is where that choice lives; σ_ref is the yardstick; geometry is the bucket.
Load
The dealer markup over published fair value. Mechanical
on Path A (a
pure function of pool state); a free choice on Path B (the MM’s
loadBps).σ_ref
The on-chain EWMA realized-vol oracle. Transparent and published — which is what
makes the load charged above it a well-defined, identifiable quantity.
Geometry
Width × distance-to-edge × duration. The LP’s free choice of what to protect;
the bucket every signal is keyed by.
1. Load — the price above fair value
Every premium in the protocol is the published fair value multiplied by one plus a markup, hard-capped at MaxIL: ThetotalLoad is the dealer markup over the protocol’s published fair value —
the part of the price the protocol does not compute from the option math. Where it
comes from depends on the rail (the two rails):
- Path A — the cvAMM pool
- Path B — the market maker
On the cvAMM pool the load is a deterministic,
on-chain
pure function of pool state — fully reproducible from public getters.
This is the mechanical baseline, the price-to-beat. Exactly as deployed:baseLoad— a σ_ref regime band (calm / normal / stressed), not a continuous function of σ_ref.utilSkew(u)— flat below a knee, convex above, capped, onu = locked / total.dispSkew(h)—min(dispCap, dispSlope · h^dispPower), wherehis the per-market coverage HHI (concentration).- The I10 clamp —
total = min(base + util + disp, maxLoadBps·1e14). This is invariant I10 by construction:premium ≤ FairPremium·(1+maxLoad)for any inputs, on both rails, upstream ofsettle.
1.1 The duration-independence subtlety of the Path-A load
This is the single subtlety that decides how the term-structure signal behaves, and it is easy to get wrong. The Path-A load stack is duration-INDEPENDENT by construction — none ofbaseLoadWad, utilSkewWad,
dispSkewWad takes durationSeconds as an argument.
All maturity dependence lives elsewhere — in fairRate,
the exact closed-form Φ-sum, which is the only term carrying the σ_ref·√T dependence.
The factorization is clean:
The consequence for the moat is precise:
So when Signal 3 (term structure of convexity) measures a
slope, the slope it cares about is QuoteFilled.loadBps across durations — an MM
choice, non-circular — never the Path-A load, which is a flat mechanical line by
construction.
2. σ_ref — the transparent realized-vol reference
σ_ref is the yardstick the load is measured against. It is a poke-based,
time-aware EWMA of Chainlink-tick log-returns — never raw realized σ:
It is published on-chain via VolOracle.sigmaRef(token). Three properties make it
the keystone of the moat — see the σ_ref page for the full
derivation and calibrated values (short_halflife = 1d, long_halflife = 30d,
floor = 0.50):
Transparent ⇒ the load is identifiable, not back-solved
Transparent ⇒ the load is identifiable, not back-solved
Because σ_ref is transparent and on-chain, the load charged above it is a
well-defined, identifiable quantity — not a back-solved, non-identifiable
“implied σ_LP”. This is the property that converts the moat from circular to
legible. If σ_ref were hidden, an observed premium could be decomposed into
vol-and-load infinitely many ways; with
σ_ref public, the load is the only free quantity left, and it is exactly the
actor’s choice.
Conservative by design ⇒ the floor overcharges calm months
Conservative by design ⇒ the floor overcharges calm months
The
max(...) is mandatory, not optional engineering: realized vol
understates risk right before a regime change. A single fast EWMA would
collapse to a deceptively calm number exactly before a crash. Taking the max of a
short window, a long window, and a hard floor is the conservative guard. The floor
(0.50) sits above observed calm ETH vol (~0.45) on purpose, so the pool
overcharges calm months and is net-conservative to depositors.Backward-looking by design ⇒ the residual is MM alpha
Backward-looking by design ⇒ the residual is MM alpha
σ_ref is backward-looking — and the residual forward-looking premium is
deliberately left as MM alpha. That residual blindness is the incentive that keeps
MMs in the two-sided market, and it is exactly what
Signal 2 (the pool-vs-MM spread) extracts: the MM’s forward
view, measured against the pool’s backward-looking σ_ref.
σ_ref is solvency-load-bearing for depositors, not for LP no-bad-debt. A
wrong/too-low σ_ref makes the pool under-charge load, so premium income stops covering
payouts and NAV compresses — junior absorbs it first, senior in the tail. It is
NOT load-bearing for the FULL no-bad-debt invariant (I1),
which stays structural and oracle-independent: in FULL, collateral = MaxIL ≥ payout
regardless of what σ was. Two separate guarantees, never merged.
3. Geometry — the position the LP brings
The third primitive is the bucket. Every behavioral signal is keyed by width × distance-to-edge × duration — the LP’s free choice of what to protect:
Geometry is not stored in any event. No
SwapPriced / QuoteFilled /
SwapCreated field carries the range ticks. Geometry is recovered off-chain by
decoding the swap’s tokenId via NPM.positions(tokenId) at the SwapCreated block
(range ticks → Pa/Pb), plus expiry − createdAt for duration. That archive
positions decode is the one enrichment every geometry-bucketed signal (1, 3, 4)
requires.
Why bucketing the load by geometry is informative rather than noisy.
MaxIL is the unit that makes positions fungible and the load
range-agnostic: premium is quoted as a fraction of MaxIL, so MM/pool return-on-capital
is range-independent and there is no adverse selection on range width. That is why an
MM quote is per-market (a load + a MaxIL-ratio band + capacity), never per-NFT —
the
SignedQuote carries no tokenId. With the level normalized out by MaxIL, what
remains in the bucketed load is the actor’s view, which is exactly what makes the
geometry buckets a clean signal.4. The on-chain moat events
The 2026-06-05 redeploy landed the two events that record these primitives at every fill, plus the on-chain load decomposition. They are LIVE on-chain now; only the subgraph that indexes them is pending.1
SwapPriced — the mechanical baseline
The per-fill clearing-price record, emitted on all three create paths.
2
QuoteFilled — the behavioral datum
The single non-circular load datum, emitted on every Path-B fill.
3
loadComponents — the on-chain breakdown
The
pure library function that decomposes the pool load into its three skews and
feeds SwapPriced.4.1 SwapPriced — the per-fill clearing-price record
Emitted at the end of_executePathA / _executePathB:
tokenId from SwapCreated) the hook for
the geometry decode — with no archive eth_call:
The fair-value baseline the load multiplies. Added so the load can be normalized
against fair value — without it, neither the pool’s realized-load fraction nor the
MM’s load is normalizable.
uint256 (WAD)
The mechanical Path-A load decomposition (the
loadComponents output). On a
Path-B fill these fields describe the pool quote the MM beat — the
price-to-beat — which is exactly what Signal 2’s spread needs.uint256 (WAD)
The σ_ref the swap was priced against. Emitted on every fill, so the subgraph
backfills the σ_ref series between
VolOracle.Poked events (poke is a no-op
emitting nothing when dt < minSampleInterval).bool
true ⇒ the premium hit the MaxIL cap ⇒ the load was truncated
⇒ zero load information. Added because deriving premium == MaxIL off-chain is
brittle (rounding); the explicit flag lets every consumer filter cap-bound fills
cheaply.SwapPricing struct and emitted
via the split-out _emitPriced so the wide event does not inflate the create
function’s stack frames.
4.2 QuoteFilled — the single non-circular load datum
Emitted on every Path-B fill in_executePathB:
loadBps,
attributed to the exact quote and nonce. It is capped only by
loadParams.maxLoadBps (I10) — the protocol does not compute it, which is the
whole reason it is behavioral rather than circular (see
circular vs behavioral). It also closes the
pre-redeploy “coarse fill attribution” gap: previously SwapCreated / SwapRouted
carried no quoteId / nonce, and isNonceUsed was true on both fill and
cancel, so a fill could not be cleanly attributed to a quote.
The subtraction is the point. Signal 2 reports the spread
poolLoad − mmLoad = SwapPriced.totalLoadWad − QuoteFilled.loadBps. The mechanical
leg (Path A) and the behavioral leg (Path B) arrive in two joined events with no
archive call; their difference isolates the MM’s view relative to the transparent
baseline, and the subtraction is exactly what removes the circular component. Path A is
never sold as a behavioral signal — it is the transparent yardstick the MM load is
subtracted from.4.3 CvammPricing.loadComponents — the on-chain breakdown
The pool load decomposition that feedsSwapPriced is computed on-chain by:
InflexionCore._pricePathAFromFair. The returned components are
pre-clamp — so base + util + disp may exceed total — while total is the
I10-clamped sum.
4.4 The supporting events the moat relies on
SwapPriced and QuoteFilled are the two new moat events; they sit on top of the
existing lifecycle events:
5. How the primitives compose into signals
The three primitives recombine into the five signals by a single template — behavioral leg, measured against the mechanical baseline:
The exact definitions, sourcing, and maturity of each live on the
five signals page; the rigorous circularity reasoning — including
why inverting
fairRate is circular and was deliberately dropped — is on
circular vs behavioral.
State and limits
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.