Skip to main content
Binary and neg-risk markets can both be challenged. Binary proposals live on Oracle and are keyed by the market’s conditionId; neg-risk proposals live on the neg-risk oracle, are keyed by the market’s negRiskMarketId, and cover every outcome of the group — see Flow.

When you can challenge

From the block in which proposeOutcome lands until the challenge deadline, 2 hours after the proposal by default (for a sports market proposed at about T+15 min, until about T+135 min). The exact deadline is resolution.challengeWindowClosesAt on the market payload (on-chain: getProposal(id).challengeDeadline). Only one challenge per market is accepted.

Posting a challenge

Before calling, approve the oracle to pull the bond (10 USDC) from the challenging address. The oracle collects it with transferFrom, so that address must hold the USDC itself. The bond amount is fixed when the outcome is proposed (getProposal(id).bondSnapshot); the challenger does not choose it.

Submitting a challenge

There is no REST endpoint that raises a challenge: send the challengeOutcome transaction above yourself. Both oracle addresses are in GET /api/platform/contracts: oracle for binary markets, negRiskOracle for neg-risk. Once the transaction is indexed, the challenge appears on GET /api/markets/{symbol}/challenges. A neg-risk challenge covers the whole group but is listed under one sibling’s symbol. A challenge you send yourself is listed under the group’s first outcome (lowest negRiskQuestionIndex); one filed from the PredictStreet app is listed under the outcome it was filed on. GET /api/challenges?challengerWallet=<address> finds it whichever sibling it is listed under. A refunded bond (plus any reward) is not sent back automatically: it is credited to pendingBondPayouts(yourAddress) on the oracle you challenged, and you claim it with withdrawBondPayout(to).

Possible outcomes

Decision SLA

  • Target: 2 hours for straightforward data-check cases.
  • Maximum: 24 hours for investigations.
  • Beyond 4 hours: platform-wide notification sent.

During DISPUTED

Trading is paused for the market. Existing positions are preserved. User banner: “This market is under review due to a raised dispute.”

Good reasons to challenge

  • Proposed payouts contradict the resolution criteria.
  • Primary data source was evidently wrong at proposal time.
  • Match abandoned / cancelled but oracle proposed a winner.

Bad reasons (will likely cost you the bond)

  • Subjective disagreement.
  • Out-of-scope ref / VAR complaints.
  • Disagreement with penalty shootout decisions accepted in the feed.
Repeated frivolous challenges → wallet-level reputation flags + potential account restrictions.