Lives on the Market account, mirrored from oracle observations by the keeper via update_risk_state.
State
Trigger
User mint
User redeem
Mint price
Notes
Normal
Oracle fresh and within confidence
✅
✅
NAV (no markup)
Steady state.
ProxyMode
Oracle stale beyond threshold but recoverable
✅ (size-throttled)
✅
NAV + 2× confidence markup
Best-effort operation; quoting widens.
Stress
Confidence too high, large recent move, or extended staleness
❌ MintNotAllowedInStress
✅
n/a
Defensive: only exits allowed.
Recovery
Post-stress, oracle recovering but not yet fully reliable
✅ (size-throttled)
✅
NAV (no markup)
Wind-down state; sizes ramp back.
The keeper polls oracle staleness and confidence each cycle and calls update_risk_state to mirror the derived risk regime onto each market it operates.
Mint is blocked. You’ll get MintNotAllowedInStress (error code 6010 on mint-redeem). Redeem still works but at the last fresh NAV - useful if you want to exit without waiting for recovery.The mint block is intentional: in Stress, NAV reliability is too low to safely accept new collateral. New deposits can come back when the oracle recovers.If you’re a UI builder, surface this clearly:
“QQQ is currently in Stress mode. Minting is paused; redeem remains open. New positions will resume when the oracle recovers.”
Wind-down. Mint resumes but with size throttling - small mints process normally, large mints can be rejected with ExceedsStressMintCap. The keeper’s seeder also slows allocation to recovering markets.Recovery typically lasts a few minutes after stress clears.
So a 1% confidence at ProxyMode adds 2% to the mint price (markup paid into the collateral vault on behalf of solvency). A 0.5% confidence at Normal adds 0.5% - barely noticeable.This markup is configurable via mint_redeem::configure_worst_case_quoting.
An operator can pause the oracle directly via emergency_pause. This is reserved for emergencies (oracle compromise, programmatic kill-switch). When paused, every read fails - Stress is downstream of this.For “we’re upgrading, please wait”, operators can also flip market.is_active = false via update_market. This is a softer halt that doesn’t cascade through the oracle.