ConvexityVault you become
the counterparty to LPs hedging their impermanent loss: you sell convexity and earn
the volatility-risk premium for taking the in-range IL risk LPs want to shed.
But selling volatility is not a savings account. A volatility seller earns a steady
premium in calm markets and pays out in crashes. So a single undifferentiated pool
forces every depositor onto the same risk/return point — and that point is too risky
for a conservative depositor and too tame for a vol specialist. Inflexion’s answer is a
dual-tranche vault from launch: one pool, two claims on it.
Junior — the first-loss vol tranche
Absorbs underwriting losses first, buffers senior, and earns the larger share
of premium. High-APY, high-variance. The “vol-seller” tranche.
Senior — the convexity savings account
Structurally protected from underwriting loss while the junior buffer holds.
Earns a smaller, smoother premium share. Exposed only to the systemic tail.
One vault, two tranches
There is oneConvexityVault per pair, with fungible USDC backing all nine
marketIds for that pair (3 fee tiers × 3 durations). It is
dual-tranche SENIOR / JUNIOR from launch — not a roadmap upgrade, live at the
deployed address.
The vault keeps the two tranches accounted separately end to end:
Two derived quantities drive everything downstream:
freeAssets is what is available to underwrite the next swap; totalLocked is the sum
of collateral (each equal to a swap’s MaxIL) locked against open
positions.
The premium waterfall — money in
Every premium paid on Path A is split before it ever touches a depositor. First the protocol takes its cut, then the remainder is divided across the two tranches.1
99% to the pool, 1% to the treasury
On
_executePathA the premium is split 99% accrued into the vault
(accruePremium) and 1% to the treasury. There is
no per-tranche split at this layer — that happens inside the vault.2
The senior/junior split (accruePremium)
Inside
accruePremium the pool’s share is divided by
a single immutable parameter, seniorPremiumShareBps:seniorPremiumShareBps is immutable and read from the
calibrated risk-parameter set, never hardcoded.The premium split is purely a distribution of income. It does not touch the
no-bad-debt math, the I10 price cap, or
settle semantics —
those are orthogonal. The tranche structure changes who earns and
who loses inside the pool; it never changes what the LP is paid.The loss waterfall — money out
When a swap settles with a positive payout, the LP is paid from locked collateral and the loss is applied to depositors junior-first. The waterfall lives inreleaseAndDistribute:
Junior assets absorb the loss up to their full balance; only what spills over — if
anything — reaches senior. The waterfall first requires payout ≤ lockedAmount
(PayoutExceedsCollateral) and lockedAmount ≤ lockedByMarket[marketId], then unlocks
the collateral, applies the junior-first split, transfers payout to the LP, and emits
JuniorLoss.
The senior-protection invariant — why senior is structurally shielded
The reasonseniorLoss is always 0 is a single structural invariant, enforced at
every lockCollateral via the SeniorProtectionBreached revert:
The proof that this protects senior is two lines. Every payout is capped at its swap’s
MaxIL, and that swap’s MaxIL is exactly the collateral locked for it. So:
Total underwriting loss can never exceed total locked collateral, and total locked
collateral can never exceed the junior buffer — so junior absorbs all underwriting
loss before senior is ever touched (see the no-bad-debt math).
This is the adaptive code form of the roadmap’s u ≤ 1−sf rule, keyed to the
actual junior buffer rather than a fixed ratio — which is strictly safer, because the
guard tracks reality (if junior shrinks, lock capacity shrinks with it). With the
calibrated target ratio sf = 0.60, the junior fraction is 1 − sf = 0.40, so
totalLocked ≤ juniorAssets is exactly the utilization bound u ≤ 0.40 = 1 − sf
under which the depositor calibration holds.
The run defense
Both tranches share a deposit/withdraw model designed so the pool cannot be run even though depositor capital is at risk:- Deposits are instant. Capital can always join.
- Withdrawals are cooldown-gated.
requestWithdrawal→withdrawonly afterwithdrawalCooldownelapses. - Junior cannot be drawn below
totalLocked. TheJuniorBelowLockedrevert forbids withdrawing junior capital that is currently buffering live coverage.
util_skew up as the pool nears full commitment — so marginal
coverage gets more expensive before the pool over-commits, and the buffer that
protects senior is never quietly withdrawn out from under open swaps.
The quant result — what each tranche actually earns and risks
The headline output of the quant is the depositor risk/return profile. The figures below come from the P1.13 heavy run — a deliberately adversarial model that is stronger than GBM: Student-t fat tails (t_df = 4), a
3-state Markov vol regime (calm 0.45 / normal 0.75 / stressed 1.30), tail-dependent
crash correlation → 1 (a single-pair book settles against the same move), Poisson
deep-crash months (~0.8/yr, mean −45%), and a lagging σ_ref so coverage written
at a stress onset is underpriced exactly as it would be on-chain.
The monthly P&L identity makes the volatility-seller nature explicit:
Premium is collected under the risk-neutral measure at the conservative
σ_ref; payout is paid under the real measure. The edge is the
gap between them — the volatility risk premium — earned in calm months and given back in
crashes.
Bare-pool figures (unhedged, untranched)
These are the single-asset bare pool numbers — before tranching, before the optional roadmap hedge — at base loads (calm/normal/stressed = 20/30/50%), gross of demand/competition/fees. Lead with the geometric 3y CAGR, never the arithmetic mean.
How to read these:
- 3y CAGR — the volatility risk premium compounds strongly in the median, with a
wide distribution. The p10 column (50% at
u = 0.40) is the honest downside of the median run, not the worst case. - P(losing month) ≈ 26.5% — roughly one month in four is red. This is intrinsic to volatility selling (you lose whenever realized vol exceeds the implied vol you priced at), not a flaw to be tuned away.
- 1-in-100 month / worst month — the tail of a single bad month. At
u = 0.40a 1-in-100 month is −20.1% and the worst observed is −26.8%; both worsen materially atu = 0.60. - P(3y DD > 50%) — the probability of a peak-to-trough drawdown over 50% across three
years. Utilization is the dominant drawdown lever:
u = 0.40 → 2.7%vsu = 0.60 → 18.0%. - no bad debt ✓ — across every simulated path,
min(IL, MaxIL)/MaxIL ≤ 1.0(max_payout_frac = 1.000000). The LP guarantee holds structurally and oracle-independently even while the depositor P&L swings.
What tranching does to the picture
The dual-tranche structure is the launch lever that turns the bare-pool profile into two genuinely different products:
The senior tranche converts the bare pool’s −26.8% worst month and 26.5% loss-month rate
into a smooth, protected return while the junior buffer holds and utilization stays
disciplined. The junior tranche concentrates the bare pool’s downside (worst −67%) in
exchange for the larger premium slice. Neither is risk-free — junior can lose most of
its principal in a crash, and senior takes the systemic tail once the junior buffer is
exhausted or an assumption (peg / oracle / code) breaks.
There is a third, roadmap lever — a pool-side options hedge (
h ≈ 0.60) that tightens
the tail (1-in-100 → ~−9.6%, P(DD>50%) → ~0%) without much CAGR change. It is
tail-tightening, not solvency (it carries basis risk from approximating a fixed v3
position with a perpetual options hedge), and it is not required for the no-bad-debt
guarantee. Tranching is the launch structure; the hedge is a future enhancement.The mandatory disclosure tone
The quant fixes the exact language depositor surfaces must use:“You earn the volatility risk premium in calm markets and absorb losses in crashes. In FULL the pool cannot become insolvent and cannot be run, but YOUR CAPITAL IS NOT GUARANTEED.”Never call it “stable” or “modest APY.” APY figures are gross of demand, competition, and fees and are model-illustrative — present the risk panel as the robust part and lead with the geometric 3y CAGR, never the arithmetic mean. The model is in fact net-conservative to depositors: the
σ_ref floor of 0.50 sits above calm ETH vol
(~0.45), so the pool overcharges the ~27% of months that are calm, and the heavy run’s
all-months realized payout/premium came in at 0.654.
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.
Two claims, never merged
The tranche structure is where the two load-bearing disclosures sit side by side. They are separate claims and must never be combined. The LP-facing guarantee is structural and oracle-independent — it holds regardless of how the depositor P&L moves: The depositor-facing reality is the opposite: capital is at risk for both tranches, junior first. The crucial split: the LP’s no-bad-debt guarantee (Claim A) is structural —collateral = MaxIL ≥ payout by construction — and is orthogonal to
every pricing oracle and to the tranche split. The depositor’s capital-at-risk
(Claim B) is the economic substance of being a volatility seller.
Senior protection sits inside Claim B (it reduces, but does not eliminate, junior-then-
systemic risk); it is not a separate guarantee and never reaches across to the LP side.
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.
Where to go next
Earn — the depositor app
Deposit into senior or junior, see the live risk panel, and request a withdrawal.
Risk disclosure
The full statement of what each tranche risks and earns.
The cvAMM in depth
Path A end to end: pricing, locking, accrual, and the waterfall.
No-bad-debt math
Why the LP guarantee is structural and orthogonal to the tranche split.