Market families
counsel supports two resolution families. The family is set at market creation and cannot change.Family A, Oracle-resolved (crypto price)
Family A markets resolve automatically against an on-chain XLS-47 price oracle. No human input is required at resolution time. These markets are defined by:| Field | Description |
|---|---|
oracleAccount | XRPL account that publishes the oracle |
oracleDocumentId | XLS-47 OracleDocumentID |
baseAsset | Asset being priced (e.g. "XRP") |
quoteAsset | Denomination (e.g. "USD") |
strike | Price threshold for the binary condition |
comparison | ">=" or "<=", the direction of the condition |
freshnessSeconds | Maximum allowed age (seconds) of the oracle value relative to resolutionTime |
XRP/USD >= 0.60 at resolution time. If the oracle reports 0.62 within the freshness window, outcome 0 (“Yes”) wins. If it reports 0.58, outcome 1 (“No”) wins. If no fresh value is available, the market voids.
Family A markets have disputeWindowHours: 0 by default, resolution is fully automatic with no dispute period.
Family B, Manual (real-world events)
Family B markets cover events with no on-chain data source: sports results, political outcomes, economic data releases, and so on. Resolution is operator-proposed and subject to a dispute window.| Field | Description |
|---|---|
source | Named authoritative source (e.g. "FIFA official result") |
condition | Exact, pre-committed condition text |
date | ISO date the condition is evaluated |
evidenceHint | Optional hint to the evidence URL used at resolution |
Market lifecycle
A market moves through a fixed sequence of phases. The current phase is returned asphase in GET /api/v1/markets/:id.
open
Bets are accepted. The pool accumulates. Odds shift with every new stake. This is the only phase in which you can place a bet.
closed
bet_cutoff has passed. No new bets are accepted. The pool is frozen. The market is awaiting resolutionTime before settlement runs.disputable (Family B only)
After
resolutionTime, the operator publishes a resolution proposal and the dispute window opens (disputeWindowHours, default 48 hours). Any staked account can post a challenge bond during this period. This phase does not appear for Family A markets, which have disputeWindowHours: 0.resolving
The dispute window has closed (or does not apply for Family A). The committee multisig is in progress. No further challenges can be submitted.
resolved
The winning outcome has been determined and payouts have been distributed. A
status: "final" record is on-chain.void
The market cannot be resolved fairly. All stakes are refunded at face value. No fee is charged. See Void conditions below.
The
status field returned by GET /api/v1/markets/:id shows only open, resolved, or void. The phase field carries the granular phase value (open, closed, disputable, resolving, or resolved).Pool structure on XRPL
Each market has a dedicatedpoolAccount, an XRPL r-address that holds all funds staked on that market. Outcomes are separated by DestinationTag:
- Outcome 0 → DestinationTag
0 - Outcome 1 → DestinationTag
1 - Outcome N → DestinationTag
N
poolAccount with the DestinationTag corresponding to your chosen outcome. The pool account’s master key is disabled; funds can only leave via a committee multisig at settlement.
You can verify the pool balance independently at any time by querying the XRPL for the pool account’s transaction history.
Void conditions
The following conditions trigger a full void and refund:One-sided pool
One-sided pool
If all bets land on a single outcome (no opposing stake exists), there is no pool to distribute to the other side. The market voids and all stakes are returned.
Oracle stale (Family A only)
Oracle stale (Family A only)
At
resolutionTime, the XLS-47 oracle value must have been published within freshnessSeconds of that timestamp (with a 120-second post-close grace period). If no fresh value is available, the market voids automatically.Cancelled, postponed, or tied event
Cancelled, postponed, or tied event
If the underlying event is cancelled, indefinitely postponed, or produces a result that does not map cleanly to the defined outcomes (e.g. a draw on a binary win/loss market), the market voids.
Betting caps
Markets can impose limits to manage pool concentration. These are defined in thecaps object:
| Field | Description |
|---|---|
perBettorXrp | Maximum total XRP a single account can stake across all outcomes in this market |
perOutcomeXrp | Maximum total XRP that can accumulate on any single outcome |
perMarketXrp | Maximum total XRP the whole market pool can hold |
Market identity and deduplication
Every market has a deterministicid computed as the first 16 hex characters of sha256(question | resolutionTime). Recurring market templates (e.g. daily XRP price markets) share a templateKey; only the most recently created instance per templateKey is shown in the default listing. Markets with hidden: true are retired or superseded and are not returned by the public API.