Skip to main content
This is the flat lookup table for every constant the protocol reads. There are two kinds, and the distinction is load-bearing for correctness:
  • Hard-coded protocol constants — fixed in the contract source. Settlement timing, the price-band envelope, the validity window, the dust floors. These are safety bounds, not pricing knobs: they constrain when and how a swap can settle, never how much it costs.
  • Calibrated parameters from the calibrated risk-parameter set (the cvAMM block) — the baseLoad regimes, both skew curves, maxLoadBps, and the σ_ref windows/floor. No PARTIAL or pricing primitive is ever hard-coded — every one is read from the Monte-Carlo output. Hard-coding any of them is the exact failure the audit flagged.
One rule decides which bucket a constant lives in. Anything that prices risk (load, skew, regime band, σ_ref window) comes from the quant. Anything that bounds liveness, fairness, or correctness (settle timing, bands, floors) is a fixed constant. fairRate itself has no calibrated coefficients at all — it is an exact closed-form Φ-sum, so there is no “fairRate constant” to tune.

Settlement constants

The settle path pins the price to the Chainlink round active at expiry T (so no party can pick a favorable instant by timing settle), then gates it with three health checks. These constants define those gates and the liveness backstop.

How the settlement gates compose

The Chainlink round is the price; the TWAP is a non-blocking advisory; the lone-spike check and the liveness backstop together guarantee settle always succeeds in a bounded window:
1

Pin the round at T

getSettlementPrice(token, expiry, hintRoundId) walks to the Chainlink round with updatedAt ≤ expiry < nextUpdatedAt. The hintRoundId is keeper-supplied and verified on-chain — it cannot move the price, only locate the round.
2

Health-gate it

Sequencer up + GRACE_PERIOD, age ≤ MAX_STALENESS, and the lone-spike sanity check (differs from both neighbours by ≥ LONE_SPIKE_BPS).
3

Backstop if deferred

If the lone-spike check defers, settle is retryable; once block.timestamp ≥ expiry + LIVENESS_WINDOW, the round-at-T is accepted unconditionally by the backstop.
The invariant (I8) is stated as: settle() always succeeds within expiry+LIVENESS_WINDOW+MAX_STALENESS+GRACE_PERIOD.\texttt{expiry} + \texttt{LIVENESS\_WINDOW} + \texttt{MAX\_STALENESS} + \texttt{GRACE\_PERIOD}.
Limit → Why → Mitigation. The spec-literal staleness require fires before the backstop can recover a deferred round, so the actual usable backstop window is [expiry + LIVENESS_WINDOW, expiry + MAX_STALENESS) ≈ 1 hour wide (90,000 − 86,400 = 3,600 s), not the full additive sum the I8 wording suggests. Why it is acceptable: the window is symmetric for LP and MM (it preserves fairness — neither side can exploit it), and past expiry + MAX_STALENESS funds still settle via a newer Chainlink round (Arbitrum majors tick frequently), just not via the round-at-T. Mitigation: the behavior is documented in NatSpec and pinned by a boundary test (test_I8_revertsPastStaleness_boundary), not papered over. See the forks.

The price band — [25, 500] bps

A Path-B signed quote carries quotePrice (the oracle price the MM saw at signing) and priceBandBps. At fill, the contract reads the live oracle once (the same read that pins P0 — zero extra oracle cost) and auto-voids the quote on-chain, deterministically if the price has drifted beyond the band: createSwap reverts  ⟺  absBps(Plive, quotePrice)>priceBandBps.\texttt{createSwap reverts} \iff \texttt{absBps}(P_\text{live},\ \texttt{quotePrice}) > \texttt{priceBandBps}. This is Fork 2 / I9 — deterministic, no MM discretion at fill, so it is not last-look.
Path A has no band. The cvAMM has no signed quote and prices off the live oracle directly, so it has no stale-quote vector at all. The band is a Path-B-only protection.

The validity window — [5, 15] s

A signed quote also carries validUntil (an absolute timestamp). The protocol enforces that the quote’s lead time secondsAhead falls in a tight band — this bounds how long a bearer signed payload can survive in an observer’s hands (signed quotes are bearer instruments that outlive any off-chain cancel). The validity window is a latency control, not risk capital: the oracle band is the primary stale-quote defense; the short clock is a secondary leakage-window control on top of it. Together with on-chain selective nonce invalidation (Permit2-style bitmap), these are the three deterministic Path-B protections — none of which is last-look.

Dust floors

