The rules live on Solana.

Your money, every bet and the number of every round with bets are handled by a program on Solana, not by our server.

Your money, your safe

Your dollars sit in a safe on Solana that belongs to your wallet. Only your wallet can take them out, whether our server is up or not. Wins are paid into the safe by the program itself.

Your walletYour safeon Solanaput inonly you take out

One approval per session

When you sit down, your wallet signs once: it lets Roulana’s betting key place bets for you, up to a limit and for 7 days. That key can only place bets. It can never take money out, and you can end the session at any time.

Your walletsigns onceBetting keybets onlyYour betsup to a limit, for 7 days

How a number is drawn

  1. The round opens: the fingerprint (a SHA-256 hash) of a secret seed is sealed on Solana, before any bet.
  2. Bets are placed and locked on Solana.
  3. Betting closes, and the program waits for a Solana block made after the lock.
  4. The seed is revealed, and the program checks it against the fingerprint.
  5. The program mixes the seed with that block’s hash to get the number, and pays every bet itself.

Nobody can choose the number: the seed was fixed before the bets, and the block did not exist when they closed. Anyone can check any round with money on it on the Verify page. Rounds where nobody bets are only the wheel turning: nothing is at stake, so they are not sent to Solana.

Check the latest round with real bets (round #6616, number 2), or see it on Solana’s explorer.

If the dealer goes silent

If a round is not revealed within 2 minutes of betting closing, it can only be cancelled, by anyone: every bet goes back to its safe, and nobody wins or loses. Every cancelled round is public on Solana, and the table then stops for 25 hours, longer than an investor’s notice, so it cannot happen quietly or often.

The bank

Investors own the bank in shares. Withdrawals take 24 hours’ notice and are paid only between rounds, and one round may risk at most a set share of the bank, between 0.5 % and 2 %. See the bank

The house plays too

While the table is young, the house plays too: a few wallets funded by Roulana play with real money through the same AI Autoplay every player has, by the same rules and limits. They make room as real players arrive.

Their money comes from one wallet of Roulana’s, the hub. All of them, on Solana:

Hub
GPMY…FP1q
Player 1
EryB…koZf
Player 2
5pnr…sxHB
Player 3
7SPJ…Q5EL
Player 4
D75A…Sm4e
Player 5
BS4L…4d7v
Player 6
CRUG…uUQB
Player 7
9LL3…ujtw
Player 8
CuMR…MPpF

The fee

The bank pays a fee of 1 % of the bets out of its house edge; players pay nothing extra. Half is the service fee, paid to the owner’s wallet for running Roulana: the servers, the Solana network fees for every bet and every round, upkeep and support. Half goes to the public buyback wallet: a split fixed in the program. A new buyback wallet takes effect only after 7 days of public notice.

Bank pays 1 % fee½ service fee½ buyback walletpublicfixed in the program

What the owner can and cannot do

Can

  • Pause the table (a round already running finishes)
  • Set the bank limit per round, between 0.5 % and 2 %, between rounds
  • Set the fee, never above 1 %
  • Name a new dealer or a new owner, who can take over only after 25 hours in public
  • Propose a new buyback wallet, which waits 7 days in public

Cannot

  • Take money from anyone’s safe
  • Change a bet or a payout
  • Pick or change the number
  • Change how the fee is split
  • Make a new buyback wallet count without the 7 days’ notice
  • Bring in a new dealer or owner without 25 hours’ public notice
  • Resume the table sooner than 25 hours after a cancelled round

These are the program’s own rules. The owner’s key can still upgrade the program: see Upgrades below.

Upgrades

The program can still be upgraded with the owner’s key, kept offline. Every upgrade is public on Solana.

Next: upgrades will need several keys and a 7-day wait, so everyone can leave first.

Addresses

The program
7FqV…gHBn
The table
AfyX…h63J
The vault (every dollar on the table)
BPJm…aw56
USDC
EPjF…Dt1v
The buyback wallet
6Pcu…LF9V
The owner
8K7a…SXCH
The dealer
9A83…c86c

Never send USDC straight to the vault’s address: the program cannot send it back. Money comes to the table only through your safe.

For developers

The main instructions:

Players
deposit, withdraw, open_session, close_session
The betting key (the table keeps it)
place_bets (the table’s dealer signs too and pays the fee)
The dealer
open_round, lock_round
Anyone
reveal (with the right seed, within 2 minutes), settle, forfeit (cancels, after 2 minutes), void_round (after 10 minutes), refund, close_bets, close_round, pay_buyback, apply_buyback (after 7 days), apply_dealer (after 25 hours)
Investors
invest, request_withdrawal, execute_withdrawal
The owner
set_paused, set_bank_limit, set_fee, propose_dealer, propose_owner, propose_buyback
A new owner
accept_owner (25 hours after being named)

The number: the key is the 32-byte seed followed by the 32-byte hash of the later block (64 bytes). The program computes HMAC-SHA256 of the text "roulette3:<round id>:<counter>" (the round’s id on Solana; counter 0, 1, 2 …), reads each result as 32-bit big-endian numbers and turns them into 0–36 by rejection sampling, so no number is favoured.

To recompute a round by hand you need its seed, the hash of the block mixed in and its id on Solana: the Verify page shows them for any round played since 25 September 2026, under “The raw values”.

import hashlib, hmac

def roulana_number(seed_hex, block_hash_hex, round_id):
    """A round's winning number, 0-36: its seed and the hash of the block mixed in
    (64 hex characters each) and its id on Solana."""
    key = bytes.fromhex(seed_hex) + bytes.fromhex(block_hash_hex)   # 64 bytes
    limit = (2**32 // 37) * 37                  # rejection sampling: no number is favoured
    counter = 0
    while True:
        h = hmac.new(key, f"roulette3:{round_id}:{counter}".encode(), hashlib.sha256).digest()
        for i in range(0, 32, 4):
            x = int.from_bytes(h[i:i + 4], "big")
            if x < limit:
                return x % 37
        counter += 1

def fingerprint(seed_hex):
    """What was sealed on Solana before the first bet: SHA-256 of the seed."""
    return hashlib.sha256(bytes.fromhex(seed_hex)).hexdigest()

Or check a round in one click, or run verify-round.py on your own computer.

Live data · The bank as data · The whole site as text