oracle-service and the
PredictStreetOracle contract. The pipeline combines three independent
data sources, enforces a 2-of-3 consensus against a primary source,
and opens a bond-backed challenge window before finalising.
Flow
The T+0 → T+137 timeline from event end to USDC distribution.
Challenges
10 USDC bond, 2h window, override / confirm / void outcomes.
Void / delayed
When automated settlement cannot proceed safely.
Three data sources
| Source | Role | Primary fields |
|---|---|---|
| Stats Perform | Primary — live SDDP WebSocket + SDAPI REST | Match score, elapsed, status |
| API-Football | Secondary — REST polling | Match score, status |
| Sportmonks | Secondary — REST polling | Match score, status |
- 3-of-3 → proceed with proposal
- 2-of-3 → primary must agree with majority. If not, pause for manual review.
- 0-of-3 / unavailable → market moves to
DELAYED
Bond + challenge window
- Challenger bond: 10 USDC
- Challenge window: 2 hours after proposal
- Only the first challenge per market is accepted
| Decision | Challenger bond | Finalisation |
|---|---|---|
| Confirm original | Forfeited to revenue wallet | Original payouts stand |
| Override | Returned + reward | Corrected payouts |
| Void | Returned in full | All collateral returned to users |
Emergency paths
markDelayed(questionId)/undelay(questionId)— pause while waiting for data.voidMarket(questionId)— CO + CTO joint decision (admin multi-sig).initiateProposalClear+executeProposalClear— 7-day timelock path for clearing a stuck proposal.
What partners typically need to know
- Fills are not final until the oracle finalises the market.
- Subscribe to
oracle.market_resolvedto know when redemption is available. - Redemption is on-chain — call
ConditionalTokens.redeemPositionswith your winning tokens. Helper endpoint:POST /api/me/redemptions.