Verified on Arbitrum One

Provably Fair

Every spin is verifiable on the blockchain. No trust required. The outcome is determined by math that nobody can manipulate.

🔗

On-Chain Settlement

Every round with bets is settled directly on the Arbitrum blockchain. The smart contract generates the result and verifies fairness. Round outcomes are permanently recorded on-chain.

🎲

Three-Source Randomness

Every result combines three independent random sources: the server's secret seed (committed before bets open), each player's own random seed contributed with their bet, and Arbitrum's validator randomness. No single party, not even the server, can predict or rig the outcome.

💨

Withdraw Anytime

Your balance is tracked in real-time. When you're ready to leave, hit Cash Out to withdraw your funds on-chain directly to your wallet via the smart contract. No approval needed.

How Every Round Works

1

Seed Commitment

Before any bets are placed, our server generates a random seed and publishes its hash (keccak256) on the blockchain. The block number of this commit is recorded. The hash is permanent and unchangeable -- it proves the seed existed before any bets.

commitSeed(keccak256(serverSeed)) at block N
2

Players Place Bets (With Their Own Seed)

During the 45-second betting window, players place bets through our interface. Every bet carries a 32-byte random seed generated by the player's browser. Bets are collected off-chain for a seamless experience -- no wallet popups per bet -- and every player's seed becomes part of the final result.

Each bet includes: clientSeed = crypto.getRandomValues(32)
3

On-Chain Settlement (At a Later Block)

After betting closes, the server submits all bets plus every player's clientSeed to the smart contract in a single transaction and reveals the original seed. The contract enforces that settlement happens in a strictly later block than the commit, so the server cannot grind the seed against known randomness.

settleRound(serverSeed, clientSeeds[], bets[]) at block > N
4

Result Generation

The smart contract hashes the server's seed together with the hash of all players' clientSeeds and the settlement block's prevrandao. All three inputs must be combined for the result -- if any one of them is random and honest, the outcome is unpredictable to everyone else.

result = keccak256(serverSeed, keccak256(clientSeeds), block.prevrandao) % 37
5

Result & Verification

The contract checks each bet against the result and emits events for every outcome. Winnings are tracked and your balance updates in real-time. When you're ready, cash out on-chain to your wallet.

Results recorded. Balances updated. Withdraw anytime via cashOut().

Why Nobody Can Cheat

🏠

The Casino Can't Cheat

  • Server commits its seed hash BEFORE seeing any bets
  • Cannot change the seed after bets are placed (hash is on-chain)
  • Settlement must be in a later block -- no grinding against known randomness
  • Every player contributes their own seed; server cannot predict them
  • To rig the result, the server would need to know every player's seed AND the future block's prevrandao. Impossible.
👤

Players Can't Cheat

  • Players don't know the server's seed (only the hash is public)
  • Cannot predict what prevrandao will be in the settlement block
  • Bets are locked before the result is generated
  • Smart contract enforces all payout rules automatically
⛏️

Validators Can't Cheat

  • Validators control prevrandao but don't know the server seed
  • Manipulating prevrandao costs $50,000+ in lost block rewards
  • Even with manipulation, the result is still combined with the unknown seed
  • Economic attack cost far exceeds any possible gain
📖

Open Source & Auditable

  • Smart contract is verified on Arbiscan -- read the code yourself
  • Every round's seed, prevrandao, and result are stored on-chain
  • Anyone can verify any historical round independently
  • verifyRound() function built into the contract

The Math

Server SeedRandom 32 bytes, generated before the round and committed on-chain as a hash
Seed Hashkeccak256(serverSeed) -- committed on-chain before bets (at block N)
Client SeedsEach player's browser generates a random 32-byte seed per bet, included in the settlement call
ClientSeedsHashkeccak256(concat of all bettors' clientSeeds), computed on-chain at settlement
Prevrandaoblock.prevrandao at the settlement block -- Arbitrum sequencer randomness, unknown until that block is finalised
Block RuleSettlement must happen at a block strictly greater than the commit block -- no same-block grinding
result = keccak256(serverSeed, clientSeedsHash, block.prevrandao) % 37

The result is a number from 0 to 36, exactly like a European roulette wheel. House edge: 2.70% (1/37), same as any real casino. The server cannot rig the result without knowing every player's clientSeed in advance -- combinatorially impossible.

Payout Table

Standard European roulette odds. Enforced by the smart contract.

Bet TypeCoveragePayout
Straight1 number36x
Split2 numbers18x
Street3 numbers12x
Corner4 numbers9x
Six Line6 numbers6x
Column / Dozen12 numbers3x
Red / Black / Odd / Even18 numbers2x
Low (1-18) / High (19-36)18 numbers2x
Voisins du Zero17 numbers3x
Tiers du Cylindre12 numbers3x
Orphelins8 numbers4x

Smart Contract

Verified and open source on Arbiscan

0xe0D7E28cb362ad987DaD9922a5fD74C4e919Bf93
💨

Cash Out Anytime

Your balance updates in real-time as you play. Winnings and losses are tracked after each round settles on-chain. When you're ready to leave, hit the Cash Out button to withdraw your funds.

Cash Out calls cashOut() on the smart contract, which sends USDT directly to your wallet in a single transaction. There is no withdrawal queue, no manual approval from the operator.

1Play rounds
2Balance updates each round
3Cash out to wallet anytime

Frequently Asked Questions