Family A: Oracle resolution
Family A markets resolve automatically atresolutionTime by reading an XLS-47 price oracle entry on the XRPL. No human input is required for a clean resolution.
What happens at resolution time
Read oracle
The settlement engine queries the XLS-47 oracle at
oracleAccount / oracleDocumentId for the baseAsset/quoteAsset pair.Check freshness
The oracle value’s The 120-second post-close grace period absorbs publish cadence, a value published just after
lastUpdateTime must satisfy:resolutionTime is still accepted. Freshness is measured against resolutionTime, not the wall clock at the time the engine runs, so settling late cannot use a price that did not exist at close.Evaluate condition
The engine compares the oracle’s reported price against
strike using comparison:>= strike, outcome 0 (Yes) wins ifprice >= strike<= strike, outcome 0 (Yes) wins ifprice <= strike
Publish resolution record
The operator writes a signed
ResolutionRecord memo to the pool account with status: "final", the winningOutcome index, the raw oracleValue, and the oracleLastUpdateMs timestamp. This record is the authoritative on-chain proof of resolution.Freshness void
If the oracle value’s age relative toresolutionTime falls outside the freshness window (accounting for the 120-second grace period), the market voids immediately. All stakes are refunded. See Void policy below.
Family B: Manual (optimistic) resolution
Family B markets use an optimistic resolution model: the operator proposes an outcome, a dispute window opens, and the multisig committee finalizes if no valid challenge arrives.What happens at resolution time
Operator publishes proposal
After
resolutionTime, the operator posts a signed on-chain ResolutionRecord with status: "proposed" to the pool account. The proposal includes winningOutcome, the evidence source URL, and an evidence hash. The bondDrops field sets the symmetric bond size any disputer must match.Dispute window opens
The dispute window lasts
disputeWindowHours (default: 48 hours). Any account that holds a stake in the market can post a challenge bond to the pool account during this period. A dispute memo must reference the marketId and include the disputer’s reason.No challenge: committee signs
If the dispute window closes without a valid bond being posted, the multisig committee cosigns the proposed outcome. Settlement proceeds identically to Family A: a final
ResolutionRecord is written on-chain, then payouts are distributed.Challenged: committee reviews
If one or more valid bonds are posted, the committee reviews the evidence and proposal independently. The committee signs the final outcome, which may or may not agree with the operator’s proposal. The final
ResolutionRecord with status: "final" supersedes the proposal regardless of which side the committee supports.A
proposed record is visible in the pool account’s transaction history but does not trigger payout distribution. Only a status: "final" record initiates settlement.Void policy
The following conditions result in a full refund with no fee deducted:| Condition | Trigger |
|---|---|
| Oracle value not fresh | No oracle value exists within freshnessSeconds + 120s grace of resolutionTime (Family A only) |
| One-sided pool | All public stakes are on a single outcome; there is no opposing pool to distribute among winners |
| Event cancelled or unmappable | The underlying event is cancelled, indefinitely postponed, or produces a result that does not map to the defined outcomes |
| No public stakes | The gross pool consists entirely of market-maker seed stakes; no real bettors participated |
What happens on void
A void is not an error state, it is a defined contract outcome. On void:- The
ResolutionRecordis written on-chain withvoid: trueandwinningOutcome: null. - Every non-seed stake is refunded at face value (drops in = drops out).
- No fee is deducted from any refund.
- The pool account’s remaining balance (seeds + dust) stays under operator control.
Trust model
Pool accounts are secured so that no single party, including the operator, can unilaterally move funds:Master key disabled
After the pool account is created, the master key is disabled on-chain. There is no signing key that can authorize a unilateral Payment.
n-of-m SignerList
A multisig
SignerList is set on the pool account. A threshold of committee members must cosign any outgoing transaction before the XRPL will process it.