fairRate” framing is circular, states
the decision rule that separates real signal from echo, and gives the decision table
every one of the five signals is checked against.
loadBps or the LP’s
geometry/duration — measured against the protocol’s transparent mechanical
baseline, never derived from it.The circular idea we deliberately dropped
An earlier draft of the moat framed the headline signal as “recover the market’s implied volatility by inverting our publishedfairRate from the charged
premium”. It sounds like an options desk:
observe a price, invert your pricing model, read out the implied vol the market is
trading. We dropped it as circular — and the reason is worth showing in full,
because the rigor is the point.
The mechanical identity that makes it a tautology
Every premium the protocol charges is, by construction, this identity: There are only two unknowns on the right, and the protocol publishes both of them:- is the protocol’s own closed form — the exact
Φ-sum computed on-chain by the Stylus
FairValueOracle. It is not a market estimate; it is a deterministic function we evaluate and emit. - is the protocol’s own published realized-vol oracle — a
poke-based EWMA of Chainlink-tick log-returns, readable on-chain via
VolOracle.sigmaRef(token)(σ_ref).
fairRate” to back out the volatility implied by an observed
premium. What do you get? You feed in a premium that we computed using a
that we published, run our published
backwards, and — to within the dealer load stack — you recover exactly the
you could have read directly off-chain for free:
A real implied vol would have to come from somewhere we don’t control
The contrast sharpens the point. On a real options venue, implied vol is informative because the price is set by someone other than the pricer — the market quotes, you invert your model, and the gap between your model’s vol and the quoted vol is the market’s view. Here, the “price” you would invert is the price we computed from our published vol. The only genuinely external thing in the premium is the load the actor chose to charge — and that is exactly what we keep. Everything else is the protocol talking to itself.The non-circularity decision rule
The fix is a single rule:loadBps or the LP’s geometry/duration choice — measured against the
transparent mechanical baseline, not derived from it.The degrees of freedom must be an actor's free choice
- The MM’s signed
quote.loadBps(Path B) — an external actor’s freely chosen markup, capped only byloadParams.maxLoadBps(invariant I10), never computed by the protocol. - Which
tokenIdan LP brings, and the duration chosen — LP demand choice; the protocol does not pick the geometry.
fairRate, the pool’s
load stack — it has no free degrees of freedom. Inverting it recovers our own
formula. That is the circular failure mode.It must be measured against the baseline, not derived from it
totalLoad) and read the
difference. The subtraction — behavioral minus mechanical — is precisely what
removes the circular component. Derive the signal from
the baseline and you are back to inverting our own formula; measure it against the
baseline and the residual is the actor’s view.loadBps is a clean, range-agnostic actor choice — informative
when bucketed by geometry rather than noisy.
The decision table
Every candidate number is run through the rule. This is the table the moat is audited against:The two corollaries that fall out of the rule
The decision rule has two consequences that recur in every signal. Internalize them once here; the five-signals page applies them per signal.Corollary 1 — the mechanical pool load is the “price-to-beat”, not a signal
The Path-A pool load is a YES row — fully circular on its own. But it is not deleted; it is kept as the transparent yardstick the behavioral MM load is subtracted from. Its entire job is to be the price-to-beat: the mechanical quote the MM either undercuts or retreats above. The spread — behavioral MM load minus mechanical pool load — is what Signal 2 extracts, and the subtraction is precisely what removes the circular component. This is why the pool load surface is the one live SDK read today:getCurrentLoadSurface recomputes the price-to-beat client-side from public getters
via the parity-locked CvammPricing TypeScript port. The mechanical baseline being
fully reproducible from public getters is exactly what makes the behavioral MM
load measurable against it.
Corollary 2 — cap-bound fills carry zero load information and MUST be excluded
When a premium is truncated by the cap —premium == MaxIL — the number you observe
is the cap, not the actor’s load. The load was clipped by the geometry of MaxIL,
so the fill carries zero load information and must be excluded from the load
surfaces (Signals 1, 2, and 3).
This is not an off-chain heuristic that depends on brittle floating-point equality.
Deriving premium == MaxIL off-chain is fragile under rounding, so the protocol
emits an explicit cappedAtMaxIL boolean on the SwapPriced event so every
consumer can filter cap-bound fills cheaply and unambiguously:
How the rule classifies the five signals
The decision rule and its two corollaries produce the non-circularity verdict for each of the five signals. The verdicts below are exact — each states which leg is behavioral and which is the kept baseline.Signal 1 — clearing LOAD over a transparent σ_ref: PARTIAL (Path B only)
Signal 1 — clearing LOAD over a transparent σ_ref: PARTIAL (Path B only)
QuoteFilled.loadBps) is an MM free choice → non-circular.
The Path-A load (SwapPriced.totalLoadWad = f(σ_ref, util, conc)) is a
deterministic function of protocol state → circular; keep it as the mechanical
baseline the MM is measured against, do not sell it as a behavioral signal. Exclude
cap-bound fills.Signal 2 — pool-vs-MM load SPREAD + win-rate: YES (as a spread)
Signal 2 — pool-vs-MM load SPREAD + win-rate: YES (as a spread)
SwapPriced on the Path-A
candidate) and MM load (behavioral, QuoteFilled.loadBps). The difference
isolates the actor’s view relative to the transparent baseline — the subtraction is
exactly what removes the circular component. This is the
purest expression of Corollary 1.Signal 3 — TERM STRUCTURE of convexity (slope across 7/30/90d): PARTIAL — and watch the subtlety
Signal 3 — TERM STRUCTURE of convexity (slope across 7/30/90d): PARTIAL — and watch the subtlety
QuoteFilled.loadBps across durations is behavioral →
non-circular. For Path A, the load stack is duration-INDEPENDENT by
construction — baseLoadWad/utilSkewWad/dispSkewWad take no durationSeconds,
so a Path-A “term structure of load” is a flat line.
All maturity dependence lives in fairRate(...,T), our own .
Do not conflate the published fairRate term structure (mechanical) with the
behavioral load term structure (Path B). Exclude cap-bound fills.Signal 4 — moneyness / DEMAND skew by geometry: PARTIAL
Signal 4 — moneyness / DEMAND skew by geometry: PARTIAL
tokenId/duration to bring) →
non-circular for the fills we see. But on-chain we observe only realized
purchases, biased by quote availability; true demand including UNFILLED interest
is off-chain (relayer /quote requests, SDK previewPremium pings). The latent
half cannot be on-chain by design — invariant I7 guarantees an unchosen quote
touches no nonce/capacity.Signal 5 — net convexity / GAMMA supply: YES (as a supply/quantity gauge)
Signal 5 — net convexity / GAMMA supply: YES (as a supply/quantity gauge)
ILMath.computeIL /
FairValueOracle.fairRate, anchored to protocol math with no parallel model.Why this rigor is itself part of the moat
Anyone can claim “we have an implied-vol surface.” The defensible move is to show the math of why the naive version is circular and then ship the version that isn’t. That is what separates a real microstructure dataset from a re-skinned echo of our own oracle. The honest framing — and the reason this page exists — is that the moat is credible because we can derive, line by line, why invertingfairRate recovers
nothing, and where the genuine information actually enters: the MM’s loadBps and the
LP’s geometry, measured against a baseline we publish in full.
For the behavioral signals in depth, see the five signals; for
the on-chain primitives that emit them, see the moat primitives;
for the live-vs-pending state of each surface, see state and limits.
- 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.