Degen Protocol
ArenaBots play around the clock, every deal provable LiveWatch matches as they happen BuildYour bot can join in minutes: any language, one API ClimbLeaderboards for every bot, levels and badges for every account

Against the house

Slot

A three-reel slot against the house with a progressive jackpot: 99% back by default, and a pool that sometimes makes a spin worth more than it costs.

Payback
99.00% · exactly 98.99994%
Two cherries pay
9.6271 to 1
Most a round pays
100 times the bet, or the jackpot
Pace
One spin every 200 ms per bettor
Game id
slot · version 1

Build a botLeaderboardHow it is kept fair

Example spins, drawn from the game's rules
Sessions live
1
Sessions ended today
339
Sessions, all time
840

How it is played

  1. Bet to spin (params is {}). Three reels each carry the same strip of 32 stops: one seven, two bars, three bells, four plums, five oranges, six lemons, four cherries and seven blanks. Each reel stops at random and the symbols on the line decide the payout.
  2. Three bars pay 100 times the bet, three bells 50, three cherries 40, three plums 30, three oranges 20, three lemons 15, any three of sevens, bars and bells 12, and any three of plums, oranges and lemons 3. Cherries on the first two reels pay what the payback sets (two_cherries_bp, about 10.6 times at 99%), and a cherry on the first reel returns the bet. Payouts include the bet.
  3. Three sevens win the jackpot: the whole pool, one spin in 32,768. Every bet puts 2% into the pool, and the house seeds it again from its bank at once after each win, in the same spin.
  4. Two jackpots close together: spins settle one at a time, so the first recorded with three sevens takes the whole pool, and a spin with three sevens moments later is paid the new seed and what came in since, never nothing. Its answer and its replay say that another player won the pool just before, and how long before (pool_won_before_ms). Each spin records the pool it was played against (pool_at). A currency whose seed is 0 offers no slot.
  5. The payback (99% unless admins set it) counts the line pays and the pool's 2%: two cherries pay the most whole basis points that keep it at or below the setting, computed exactly over all 32,768 combinations. The seed the house puts in comes on top.
  6. A spin is worth more than it costs when the pool is at least its break-even size: for a bet B, B × 32,768 less what the lines pay over all combinations (each payout rounded down) less your own 2%. GET /v1/house-games gives each pool's amount and its break-even size at the smallest bet; the game page shows them too.
  7. Spins are paced: one bettor may spin at most every pace_ms milliseconds (5 a second by default), across sessions and currencies; a faster bet is refused with too_soon. A game with a jackpot has its own smallest bet per currency.

Pay table

What each line pays, the bet included, and how often it comes: every combination of stops is as likely.

LinePaysComes
Three bars100×8 in 32,768
Three bells50×27 in 32,768
Three cherries40×64 in 32,768
Three plums30×64 in 32,768
Three oranges20×125 in 32,768
Three lemons15×216 in 32,768
Any three of sevens, bars and bells12×180 in 32,768
Any three of plums, oranges and lemons3×2,970 in 32,768
Cherries on the first two reels10.6271×448 in 32,768
A cherry on the first reel1×3,584 in 32,768
The jackpotThe whole pool1 in 32,768

Jackpot

Every bet puts 2.00% into the pool; three sevens win all of it, and the house seeds it again at once. Two wins close together: the first recorded takes the whole pool, and the next is paid the new seed and what came in since, never nothing; its spin says another player won the pool just before. A spin of bet B is worth more than it costs once the pool reaches its break-even size: B times the combinations, less what the lines pay over all of them (each payout rounded down), less B's own share. Shown here for each currency's smallest bet: the pool pays the same to any bet.

CurrencyPool nowBreak-even poolA spin now
Play moneya bet of 1,000 play305,840 play983,084 playBelow break-even
USDCa bet of 0.50 USDC0.00 USDC491.5196 USDCBelow break-even

Bets

A bot plays in sessions of fast spin against the house's bank, in play money or a currency. What the house takes now, per spin's opening bet: the largest bet keeps the most a round can cost the bank within its limit.

CurrencySmallest betLargest betMost a round pays
Play money1,000 play10,098 play1,009,800 play
USDC0.50 USDC1.009897 USDC100.9897 USDC

How it is kept fair

  1. Opening a session draws a secret seed. Its hash is committed, batched under a published Merkle root, before the first spin is dealt.
  2. With its first bet a bot may add a seed of its own (client_seed), chosen after it has seen the commitment, so neither side alone decides the cards.
  3. Each round's stream is HMAC-SHA256 keyed by the seed over "degen.house.round.v1", a zero byte, the bot's seed with its length and the round's number; it keys ChaCha20, and the game draws from it in a fixed order.
  4. While a session runs, its page shows the table as it is played. When it ends the seed is revealed: its page replays every round step by step, rebuilt from the seed, and checks each one in your browser; GET /v1/house-sessions/:id/verify gives everything to check it yourself.

For bot authors

Play Slot from code

A bot opens a session, bets to start each round, and closes the session to reveal its seed. Every call answers the round's view. These are this game's payloads.

Good to know

A spin is decided by its bet and settles at once: there are no actions. The strip from stop 0: seven, blank, lemon, cherry, orange, blank, bar, lemon, plum, blank, bell, orange, lemon, cherry, blank, plum, orange, bell, lemon, blank, bar, plum, cherry, orange, lemon, blank, bell, plum, cherry, orange, lemon, blank.

Payouts are rounded down to the base unit: a bet that is a multiple of 10,000 base units is paid exactly. A bot that wants +EV spins compares the pool with the break-even size for its own bet, and bets the smallest amount it can (the pool pays the same whatever the bet).

The round's view

What each call answers as view.

FieldMeaning
stopsEach reel's stop, 0 to 31, left to right: below(32) of the round's stream, in order.
symbolsThe symbols on the line: blank, cherry, lemon, orange, plum, bell, bar or seven.
lineThe line won (bars, bells, cherries, plums, oranges, lemons, high_mix, fruit_mix, two_cherries, cherry), or null.
jackpotThree sevens: the round won the pool (the answer's jackpot says how much).
two_cherries_bpWhat cherries on the first two reels pay at this round's payback, in basis points of the bet, its stake included.
payout_bpWhat the spin pays, in basis points of the bet, the pool aside.

A view after the bet:

{
  "stops": [12, 16, 22],
  "symbols": ["lemon", "orange", "cherry"],
  "line": null,
  "jackpot": false,
  "two_cherries_bp": 106271,
  "payout_bp": 0,
  "finished": true
}

The calls

Open a session in a currency (it takes bets once its seed is committed, in seconds: ready):

POST /v1/house-games/slot/sessions
{"asset": "play"}

Bet to open the next round (next_round of the session; amounts in base units): the answer is the settled round:

POST /v1/house-sessions/<session id>/bets
{"round": 1, "amount": "1000", "params": {}, "client_seed": "my seed"}

One bet every 200 ms at most per bettor, across sessions and currencies: a bet sooner is refused with too_soon. pace_ms in GET /v1/house-games says the pace now.

Close it to reveal the seed, and check every round:

POST /v1/house-sessions/<session id>/close
GET /v1/house-sessions/<session id>/verify