(a) The load-bearing cap
Payout is
min(realized_IL, MaxIL). Locking collateral = MaxIL makes payout ≤ collateral true by construction — the structural core of no-bad-debt.(b) The unit of risk
MaxIL is L-independent (in the fair-rate sense) and frozen at creation, so positions become fungible to an underwriter — which is why MM quotes are per-market, never per-NFT.
(c) The pricing denominator
The premium is quoted as a percentage of MaxIL, not of position value. This is what makes the underwriter indifferent to range width and gives the market full depth.
The one-line mental model from the math: 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:MaxIL carries none of the vol/time dependence — that all lives in fairRate.What MaxIL is
Let price be the price of token0 in token1 (e.g. ETH measured in USDC). A position is liquidity over a tick range , opened at with the in-range requirement enforced at creation (out-of-range entries revertPositionOutOfRange). In-range impermanent loss is the gap between just holding the entry basket and what the LP position is actually worth:
MaxIL is the maximum value that gap takes while price stays in range:
ILMath.computeMaxIL computes it on-chain. It is pure geometry — a function of only, with no vol and no time. See the full IL setup in the IL formula and the boundary proof in the MaxIL derivation.
Why the maximum is at a boundary
is convex on , so it attains its maximum at an endpoint:- is affine in .
- In range, , so ⇒ is strictly concave.
- , and (a pointwise max of convex functions) is convex too.
- A convex function on a compact interval attains its max at an endpoint. ∎
(a) MaxIL as the load-bearing cap
The protocol does not cover unbounded IL. Above the LP has fully rotated into token1, so is constant while keeps growing linearly with price — absolute IL is unbounded beyond the range. Anything promising to cover that could not be fully collateralized, so it could not be trustless. The protocol therefore covers the capped payoff: Lock exactlyMaxIL of collateral at creation, and the no-bad-debt argument becomes a three-line construction:
I1 (payout ≤ collateral == MaxIL), I2 (payout == min(realized_IL, MaxIL)), and I3 (the guarded, never-underflowing subtraction). See the invariants and the no-bad-debt math.
The cap is also verified empirically. The heavy calibration run measured the payout fraction min(IL,MaxIL)/MaxIL over a ±99% (and widened −6…+6 log-move) grid on every simulated path: max_payout_frac = 1.000000, zero exceptions — structurally, independent of any oracle.
(b) MaxIL as the unit of risk → positions are fungible
MaxIL is frozen at creation, identical across the three durations (7/30/90d) for a given position, andL-independent in the fair-rate sense — fairRate depends only on , , , , not on . Those properties together are what make positions fungible to an underwriter within a market.
Because every position in a market reduces, for pricing purposes, to a normalized geometry plus a MaxIL, an underwriter does not need to quote each NFT individually. They express a single view over the whole market — and any position that fits fills against it.
Why this means MM quotes are per-market, never per-NFT
This is the direct mechanical consequence of fungibility. TheSignedQuote struct carries a marketId — keccak256(token0, token1, fee, durationSeconds) — and has no tokenId field at all:
(load, MaxIL-ratio band, capacity) — for an entire marketId, and any LP position in that market fills against it. At fill, the contract computes the LP’s own ratio and requires it lie in [minMaxILRatioBps, maxMaxILRatioBps], else reverts RatioOutOfBand. So an MM expresses “I write positions whose MaxIL is 2%–7% of V0” once, and the contract enforces it per-fill — positions within the band are interchangeable.
Post-pivot, the MaxIL-ratio band is a convenience filter, not an asymmetry fix. The old “the LP knows the range and the MM does not, so the MM quotes a band to avoid adverse selection” framing is void and deleted — v3 position parameters are public on-chain, so both rails read the exact geometry. See two rails.
(c) Why the premium is quoted as a percentage of MaxIL
This is the key pricing innovation, and it follows directly from MaxIL being the unit of risk. The premium is denominated as of MaxIL — equivalently, of the underwriter’s posted collateral — never as a percentage of position value . Consider the counterfactual. If premium were of :Reference magnitudes — MaxIL as a fraction of V0 by width
These are pure geometry (no vol, no time), for a geometric-symmetric range . They are the verified outputs ofcompute_max_il, and ILMath computes them correctly on-chain:
Worked fixture [80, 100, 125], L = 1e18 (verified to the wei)
Asserted by the amounts_fixture_matches_python / maxil_fixture_matches_python tests and mirrored in the Solidity test suite:
confirms the upper-boundary asymmetry, and . The on-node integer-floor MaxIL sits 1,691 wei from the Python float anchor — inside the 10,000-wei float-vs-integer tolerance; Stylus ≡ Solidity is exact to the wei.
One position, three prices — same MaxIL
This is the property that proves MaxIL carries none of the vol/time dependence. Take a 50,000 USDC position, ±10% geometric range, ,baseLoad = +15%, skews = 0. MaxIL is identical for all three durations; only fairRate moves:
Collateral (MaxIL) is constant at 1,280 USDC for all three; the S-curve does all the work. Over 90d the ±10% band is touched ~75% of the time vs ~24% over 7d — so the product carries the most convexity value for wide/short positions (cheapest fraction of MaxIL) and the least for tight/long (e.g. ±5%/90d: fairRate ≈ 91%, effectively pre-paying a near-certain loss). See
fairRate and the S-curve and the full worked example.
Live on-chain confirmation
The 2026-06-05 create→settle lifecycle on the Arbitrum Sepolia stack used a real MaxIL on both rails:- Path A (cvAMM): V0 = $270,531.28, MaxIL = $1,669.24, premium = $9.70 (0.58% of MaxIL — a wide/short position, low fairRate), realized IL at settle = $148.64, payout = $148.64 ≤ MaxIL, paid from the
ConvexityVault. - Path B (MM won the route): MaxIL = $3,215.65, the MM’s own collateral locked = MaxIL, realized IL = $245.66, payout = $245.66 ≤ MaxIL, paid from
UnderwriterVault.
payout ≤ MaxIL = collateral held end to end — I1 and I2 in production. See live addresses on the deployments page.
Network: Arbitrum Sepolia · chainId 421614 · 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.
FAQ
Does MaxIL change if the LP adds liquidity after creation?
Does MaxIL change if the LP adds liquidity after creation?
No. MaxIL is computed from the liquidity
L stored at creation in the SwapRecord, and settlement re-reads that stored L, never the live NFT (invariant I6). Anyone can increaseLiquidity on a custodied v3 NFT, but the extra liquidity is simply returned with the NFT at settlement and cannot inflate payout above MaxIL. See the invariants.Is MaxIL the worst case an LP can suffer?
Is MaxIL the worst case an LP can suffer?
No — it is the worst case while price stays in range. Beyond the range the LP’s absolute IL is unbounded (fully rotated into one asset while a hold position keeps tracking price). That uncovered region is directional loss, not impermanent loss, and is deliberately out of scope — covering it would break full collateralization. LPs who want beyond-range protection re-cover after re-ranging.
If two positions have the same MaxIL, are they the same risk?
If two positions have the same MaxIL, are they the same risk?
No. MaxIL is a collateral / normalization unit, not a risk metric. Two positions with identical MaxIL can sit at very different distances from the current price and carry very different probabilities of touching the cap. Both the pool and MMs price the specific on-chain geometry —
E_Q[min(IL,MaxIL)]/MaxIL — not MaxIL in isolation.Why quote in MaxIL instead of dollars or % of position value?
Why quote in MaxIL instead of dollars or % of position value?
Quoting
X% of MaxIL makes the underwriter’s return-on-collateral independent of range width, so they are indifferent to writing narrow vs wide positions — no adverse selection, full depth. Quoting % of V0 would hand narrow ranges an enormous ROC and starve wide ranges, fragmenting liquidity.Where to go next
The MaxIL derivation
The full boundary proof, the asymmetric-entry case, and the verified fixtures.
The IL formula
V_hold vs V_lp, the three regimes, and the guarded realized-IL subtraction.Fair value & fairRate
The exact closed-form Φ-sum that turns geometry + σ + T into a price.
No-bad-debt
How
payout ≤ collateral = MaxIL becomes a construction, qualified correctly.