Prediction markets
A prediction market is the canonical consumer of an optimistic oracle. Users speculate on future events by trading binary outcome shares; the oracle decides which side wins. OMY is purpose-built for this use case, and the reference Market contract in the repo is the first real consumer we ship.
What a prediction market needs
Three things, in order:
- A way to mint outcome shares. Users deposit USDT; the market mints 1 YES + 1 NO share per USDT. At resolution, only one side is worth $1; the other is $0.
- A way to trade those shares. Usually a constant-product AMM. Some users want to buy YES, some want to sell. The AMM lets them transact without finding a counterparty directly.
- A way to settle. Once the underlying event resolves, the market needs a trustworthy answer. That's where OMY comes in.
How the oracle plugs in
┌─────────────────────┐
Market.RequestResolution ──► OracleFactory │
(creator-gated) │ deploy + bind │
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Assertion │
│ ── liveness ── │
└──────────┬──────────┘
│ OracleResult
▼
┌─────────────────────┐
│ Market │
│ settle YES/NO │
│ 1% silent skim │
└─────────────────────┘
│ Redeem
▼
Winners get
$0.99 / share
The Market sizes its oracle bond proportional to TVL — the more value at risk, the more economic security demanded from the oracle. Default: 2% of total collateral, floored at the configured minimum and capped at 10 000 USDT.
Design considerations
Liveness window
The liveness window is the gap between propose and finalize. Long enough that disputer-watchers have time to react; short enough that users get fast settlement.
| Event type | Suggested liveness |
|---|---|
| Crypto price thresholds (verifiable from chain) | 30 min – 1 h |
| Sports / scheduled events | 2 – 6 h |
| Elections / multi-source verification | 12 – 24 h |
| Subjective or contentious | 24 h+ |
The trade-off: short liveness = poor user experience for disputers; long liveness = poor user experience for traders waiting to redeem.
Question phrasing
The oracle is only as good as the question. "Did event X happen?" must be unambiguous to anyone reading the question text. The single biggest cause of prediction-market controversy is poorly-worded questions where reasonable people disagree about what counts as the answer.
Always include:
- A specific date / time with a timezone
- A verifiable source ("according to the official scoreboard at example.com")
- A fallback rule ("if no event by date X, resolves NO")
See Question templates for the full guide.
LP economics
In a binary prediction market, the LP takes directional impermanent loss: if they seed equal YES and NO and the market resolves YES, the LP's NO shares go to zero. The expected return depends on:
- Swap fees collected over the lifetime of the market
- The variance of the final outcome (more uncertain = better LP returns)
- Whether the LP can hedge by participating on the contrarian side
The reference Market's swap fee is 0.5% (Phase A: all to treasury; Phase B:
configurable split between LP and stakers). LP rewards via $OMY emissions
are planned for Phase B if retail LP shows up.
Resolution skim
The Market takes a 1% silent resolution skim to treasury when the oracle finalizes. Users see clean payout numbers — every winning share pays $0.99 instead of $1.00. This funds the protocol without nickel-and-diming users on every trade.
Worked example
Question: Will the BTC/USDT spot price (Binance) close above $200,000 at 00:00 UTC on 2026-12-31?
| Step | What happens |
|---|---|
| Creator deploys Market | Sets question, bond floor 100 USDT, liveness 6 h |
| LP seeds | Deposits 10 000 USDT → 10 000 YES + 10 000 NO into pool |
| Users trade | Throughout the year, users buy YES (price rises to 0.42), buy NO (price falls to 0.58) |
| 2026-12-31 00:00 UTC | Event occurs (real-world price check) |
Creator calls RequestResolution | Market sends CreateAssertion to factory with bond = max(2% × TVL, 100) |
| Proposer asserts answer | Posts bond + 2 USDT fee; says YES (or NO) |
| Liveness window opens | 6 hours for anyone to dispute |
| Common case: no dispute | After 6h, finalize() is called — answer accepted as truth |
OracleResult → Market | Market enters Resolved, skims 1% to treasury, sets winningYes = true |
| Users redeem | YES shareholders get $0.99 per share; NO shares worth $0 |
If a dispute occurs, the resolver (committee or DVM) settles it. Loser bond splits 50/50 between winner and treasury.
Integration checklist for builders
import {DocFeatures, DocFeature} from '@site/src/components/docs/DocFeatures';
Further reading
- Tutorial — build a market — end-to-end implementation
- Bonds & fees — full economic model
- Question templates — how to phrase questions