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 the on-chain hash of a future block fixed at commit time. 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 waits for at least 10 more blocks to be mined, then submits all bets plus every player's clientSeed to the smart contract and reveals the original seed. The contract enforces that the entropy block (commit + 10) is mined and within reach, so the server cannot grind the seed against known randomness or pick a favorable settle block.

settleRound(serverSeed, clientSeeds[], bets[]) at block > commitBlock + 10
4

Result Generation

The smart contract hashes the server's seed together with the hash of all players' clientSeeds and the blockhash of a fixed future block (commitBlock + 10) chosen at commit time. The entropy block is locked when the seed was committed, so neither server nor players can choose it after the fact. If any one of these three inputs is random and honest, the outcome is unpredictable to everyone else.

result = keccak256(serverSeed, keccak256(clientSeeds), blockhash(commitBlock + 10)) % 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

  • The blockhash entropy comes from a future block fixed at commit time
  • Server commits seed-hash before knowing the entropy block's hash
  • Players' own random seeds are mixed in too — server can't predict them
  • All three inputs must be honest; one source of entropy is enough
📖

Open Source & Auditable

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

What's Still Operator-Dependent

Provably fair = the result cannot be tampered with. It does NOT mean the casino runs forever without operator action. Two things still depend on the operator running their settle bot:

⏱️

Liveness

If the operator's bot is offline, rounds don't settle. Bets in flight are held off-chain and refunded — no funds are lost — but new rounds halt until the bot is back. Watch the timer; if rounds stop, the bot is down.

🪙

Slot Sessions

A slot session pauses your cashOut while active. If the operator never settles your session, after 1 hour you can call cancelSlotSessionByPlayer() directly on the contract to free up your funds. Your USDT is never locked indefinitely.

Full zero-trust randomness (no operator seed at all, automated VRF settle) is on the roadmap for the protocol-kit phase. For now, the operator can disrupt liveness but cannot manipulate outcomes — the math forbids it.

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