Nothing here is a fund-loss vector. Each item is either (a) a pending
data-surface state that degrades to a typed
pending value rather than an
error, (b) a resolved blocker we still document for transparency, or (c) a
deliberate testnet posture gated by an explicit pre-mainnet checklist. The
on-chain settlement core — collateral = MaxIL, payout = min(realized_IL, MaxIL) — is live and unaffected.Status at a glance
1. Subgraph deploy (live)
The Graph Studio deploy is live: the sluginflexion-arb-sepolia is
deployed and indexing, so the API’s history and precise per-fill MM attribution
surfaces are now backed by an indexer.
Live — resolved. The subgraph is deployed and indexing on The Graph Studio
(query URL
https://api.studio.thegraph.com/query/1754692/inflexion-arb-sepolia/version/latest),
from the redeploy start block 274081134. Historical series and precise MM fill
attribution (the subgraph-backed half of the
data moat) are now queryable, served live from the subgraph
via the hosted API. The per-market
dimension is indexed, so per-market aggregates (/markets) are live too.The typed-pending fallback ('rich-events-absent' / 'no-history-source') remains
a design property: if SUBGRAPH_URL is unset, the SDK and API degrade to a
typed pending state, never an error. See SDK degradation for
the exact typed states.The dataset is still young. The structures and queries are live now, but real
flow is minimal, so the dynamics — regimes, forward-vol distributions, dispersion
— mature with MM competition (≥ 3 MMs) and volume. This is a data-maturity caveat,
not a deployment gap.
- The moat dataset begins at the redeploy block. Three additions —
QuoteFilled,SwapPriced, andCvammPricing.loadComponents()— are live, and the indexer scans from the redeploy block274081134; the on-chain moat dataset begins at that redeploy. This is not lost history — it is the genesis: the rich events did not fire before the FULL-FRESH redeploy of 2026-06-05, so indexing from the redeploy block wastes no scan over blocks that emit none of the moat data. - One entity is schema-ready, not indexer-written.
NetGammaSnapshotis reserved in the schema and listed under InflexionCore’s entities, but no mapping handler currently writes a row — there is noNetGammaSnapshotwrite. The live active-set counters are maintained onProtocolStateinstead, andProtocolState.nextNetGammaBucketexists to drive a future net-gamma roll. Why it is fine: the Greeks fields on this entity are off-chain compute, written back by the API/GreeksEngine — so it is correctly an API-populated surface, not an indexer-populated one. Treat it as such. See Signal 5 / telemetry.
2. EIP-170 size pass (resolved)
Adding the moat events (SwapPriced / QuoteFilled) once pushed InflexionCore
over the 24,576-byte EIP-170 contract-size limit. This is resolved, and we
document it here for transparency.
The deployment registry is authoritative for live state. It records the
23,934 B size and the
optimizer_runs=1500 deploy. When any reference document
and the registry disagree on a deployment fact, trust the registry.3. Sepolia sequencer uptime feed (null)
The OracleManager gates entry and settlement on L2 sequencer
health. On Arbitrum Sepolia that gate is intentionally skipped, because the feed
does not exist on testnet.
This is a deliberate testnet posture, not a code defect. The skip is the
correct response to a non-existent feed; on mainnet the same code path enforces
the gate the moment a real feed address is configured. Nothing about the testnet
skip affects I1 — the no-bad-debt proof is structural and
oracle-independent.
4. σ_ref sits at its floor (at the fresh deploy)
The VolOracle publishesσ_ref = max(σ_short, σ_long, floor), a poke-based time-aware EWMA of Chainlink-tick log-returns. At a fresh
deploy there is no realized history yet, so σ_ref sits at its hard floor.
5. Mainnet addresses are spec / migration references
The docs list two different sets of addresses. Mixing them up is the easiest mistake to make, so it gets its own caveat.A couple of name collisions to keep straight on testnet:
- The demo tokens
dWETH/dUSDCare mock tokens used by the live markets — distinct from the canonical Arbitrum SepoliaWETH9/ Circle-USDC, which exist but are not what the markets use (there is no pre-seeded WETH/USDC v3 pool with material liquidity on Sepolia, so the demo deploys its own pair). See the markets grid and decimals & units. - The Treasury is the same EOA as the deployer on this testnet
(
0x96455C9b00D530BD0629b71B674298440328b1Dd) — a testnet convenience, not a mainnet posture.
6. Heartbeat / staleness — the 90,000s window
The testnet Chainlink feeds tick faster than their mainnet counterparts. The staleness window is chosen so the sameMAX_STALENESS value works on either
chain.
The I8 window subtlety (a documented design observation, not a bug). The
spec-literal staleness
require fires before the lone-spike backstop can
recover the round, so the actual usable settle-via-round-at-T window is
[expiry + LIVENESS_WINDOW, expiry + MAX_STALENESS) ≈ 1 hour wide
(90,000 − 86,400 = 3,600s), not the full additive sum the I8 wording suggests.
Why it is fine: the 1h window is symmetric for LP and MM (it preserves
fairness), and past expiry + MAX_STALENESS funds can still settle via a newer
Chainlink round — Arbitrum majors tick frequently — just not via the round-at-T.
Mitigation: surfaced in the OracleManager NatSpec and pinned by a
boundary test, never papered over. See
the forks for the full Fork-1 resolution.A couple of code-reading footnotes
These are not protocol limitations — they are honest notes for anyone reading the mapping code, included so the source is never mis-read:On-chain distanceBucket is effectively mid|unknown today
On-chain distanceBucket is effectively mid|unknown today
The subgraph’s geometry classifier reports
mid for a well-formed range (and
unknown for a degenerate one), because without an oracle P0 in the handler,
ticks alone only give the geometric centre. Why: the precise
at-edge / near / deep classification needs P0 versus (Pa, Pb).
Mitigation: the API refines the distance axis from P0 once it joins the
oracle price — the on-chain coarse proxy is flagged in the code comment, not
hidden.The ConvexityVault appears as a MarketMaker row
The ConvexityVault appears as a MarketMaker row
handleSwapCreated bumps the counterparty’s MarketMaker aggregate for every
swap, and on Path A the counterparty is the ConvexityVault — so the vault
address shows up as a MarketMaker with fills / exposure / premium.
Why: the indexer uses one counterparty code path for both rails.
Mitigation: cumulativeWinCount and cumulativeQuoteFillCount increment only
for genuine Path-B MMs, and the API distinguishes the vault row when it
surfaces the leaderboard.A misleading variable name in getDepositor (no correctness issue)
A misleading variable name in getDepositor (no correctness issue)
In the ConvexityVault mapping,
getDepositor is correctly keyed by the composite
${address}-${tranche} id, but the internal Depositor.load(...) is passed the
id string while the local variable is named addrHex. Why it is harmless:
the id is correct (it is the composite), so per-tranche separation holds.
Mitigation: flagged here as a naming smell only — there is no correctness
issue.The two guarantees — unchanged by everything above
Every caveat on this page leaves the two headline claims exactly as they are. They are separate claims and must never be merged. The crucial split: the no-bad-debt proof (I1) is structural — collateral= MaxIL ≥ payout — and orthogonal to every pricing oracle. The
FairValueOracle and VolOracle are load-bearing only for the
I10 price cap and depositor solvency, not for the
FULL no-bad-debt invariant. So a σ_ref at floor (item 4), a null testnet
sequencer feed (item 3), or the state of the subgraph data surface (item 1)
cannot create LP bad debt in FULL — they can, at most, misprice the load
(which costs depositors, junior first) or affect a data surface.
Live registry
Network: Arbitrum Sepolia · chainId421614 · 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.
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.
See also
Deployments
The live Arbitrum Sepolia registry — the single source of truth for every
address on this page.
The invariants
I1–I10 stated precisely, with why each holds and where it is enforced and
fuzz-verified.
The two forks
Fork-1 settlement liveness (the 1h I8 window) and Fork-2 the oracle-anchored
price band — both audit-resolved.
The subgraph
The live indexer, the redeploy genesis block, and the typed pending state the
API falls back to if
SUBGRAPH_URL is unset.SDK degradation
The exact typed
pending states the SDK returns if the subgraph URL is unset —
never an error.What this is not
The scope boundary — what Inflexion deliberately does not do, framed the same
Limit → Why → Mitigation way.