YumeBet Whitepaper
Version 1.0 — May 2026
Version 1.0 — May 2026
YumeBet is a permissionless prediction market protocol built on the Sui blockchain. It allows any wallet to stake YES or NO on objective, time-bounded outcomes and earn pro-rata payouts from the losing pool. Markets are created and resolved by an on-chain bot operator using multi-source oracle validation, with an admin-gated dispute path and a seven-day auto-cancel safety net for stale cases.
The protocol charges a 7% settlement fee, split between liquidity stakers (3%), treasury (2.5–4%), and the market creator (0–1.5%) depending on creation path. NFT holders of the Yume Spirits collection stake for a share of both market fees and secondary market royalties.
This document describes the protocol architecture, market mechanics, fee model, NFT system, oracle design, community structure, and governance model for V1 Mainnet.
---
Prediction markets have consistently produced more accurate probability estimates than expert polls, media consensus, or quantitative models. Despite this track record, crypto-native prediction markets have struggled to achieve sustained traction — burdened by complexity, poor UX, opaque settlement, or fragile oracle designs.
YumeBet is built to be the prediction market that a crypto-native user actually wants to use. It starts from three first principles:
YumeBet launches on Sui for its object-centric model, low gas costs, and high throughput — qualities that make short-duration markets (5 and 15 minutes) economically viable at the base layer.
---
YumeBet is a 14-module Sui Move package. The modules separate concerns cleanly so each piece can be upgraded independently.
| Module | Responsibility |
|---|---|
admin | Platform configuration, capability issuance, pause mechanism |
market_factory | Market creation validation and routing (bot / user / admin paths) |
prediction_market | Market lifecycle: deposit, close, resolve, cancel, claim |
market_position | Soulbound position receipts |
resolution_snapshot | Bot-authored on-chain resolution proofs |
reward_vault | Winner escrow, staker fee distribution, treasury balance |
royalty_vault | Secondary royalty deposits and distribution |
nft_staking | Staking registry, weight accounting, rewards index |
types | All numeric constants (single source of truth) |
errors | Named abort codes (unique u64 values for every error path) |
events | Typed event emissions for every state transition |
yume_spirits | NFT object definition and soulbound transfer logic |
yume_spirits_mint | Mint registry, phase gating, allowlist, per-wallet cap |
automation_caps | Capability primitives for the bot operator |
YumeBetAdmin (shared) ├── pause flag ├── approved template list ├── market count └── capability epoch (for revocation) RewardVault (shared) ├── winner_escrow_balance ├── staker_fee_balance ├── treasury_fee_balance ├── quarantined_no_staker_rewards └── royalty staker index StakingRegistry (shared) └── staked NFT positions (NFT ID → owner, rarity) Market (shared, per market) ├── YES pool, NO pool, bond balance ├── position count, pool totals ├── status, winning outcome └── fee accounting MintRegistry (shared) ├── rarity map (2,222 bytes) ├── mint phase, allowlist └── per-wallet count map
---
Each market asks a binary question with an objective, measurable outcome. Examples:
Every market has:
≥ (GTE) or < (LT)Any wallet deposits at least 0.1 SUI on YES or NO while the market is OPEN. Each deposit creates a Position — a soulbound receipt object held in the depositor's wallet. Positions cannot be transferred, listed for sale, or burned. Only the original depositor can claim or refund.
Payout formula (parimutuel):
payout = deposited_amount × (total_winner_pool / total_winning_side_deposits)
Example: Market resolves YES. Total YES deposits = 100 SUI, Total NO deposits = 200 SUI, total pool = 300 SUI. After 7% fee: winner pool = 279 SUI. A user who deposited 10 SUI on YES receives 10 × (279 / 100) = 27.9 SUI.
If the winning side has zero deposits at resolution (nobody bet on the correct outcome), the winner pool is redirected to the treasury. No funds are stranded. Depositors on the losing side cannot claim — their funds formed the pool.
| Path | Minimum | Maximum |
|---|---|---|
| Bot-created | 5 minutes | 30 days |
| User-created | 1 hour | 30 days |
Bot-created markets can run as short as 5 minutes (e.g., the next 15-minute price candle). User-created markets enforce a 1-hour minimum to ensure adequate participation time.
V1 allows market creation only from admin-approved template IDs. Templates define the category and resolution method. Approved templates at launch:
| Template | Description |
|---|---|
PRICE_ABOVE | Will asset X close at or above target Y? |
PRICE_BELOW | Will asset X close below target Y? |
NFT_FLOOR_ABOVE | Will collection X floor exceed Y SUI? |
NFT_FLOOR_BELOW | Will collection X floor stay below Y SUI? |
NFT_VOLUME_ABOVE | Will collection X 24h volume exceed Y SUI? |
WEEKLY_RECAP | Weekly summary market (Thursday drop) |
Custom templates are planned for V2.
---
The protocol operator runs a Cloudflare Worker with a MarketCreatorCap capability. The bot:
market_factory::create_market on-chainBot markets carry no bond (the operator is trusted by the protocol) and pay no creator fee at resolution. All excess beyond the staker 3% goes to treasury (4%).
Scheduled drops:
Any wallet can create a market by posting a 5 SUI bond. Bond mechanics:
bond_balance field until settlementUser-created markets earn the creator a 1.5% fee at resolution, paid directly to the creator address.
Bot markets can also source resolution data from Tradeport's GraphQL API (https://api.tradeport.xyz/graphql) for Sui NFT collection floor prices and 24-hour volumes. These markets carry a BETA label in the UI.
Failure handling: if Tradeport returns no data at resolution time, the market is automatically marked NeedsReview. If admin does not resolve within 7 days, the watchdog auto-cancels it.
Reliability threshold: if the Tradeport failure rate over any rolling 30-day window exceeds 10%, the template is suspended pending investigation.
---
YumeBet uses a two-source cross-validation model. Every auto-resolution requires agreement between a primary and fallback oracle.
| Source ID | Provider | Use case |
|---|---|---|
0 | Pyth Network | Crypto price feeds (primary for price markets) |
1 | CoinGecko | Price fallback, volume data |
2 | DefiLlama | TVL data |
3 | Sui RPC | On-chain state queries |
4 | Sui GraphQL | Indexer queries |
5 | YumeBet Events | Protocol-internal event data |
6 | Internal Indexer | Cached Supabase reads |
7 | Manual Review | Admin override path |
The resolver bot executes resolve_market only if both conditions hold:
|p1 - p2| / p1 ≤ 0.01)If either condition fails, the bot calls mark_needs_review and logs the reason.
Before calling resolve_market, the bot publishes a ResolutionSnapshot object on-chain. The snapshot contains:
The contract validates that the snapshot's computed_outcome matches the winning_outcome argument passed to resolve_market. The bot cannot pass an outcome that contradicts its own published snapshot.
After resolution, the snapshot object is deleted (consume_snapshot).
A market in NeedsReview status can be:
resolve_market_by_admin (AdminCap required)cancel_marketauto_cancel_staleAuto-cancel is callable by any wallet with no capability — it is a permissionless safety net, not an admin operation.
---
All settlement fees are computed at resolution from total_pool_mist (the sum of all YES and NO deposits).
| Fee Category | Bot Market | User Market |
|---|---|---|
| Winners | 93% | 93% |
| Stakers | 3% | 3% |
| Treasury | 4% | 2.5% |
| Creator | 0% | 1.5% |
| Total fee | 7% | 7% |
Fee constants are in basis points (out of 10,000). Winner share = 9,300 bps, staker = 300 bps, treasury bot = 400 bps, treasury user = 250 bps, creator = 150 bps.
RewardVault.winner_escrow_balance — claimable per positionRewardVault.treasury_fee_balanceSecondary market royalties (10% of sale price) are deposited by compliant marketplaces via a RoyaltyDepositorCap:
Target marketplaces at launch: Tradeport and BlueMove. Royalty enforcement is opt-in (honor system in V1).
If no NFTs are staked at the time a market resolves, the 3% staker fee is quarantined in RewardVault.quarantined_no_staker_market_rewards_mist. It is non-claimable in V1 and does not roll into treasury. This edge case is expected only in the earliest hours after deployment.
The admin calls reward_vault::admin_withdraw_treasury with an AdminCap to withdraw SUI from the treasury balance. Every withdrawal emits a TreasuryWithdrawn event, which the indexer records and the admin dashboard surfaces in real time.
---
Yume Spirits are the protocol's 2,222-piece NFT collection. In the YumeBet mythology, Spirits are dream oracles — entities that perceive the arc of events before they unfold. Staking them earns a structural share of protocol revenue.
Practically: a staked Yume Spirit is a claim on 3% of every market settlement and 50% of all secondary royalties, forever, pro-rata by rarity weight.
| Tier | Count | Share | Staking Weight |
|---|---|---|---|
| Common | 889 | 40.0% | 10,000 bps (1.0×) |
| Rare | 666 | 30.0% | 10,500 bps (1.05×) |
| Epic | 445 | 20.0% | 11,000 bps (1.1×) |
| Legendary | 222 | 10.0% | 12,000 bps (1.2×) |
| Total | 2,222 | 100% | — |
Rarity is pre-seeded into the MintRegistry.rarity_map before mint opens. Every token ID maps to a fixed rarity tier — no reveal randomness exploits possible.
| Phase | Allocation | Access |
|---|---|---|
| Team reserved | 222 (10%) | Admin mint, no public sale |
| Allowlist mint | 400 (18%) | Allowlist-gated, discounted price |
| Public mint | 1,600 (72%) | Open to all |
Per-wallet cap: 20 NFTs across all phases combined.
Mint phases are set by the admin:
Mint proceeds go directly to treasury.
YumeSpirit objects are defined with has key only (no store). They cannot be listed on secondary markets in V1. The protocol uses Sui's display standard for metadata; rarity is an on-chain field accessible to any marketplace or aggregator.
Secondary transfers require marketplace integration via the protocol's transfer policy hooks (planned for V1 Mainnet).
Artwork is generated using the HashlLips art engine with custom trait layers. Traits are layered in order: Background → Body → Eyes → Mouth → Accessory → Aura. Rarity of the minted token is on-chain; visual trait rarity is reflected in the generative art but not separately indexed in V1.
Metadata URL pattern: https://yumebetdev.github.io/yumebet-assets/json/{N}.json Image URL pattern: https://yumebetdev.github.io/yumebet-assets/images/{N}.png
Post-reveal: URLs migrate to Arweave for permanent, decentralised hosting. GitHub Pages remains as a CDN fallback.
---
nft_staking::stake(spirit, registry, ctx) — the Spirit moves into the StakingRegistry shared objectTo unstake: call nft_staking::unstake(spirit_id, registry, ctx). The Spirit is returned to the wallet. Any unclaimed rewards remain claimable after unstaking.
The reward index (RewardVault) tracks a global staker_reward_per_point value. Each time a market resolves, the 3% staker fee is added to the vault and the index is bumped:
staker_reward_per_point += staker_fee_mist / total_staking_points
A staker's pending reward = (current_index - entry_index) × staker_weight.
Rewards are claimed via reward_vault::claim_staker_rewards. No lockup. Claims can happen at any time.
Royalty deposits follow the same index mechanism but in a separate royalty_staker_reward_per_point accumulator. Stakers receive both market fee rewards and royalty rewards from a single claim call.
With 2,222 total NFTs at full stake:
| Tier | Count | Weight | Total Points |
|---|---|---|---|
| Common | 889 | 10,000 | 8,890,000 |
| Rare | 666 | 10,500 | 6,993,000 |
| Epic | 445 | 11,000 | 4,895,000 |
| Legendary | 222 | 12,000 | 2,664,000 |
| Total | 2,222 | — | 23,442,000 |
Actual staking points vary based on what fraction of the collection is staked at any given time.
---
| Role | Earned by |
|---|---|
| Verified Member | Collab.Land wallet verification |
| NFT Holder | Holding ≥ 1 Yume Spirit |
| Trusted Member | 30 days + activity threshold |
| Community Helper | Nomination by Moderator |
| Moderator | Team appointment |
WL slots are earned through Discord activity, early supporter status, and community contribution. The bot tracks activity milestones and automatically grants the WL role when conditions are met.
The Discord server uses Gemini 2.0 Flash as primary moderation AI. The bot:
/appeal requests with AI-generated verdictsOperating cost at community scale: approximately $0.18–0.52/month.
---
| Component | Host | Purpose |
|---|---|---|
| Indexer | Cloudflare Worker | Listens to Sui events → writes to Supabase |
| Resolver bot | Cloudflare Worker | Cron trigger → fetches prices → auto-resolves |
| Watchdog | Cloudflare Worker | Cron trigger → auto-cancels stale NeedsReview markets |
| Database | Supabase (Postgres) | Markets, positions, mint, staking, activity data |
| Frontend | Vercel (Next.js) | Web UI |
Slush, Suiet, Phantom, Backpack, Nightly — all five wallets supported via @mysten/dapp-kit.
---
The YumeBet V1 contracts were independently audited in May 2026. All Critical and High severity findings were remediated before this document was published. The audit report is available at yumebet.xyz/audit.
Capability model: Sensitive operations (market creation, resolution, treasury withdrawal) require on-chain capability objects (MarketCreatorCap, ResolverCap, AdminCap). Capabilities can be revoked by bumping the admin epoch.
Pause mechanism: YumeBetAdmin.paused halts new deposits instantly. Claims and refunds remain live during pause — the protocol never traps user funds.
Position soulbinding: Position objects are has key only with no store. Original depositors are the only addresses that can claim or refund. No position can be stolen or transferred.
Oracle manipulation resistance: Two-source cross-validation (primary + fallback within 1%) and a confidence threshold of 90/100 prevent any single compromised feed from forcing an incorrect resolution.
Bond slashing: User-created markets that fail to resolve cleanly have their 5 SUI bond slashed to treasury. This creates a financial incentive for market creators to propose resolvable markets.
Auto-cancel safety net: Any market in NeedsReview for more than 7 days can be cancelled by any wallet. Users are guaranteed a refund path regardless of admin availability.
No admin theft path: The admin cannot extract funds from winner escrow or staker balances except through the audited admin_sweep_winner_residual function, which is bounded by winner_payout_remaining_mist and emits a logged event.
---
Wallet integration, preview markets, mint and stake surfaces, resolver and indexer rehearsal. Core contract audit complete. Discord community in setup.
---
YumeBet treasury accrues SUI from three sources:
In V1, treasury funds are used for:
There is no governance token in V1. The admin makes treasury decisions unilaterally with full on-chain transparency (every withdrawal emits a TreasuryWithdrawn event indexed to the admin dashboard).
Community governance via NFT-weighted voting is planned for V2. Yume Spirits holders would vote on approved template additions, fee parameter changes, and treasury allocations.
---
YumeBet has no protocol token in V1. There is no YB token, no governance token, and no airdrop. The economic model is:
This design avoids regulatory complexity, eliminates token volatility risk for users, and ensures the protocol earns only from actual market activity.
---
| Constant | Value | Description |
|---|---|---|
MIN_DEPOSIT_MIST | 100,000,000 | 0.1 SUI minimum deposit |
BOND_AMOUNT_MIST | 5,000,000,000 | 5 SUI bond for user markets |
MAX_POOL_MIST | 100,000,000,000,000 | 100,000 SUI market cap |
MIN_DURATION_MS | 3,600,000 | 1 hour user market minimum |
MIN_BOT_DURATION_MS | 300,000 | 5 minute bot market minimum |
MAX_DURATION_MS | 2,592,000,000 | 30 day maximum |
AUTO_CANCEL_STALE_MS | 604,800,000 | 7 day NeedsReview timeout |
FEE_STAKER_BPS | 300 | 3% staker fee |
FEE_TREASURY_BOT_BPS | 400 | 4% treasury (bot markets) |
FEE_TREASURY_USER_BPS | 250 | 2.5% treasury (user markets) |
FEE_CREATOR_BPS | 150 | 1.5% creator fee (user markets) |
WEIGHT_COMMON | 10,000 | Common NFT staking weight |
WEIGHT_RARE | 10,500 | Rare NFT staking weight |
WEIGHT_EPIC | 11,000 | Epic NFT staking weight |
WEIGHT_LEGENDARY | 12,000 | Legendary NFT staking weight |
BOT_CONFIDENCE_THRESHOLD | 90 | Min oracle confidence to auto-resolve |
ROYALTY_TARGET_BPS | 1,000 | 10% royalty target |
ROYALTY_STAKER_BPS | 5,000 | 50% of royalties → stakers |
ROYALTY_TREASURY_BPS | 5,000 | 50% of royalties → treasury |
PER_WALLET_MINT_CAP | 20 | Max NFTs per wallet |
YUME_SPIRITS_MAX_SUPPLY | 2,222 | Total Yume Spirits |
---
Every on-chain state change emits a typed event indexed by the Cloudflare Worker:
| Event | Trigger |
|---|---|
MarketCreated | New market created |
MarketCreatedWithBond | Bond posted at market creation |
MarketEntered | Position deposited |
MarketClosed | Market status → Closed |
MarketNeedsReview | Oracle failure / low confidence |
MarketResolved | Final outcome set |
MarketCancelled | Admin cancel |
MarketAutoCancelled | Watchdog 7-day auto-cancel |
PositionClaimed | Winner claimed payout |
PositionRefunded | Depositor refunded (cancelled market) |
BondReturned | Creator bond returned after clean resolve |
BondSlashed | Creator bond slashed after cancel |
CreatorFeePaid | 1.5% creator fee transferred |
TreasuryWithdrawn | Admin withdrew from treasury |
WinnerEscrowSwept | Admin swept unclaimed winner dust |
StakerRewardsClaimed | Staker claimed accumulated fees |
RoyaltyDeposited | Marketplace deposited royalties |
RoyaltyDistributed | Royalties split to stakers + treasury |
---
YumeBet is in testnet beta. All figures, constants, and parameters are subject to change before V1 Mainnet launch.
Contract source: [github.com/YumeBetDev/yumebet](https://github.com/YumeBetDev/yumebet) NFT assets: [github.com/YumeBetDev/yumebet-assets](https://github.com/YumeBetDev/yumebet-assets)