Two minimums block dust swaps that would grief capacity and open the integer-division free-coverage edge. Both are enforced on all three entry points.
Premiums round UP, never down. Alongside the floors, every premium is computed as ceilDiv(...) (round up — finding F-#8), so integer division can never under-charge the LP into free coverage.

Calibrated load / skew / regime values (from the calibrated risk-parameter set)

These are the only pricing parameters, and none is hard-coded — every one is read from the cvAMM block of the calibrated risk-parameter set (validated against its schema) and set on-chain by the owner via setLoadParams. The premium is premium=FairPremium⋅(1+baseLoad+util_skew+dispersion_skew⏟clamped to ≤ maxLoad),\text{premium} = \text{FairPremium}\cdot\bigl(1 + \underbrace{\text{baseLoad} + \text{util\_skew} + \text{dispersion\_skew}}_{\text{clamped to } \le\ \text{maxLoad}}\bigr), with the I10 clamp totalLoad = min(baseLoad + util_skew + dispersion_skew, maxLoad) making overcharge impossible by construction. See the load stack for the full derivation. WAD-scaled: 1e18 = 1.0 = 100% load, 1 bps = 1e14 WAD.

baseLoad — the structural volatility-risk premium, banded by σ_ref regime

The load over fair value, keyed by which σ_ref regime band the market is in. Motivated by the lone-writer CVaR gap (~91–100% of MaxIL for a single writer) that diversification collapses:
Do not confuse the load regime with sigmaComponents.binding. The regime (calm/normal/stressed) is σ_ref measured against the baseLoad bands above. binding (0 = short EWMA, 1 = long EWMA, 2 = floor) is which input set σ_ref — a different classification entirely.

util_skew — utilization scarcity (the drawdown lever)

Rises as the pool nears full commitment, on u = locked / (locked + free). Flat below a knee, convex above, capped: util_skew(u)=min⁡ ⁣(cap, slope⋅(max⁡(0, u−knee)1−knee)power)\text{util\_skew}(u) = \min\!\Bigl(\text{cap},\ \text{slope}\cdot\Bigl(\tfrac{\max(0,\ u - \text{knee})}{1 - \text{knee}}\Bigr)^{\text{power}}\Bigr) The same locked/free accounting that prices new coverage up before over-commitment also powers the withdrawal-cooldown run defense. The heavy run found utilization is the dominant drawdown lever: u = 0.40 → P(3y DD>50%) = 2.7% vs u = 0.60 → 18.0%.

dispersion_skew — single-pair concentration (the honest analogue)

Rises as outstanding coverage clusters in one width/moneyness/duration corner — many positions bunched at one edge all hit MaxIL together in one move. Measured by a normalized Herfindahl index h ∈ [0, 1] over the MaxIL-weighted coverage histogram, computed O(1) from an incremental Σ lockedByMarket² accumulator: dispersion_skew(h)=min⁡ ⁣(cap, slope⋅hpower)\text{dispersion\_skew}(h) = \min\!\bigl(\text{cap},\ \text{slope}\cdot h^{\text{power}}\bigr) This is single-asset calibrated — it deliberately does not inherit the degenerate cross-asset correlation k ≈ 1.0, which collapses to a useless constant on a one-pair book.

maxLoadBps — the I10 ceiling

The principled ceiling is premium ≤ MaxIL — never charge more than the maximum possible payout. Since premium = fairRate·MaxIL·(1 + load), that gives maxLoad = 1/fairRate − 1, naturally width/duration/σ-conditional. The on-chain form evaluates it live and clamps: maxLoadBps=clamp ⁣(round((1/fairRate(σref)−1)⋅10000), floor, 16000)\texttt{maxLoadBps} = \mathrm{clamp}\!\Bigl(\mathrm{round}\bigl((1/\text{fairRate}(\sigma_\text{ref}) - 1)\cdot 10000\bigr),\ \text{floor},\ 16000\Bigr) Static ceiling at σ_ref = 0.75 (normal regime), clamped at 16000: Tight/long cells get tiny load room — economically exact: a near-certain payout (fairRate ≈ 1) cannot carry a risk premium beyond itself.

σ_ref windows + floor (the only stochastic pricing input)

σ_ref = max(σ_short, σ_long, floor) — a conservative max of two time-aware EWMAs of Chainlink-tick log-returns plus a hard floor. The windows and floor are calibrated, not hard-coded:
The floor sits above calm ETH vol on purpose. floor = 0.50 > ~0.45 observed calm ETH vol, so the pool overcharges calm months and is net-conservative to depositors (heavy-run all-months realized payout/premium = 0.654). And the max(...) construction is mandatory, not optional engineering: realized vol understates risk right before a regime change, so a single fast EWMA could collapse to a deceptively calm number exactly before a crash. See σ_ref.

Decimals & fixed-point units

The unit constants every amount is denominated in: For the full units convention and SDK helpers, see addresses & units and decimals & units.

Quick reference — which constants come from the calibrated risk-parameter set

Settlement timing (GRACE_PERIOD, MAX_STALENESS, LONE_SPIKE_BPS, LIVENESS_WINDOW, TWAP_WINDOW, MAX_DEVIATION_BPS), the price-band envelope (PRICE_BAND_MIN_BPS = 25, PRICE_BAND_MAX_BPS = 500), the validity window (VALIDITY_MIN_S = 5, VALIDITY_MAX_S = 15), and the dust floors (MIN_POSITION_V0 = $100, MIN_PREMIUM = $1). These bound liveness, fairness, and correctness — never price. They live in OracleManager and InflexionCore.
The baseLoad regime bands (20/30/50%), util_skew (knee/slope/power/cap), dispersion_skew (slope/power/cap), maxLoadBps (or its live 1/fairRate − 1 form), and the σ_ref windows + floor (short_halflife, long_halflife, floor = 0.50). Read from the Monte-Carlo output, validated against its schema, set on-chain via setLoadParams. fairRate itself has NO calibrated coefficients — it is an exact closed form, so there is nothing to tune there.
Hard-coding any PARTIAL or pricing primitive is the exact failure the external audit flagged. Keeping every load/skew/σ value in the calibrated risk-parameter set is what lets the quant gate PARTIAL and re-calibrate without a contract change. The safety bounds are fixed precisely because they must not be tunable by anyone — a tighter liveness window or a looser dust floor would be a vector, not a feature.
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 pending state — never an error.

See also

The load stack

The full derivation of baseLoad + the two skews + the I10 clamp, with worked numbers.

σ_ref — the vol oracle

Why the EWMA max(…) is mandatory and the floor sits above calm vol.

The forks

How the settlement constants and the price band resolve the two audited deadlock / pickoff classes (I8, I9).

The invariants

The ten invariants these constants enforce — I8 (liveness), I9 (band), I10 (cap).

The oracles

How OracleManager and VolOracle apply these constants at entry and settlement.

Deployments

The live Arbitrum Sepolia registry — the source of truth the constants are read against.