Settlement
Settlement posts one fraction per outcome, converts every Yes to it and every No to the rest in the quote token, then prunes the outcome from the live list.
One settler per outcome decides what happened, and posting its fraction pays every holder in the same step. Trading stops on a known result.
Take outcome 95, which asked whether BTC would be at or above 77,363 at 06:00 UTC on 2026-05-26. The protocol settled it at a price of 76,876.9, below the target:
settleFractionwas"0.0"→ every Yes converted to 0.- Every No converted to 1 USDC, before fees.
Who settles, and to what
Section titled “Who settles, and to what”| Settler | Markets | How |
|---|---|---|
| The protocol | its own recurring markets (class: descriptions) |
on a fixed cadence; the settled record carries the price used in details, such as price:76876.9 |
| The deployer | every template market it registered | usually through an API wallet with one signature, or a sub-deployer granted settle permission; only its own outcomes and questions |
The settle fraction f goes to side 0 (Yes), 1 - f to side 1. A standalone outcome may settle to any fraction, such as "0.66" for a scalar; aiModelHeadToHead, sportsContestWinner, sportsOverUnderMarket and sportsScalarMarket allow 0.5 for a draw or a void, and the scalar templates settle to exact fractions.
A question has exactly one winner, settled either way below. The fallback is never named: it settles to 0 automatically when the winner is posted.
| Path | How |
|---|---|
settleQuestion2 |
every remaining named outcome in one action, one at 1 and the rest at 0 |
settleOutcome |
one at a time: losers to 0 in any order, then the last remaining outcome may settle to 1, which settles the question |
How price markets settle
Section titled “How price markets settle”A recurring binary settles Yes if the mark price, linearly interpolated to the settlement time, is at or above the target:
Yes if markPrice0 + (settlementTime - t0) / (t1 - t0) * (markPrice1 - markPrice0) >= targetPrice
t0, t1 = timestamps of the mark price updates immediately before and after settlementTimeRecurring price buckets use the same price. binaryPrice and scalarPrice use a TWAP over a stated number of seconds, and priceTouch can settle as soon as the price touches its target.
After settlement
Section titled “After settlement”- Every holder receives one settlement fill; the losing side’s has a notional of 0.
- The outcome is pruned from
outcomeMeta(listed means unsettled), in practice within about a minute. settledOutcomestill answers for pruned outcomes (verified on 69 ids), with the spec,settleFractionanddetails.- The deployer’s active-outcome capacity is freed.
The numbers
Section titled “The numbers”| Item | Value |
|---|---|
settleFraction |
decimal string from "0" to "1" |
| Question outcome fraction | exactly "0" or "1" |
| Payout per Yes | f quote tokens |
| Payout per No | 1 - f quote tokens |
details on a deployer settlement |
must be empty |
Precompile 0x814 settledValue |
1e8 = 1.0 |
| General settlement window | none; sports templates publish a resolutionDeadline, price templates only a time |
| Fee | closing side only, base spot rate x (scale + max(scale, 1)), scale from 0 to 10 |
| Maker rebates | none on outcomes |
Trading into settlement
Section titled “Trading into settlement”Fees. Of the scale + max(scale, 1) multiplier, the deployer keeps scale, its fee scale, and the protocol the rest. Referral discounts apply; accounts that would earn a maker rebate pay zero on outcome maker orders instead (fees, deployer economics).
Arm the dead man’s switch. Once a result is knowable, a resting order at the old price is a free option for whoever sees it first. scheduleCancel cancels every open order at a time at least 5 seconds ahead, up to 10 times a day (reset at 00:00 UTC); omitting time clears it (orders).
Know the rule: an interpolated mark for recurring binaries, a TWAP for binaryPrice. A single mark print misleads near the threshold.
Nothing to claim. Quote tokens replace the outcome tokens in the spot balance.
Reading settlement from code
Section titled “Reading settlement from code”{"type": "settledOutcome", "outcome": 95}{ "spec": { "outcome": 95, "name": "Recurring", "description": "class:priceBinary|underlying:BTC|expiry:20260526-0600|targetPrice:77363|period:1d", "sideSpecs": [{"name": "Yes"}, {"name": "No"}], "quoteToken": "USDC" }, "settleFraction": "0.0", "details": "price:76876.9"}For a question outcome the response also carries the parent question’s description, the only way to recover bucket bounds after pruning.
From the HyperEVM, precompile 0x814 outcomeStatus(uint32 outcome) returns (uint8 status, uint64 settledValue, uint32 question):
status |
Meaning |
|---|---|
| 0 | never existed |
| 1 | active |
| 2 | settled; settledValue readable, 1e8 = 1.0 |
| 3 | settled and pruned; settledValue gone |
question is the maximum uint32 for a standalone outcome. Read or record settledValue while the status is 2: precompiles answer only at the latest block (precompiles).
To detect settlement, watch for the outcome to leave outcomeMeta, then read settledOutcome. The settlement actions (settleOutcome, settleQuestion2) and their exact-match name fields are on settling outcomes.
Pitfalls and open questions
Section titled “Pitfalls and open questions”settleQuestionis discontinued forsettleQuestion2; a sub-deployer grant forsettleQuestionauthorisessettleQuestion2.- A deployer settlement must repeat
nameAndDescriptionandsideNamesexactly: copy them fromoutcomeMeta. - Neither path settles the fallback to 1. For an “other” answer, register it as a named outcome, as the docs’ example does.
- Settlement fills never carry a builder code. Mixing them into trading volume inflated one dataset’s total by about $20M (measuring volume).
- Slashing for wrong or late settlement was in the design announced in July; the testnet release that followed disclaimed it for late settlement, and none has been observed on mainnet.
To leave before settlement, see Split, merge, negate.