Prerequisites
- An OO
MarketLinkregistered (viapnpm market:register --kind ooor scripts during deploy). The id lands in.envasSPORTS_OO_MARKET_LINK_ID. - A DUSDC bond ≥
OO_MIN_BOND(50 by default).
1. Propose
--outcome 1= YES,--outcome 2= NO.--bondis in whole DUSDC.
Proposal id. State → OPEN. Challenge deadline: now + OO_CHALLENGE_WINDOW_MS (30 min default).
Verify:
2. (Optional) Dispute
Anyone watching can dispute. Match the proposer’s bond:DISPUTED. Vote deadline: now + OO_VOTE_WINDOW_MS (12h default).
3. Finalize
Auto (no dispute)
After the challenge window:scripts/oo-finalize.ts pre-flight reads the proposal and prints time-remaining instead of letting the Move call abort early.
State → FINALIZED_AUTO. Proposer’s bond is returned in the same PTB. final_outcome = proposed_outcome.
Vote (post-dispute)
After the vote window:FINALIZED_VOTE. Winning side takes both bonds. final_outcome set from yes_weight vs no_weight.
Frontend integration
EventMarketDetail renders the OOPanel when the registry entry has ooMarketLinkId:
- Propose form (bond + outcome chips).
- Dispute form (auto-mirrors counter-outcome, min-bond clamp).
- Finalize buttons (gated on deadline + state).
- Historical proposals list.
- Live countdown.
- State pill with
AnimatePresencetransitions.
ResolverNFTs distributed); the panel surfaces vote weights when the window closes.
v0.4 follow-up
The OO does not yet auto-bridge tosettlement::mark_resolved. After finalize_* you still need to manually run pnpm binary-market:resolve with the matching outcome. Closing this bridge requires a republish.