Skip to main content

State machine

Status → trading effect

StatusUser-facing tradingNotes
DRAFT / PROPOSED / PRE_MARKETNot tradeableMarket not yet listed publicly
OPENTradeableOnly state where POST /api/orders succeeds
PAUSEDPlace order rejected 409 market_not_openOrderbook preserved; resume is instant
SUSPENDEDSame as PAUSED, longer-termPeriodic review required per SOP
CLOSEDRejectedKickoff passed; event in progress
PENDING_RESOLUTIONRejectedOracle is resolving
DELAYEDRejectedOracle couldn’t get data; manual review
DISPUTEDRejectedA user challenge is being reviewed
RESOLVEDRejectedTerminal — redemption available
VOIDEDRejectedTerminal — all collateral refunded
CANCELLEDRejectedTerminal — market killed before conclusion

Terminal states — recovering value

StatusHolder of YES + NO shares canWhat to call
RESOLVEDRedeem winning shares 1-for-1 USDC; losing shares are worth 0ConditionalTokens.redeemPositions(...) against the resolved condition. Each winning share = 1 USDC.
VOIDEDRecover the full collateral pair-style — 1 YES + 1 NO redeems for 1 USDCConditionalTokens.redeemPositions(...) with payouts = [0, 0, ...] set by the oracle’s voidMarket() call. Holders of unbalanced positions (only YES, only NO) cannot recover full collateral; merge first via vault.mergePositions(...) and redeem the resulting pair.
CANCELLEDSame as VOIDED — collateral refunded via the void pathSame as VOIDED.
Once a market is in any terminal state, any open orders against it are auto-cancelled into CANCELLED_BY_RESOLVE and locked balances refunded to available — you don’t need to cancel them yourself. See Settlement & Oracle for the end-to-end resolution timeline.

Subscribing to status changes

{
  "type": "market.status",
  "data": {
    "symbol": "UAE-CUP-FINAL-20260425",
    "oldStatus": "OPEN",
    "newStatus": "PAUSED",
    "reason": "stale pricing detected",
    "at": "2026-04-22T14:22:01Z"
  }
}
Market makers should treat any non-OPEN status as “pause all new orders” and wait for the transition back to OPEN.