How Contention.markets works
The backer surface for fully on-chain games. Skill Contests are pari-mutuel pools on the outcome of matches you don’t play. To compete as a contestant instead, head to the player surface ↗ (separate operator).
/ contests
Skill Contests
Skill Contests are pari-mutuel pools on the outcome of fully on-chain games. The underlying matches are played on a sibling player surface; backers here back a contestant, and if their contestant wins they split the prize pool with other backers of that contestant, pro-rata to their stake.
No order book. No bookmaker. No counterparty. The protocol takes a 5% fee from the total pool; everything else flows to backers of the winning contestant.
Total pool = sum(stake[i] for all backers i) Winning pool = sum(stake[i] for backers of winner) Distributable = total pool × (1 − fee_bps / 10000) Your payout = your_stake / winning_pool × distributable
Each entry requires a skill component — a bracket pick (for tournaments) or a move-prediction memo (for 1v1). This anchors the legal frame as a "predominantly skill" contest under DFS precedent. Free entries via Skill Points (earned playing arcade games) cover the alternative-method-of-entry sweepstakes safe harbor.
/ play
Want to play instead?
Contention.markets is the backer surface — you back contestants in matches you don’t play. If you want to compete as a contestant, head to the player surface ↗.
The player surface is a separately-operated product where you challenge another player directly, accept their challenge, and compete in chess / snake / blockwords matches. The two surfaces share only the oracle layer — the same on-chain game programs that decide outcomes — and operate as separate products under separate legal entities. A regulator action against one does not put the other at risk.
/ oracle
Oracle architecture
Match outcomes are read from the game program's on-chain state. Three layers:
Tier A — live ER state → display "skill assessment" (no settlement) Tier B — game program PDA → authoritative settlement Tier C — GPX1 SPL-memo on L1 → fallback if Tier B unavailable
Tier B is the binary differentiator. DraftKings reads stats from third-party feeds (Stats Inc., SportRadar) — they trust an oracle. We read directly from the game program that produced the result. No oracle committee. No dispute window.
Tier C ensures contests can still settle from on-chain transaction history even if every off-chain server disappears — on either surface.
/ fees
Fees & payouts
Protocol fee 5% (default; configurable in ContestConfig) Organizer fee 0–2% (opt-in per contest; streamer kickback) $GAMER buy-burn 0–1% (post-launch; folds to treasury until token ships) Total max 10% (hard-capped in code)
Fees collect into a per-contest FeeVault PDA on each backing, then flush at settlement. No fee on cancelled contests — backers refund 100%.
Settlement is permissionless — anyone can call settle_contest once the underlying match resolves. We run the first keeper but don't gate it.
/ legal
Legal frame
Skill Contests are framed as skill contests under DFS precedent, not as prediction markets. Three pillars:
- Underlying games (Magic Chess, Cyber Snake, Blockwords) are skill-predominantly — chess is the textbook skill game in US case law.
- Skill component required to enter (bracket / move prediction) — anchors backer engagement in the same skill domain.
- Free-entry path via Skill Points — covers no-purchase-necessary sweepstakes safe harbor.
Vocabulary discipline: we never call it betting, gambling, odds, wagering, or prediction in user-facing copy. The Robinhood-style chess market is a CFTC-regulated event contract through KalshiEX — we don't and won't compete in that lane.
Devnet only with play-money. Mainnet ships when the regulatory frame is confirmed.
/ programs
Programs / on-chain
contention-markets 69Yfc...1Xo8 live on devnet · CM v2.1 (backer pools) contest-pools TBD in design · Skill Contests program oracles consumed (player-surface programs, separate operator): magic-chess match result PDAs cyber-snake bot duel PDAs blockwords showdown PDAs
Source of truth for invariants is the program code in programs/<name>/src/lib.rs. IDLs are mirrored to the player-surface frontend for type-safe instruction builders; that's a read-only operational dependency, not a shared codebase.