Skip to main content
Sports outcomes, election results, geopolitical events. None of them have a numeric feed. They need a human resolution with bond-backed incentives. DarkPool’s answer is oo_resolution.move: a Sui-native optimistic oracle with a 30-minute challenge window. Polymarket’s UMA window is 7 days.

State machine

Lifecycle

1

Propose

Anyone calls oo_resolution::propose<COLLATERAL>(market_link, outcome, bond_coin, clock, ctx) with a DUSDC bond at or above OO_MIN_BOND. If no one disputes within OO_CHALLENGE_WINDOW_MS (default 30 min), the proposal becomes the final outcome.
2

Dispute (optional)

Anyone can call dispute<COLLATERAL> with a counter-bond equal to the proposer’s. State moves to DISPUTED. A DAO vote is triggered.
3

Vote (DISPUTED only)

ResolverNFT holders call cast_vote(vote_ledger, proposal, weight, vote). Each vote is weighted by the holder’s ResolverNFT weight. The vote window is OO_VOTE_WINDOW_MS (default 12 hours).
4

Finalize

Two paths:
  • finalize_auto<COLLATERAL>. No dispute happened. Proposer wins their bond back. State moves to FINALIZED_AUTO.
  • finalize_vote<COLLATERAL>. Vote window closed. The side with majority weight wins both bonds. State moves to FINALIZED_VOTE.

States

StateValueMeaning
OPEN0Proposal active, in challenge window
DISPUTED1Dispute filed, voting open
FINALIZED_AUTO2Auto-finalized (no dispute)
FINALIZED_VOTE3Finalized by DAO vote

Outcomes

OutcomeValue
YES1
NO2

Frontend integration

EventMarketDetail renders the OOPanel whenever the binary-market registry entry has an ooMarketLinkId. Full lifecycle UI:
  • Propose form (bond amount + YES / NO chips)
  • Dispute form (auto-mirrors counter-outcome, min-bond clamp)
  • Finalize buttons. finalize_auto when window closed and no dispute. finalize_vote otherwise.
  • Historical proposals list
  • State pill (OPEN / DISPUTED / FINALIZED_AUTO / FINALIZED_VOTE) with AnimatePresence transitions
  • Live countdown to challenge or vote deadline
Voting itself is read-only in v1 (no ResolverNFTs have been distributed yet). The panel surfaces vote weights when the window closes.

Scripts

# Propose YES with 50 DUSDC bond
pnpm oo:propose \
  --market-link <SPORTS_OO_MARKET_LINK_ID> \
  --outcome 1 \
  --bond 50 \
  --execute

# 30-minute window. To auto-finalize:
pnpm oo:finalize --proposal 0x... --mode auto --execute
scripts/oo-finalize.ts pre-flight-reads the proposal and prints time-remaining instead of letting the Move call abort early.

Bridge to settlement (v0.4)

The OO does not yet bridge to settlement::mark_resolved automatically. That’s a v0.4 republish follow-up. For now, after finalize_* the resolver manually signs binary-market:resolve with the matching outcome.