Poker (No-Limit Texas Hold'em) — Rules, Rake, and Provable Fairness
Poker on Ganbate is No-Limit Texas Hold'em played against the other people at the table, not against a house bet. You take a seat, buy in with Coins, and are dealt two private cards. Five community cards come out in three stages — the flop (three cards), the turn (one), the river (one) — with a round of betting before and after each stage. You make the best five-card hand you can out of your two cards and the five on the table, and the last player standing (or the best hand at showdown) takes the pot. There is no house wager against your hand: the Coins in the pot are the seated players' Coins. Ganbate's cut is the rake, described in full below.
The seats around you are real players — house bots are a development-and-testing tool and are never cast at live tables. See Bots.
Coins are play money. They have no cash value, and nothing at a poker table can be withdrawn, redeemed, or transferred out.
Where poker sits in the product
| Route | /poker (lobby) → /poker/:tableId (table) |
| Game | No-Limit Hold'em, 2–6 seats |
| Formats | Cash games, Run It Twice cash, Sit & Go tournaments |
| Opponents | Real players only at live tables (house bots are dev/testing only — see Bots) |
| House cut | Rake: 10% of the pot, capped at 50.00 Coins |
| Provably fair | Yes — pf-hmac-sha256-fy-v1 commit-reveal shuffle |
Tables
Every number below is read straight from the table definitions in the server (main/server/core/src/casino/poker.service.ts). Amounts are shown in Coins.
Cash games (6 seats each)
| Table | Small blind | Big blind | Buy-in range |
|---|---|---|---|
| Micro 50/100 | 50.00 | 100.00 | 4,000.00 – 20,000.00 |
| Mid 200/400 | 200.00 | 400.00 | 16,000.00 – 80,000.00 |
| High 1K/2K | 1,000.00 | 2,000.00 | 80,000.00 – 400,000.00 |
| Run It Twice 200/400 | 200.00 | 400.00 | 16,000.00 – 80,000.00 |
A new account starts with 50,000.00 Coins, so Micro is playable from the starting bankroll (a 40–200 big-blind buy-in) and the higher tables are something you work up to.
Your buy-in leaves your wallet as Coins when you sit down and becomes your chips; when you leave, whatever chips you have left go back to your wallet as Coins. Chips at a poker table are Coins — the same balance, held on the felt.
Run It Twice is an ordinary 200/400 cash table with one difference: when a hand goes all-in before the board is complete, the remaining community cards are dealt twice, from the same shuffled deck (the second run continues where the first left off). Each pot is split evenly across the two runs — the odd Coin goes to the first run — and each half is awarded on its own board. It reduces variance; it does not change anyone's expectation.
Sit & Go tournaments
| Table | Seats | Entry |
|---|---|---|
| Heads-Up SNG 2.5K | 2 | 2,500.00 |
| 6-Max SNG 10K | 6 | 10,000.00 |
Structure (identical for both):
- Starting chips: 10,000 tournament chips. These are not Coins — inside a tournament you play for chips, and Coins are only paid out at the end.
- The tournament starts when every seat is full. Until then it is "registering" and you can sit or leave freely.
- Blind levels rise every 4 minutes, through ten levels:
| Level | Blinds | Level | Blinds | |
|---|---|---|---|---|
| 1 | 100 / 200 | 6 | 600 / 1,200 | |
| 2 | 150 / 300 | 7 | 800 / 1,600 | |
| 3 | 200 / 400 | 8 | 1,200 / 2,400 | |
| 4 | 300 / 600 | 9 | 1,600 / 3,200 | |
| 5 | 400 / 800 | 10 | 2,400 / 4,800 |
Level 10 is the last; the blinds stay there.
- Prize pool = entry × entrants. Payouts: with 3 or fewer entrants, winner takes all. With 4 or more, 1st takes 65% and 2nd takes 35%.
- You cannot leave a running tournament — you play until you bust or win.
- Walking away from a running tournament blinds you off. Sitting out in an SNG does not take you out of the rotation the way it does on a cash table: you keep being dealt in, your blinds keep posting, and your hand is auto-folded when the action reaches you. The disconnect protection described below is a cash-table feature and does not apply here — nobody sits you out safely and nobody cashes you out. You lose your stack a blind at a time until you bust, and your entry goes with it. Only enter an SNG when you can play it out.
- If ten consecutive hands pass with no player making a voluntary action (i.e. everyone has walked away — bot moves do not count), the tournament is cancelled and the prize pool is split in proportion to the chip stacks still on the table. Anyone already busted out gets nothing back, and the seats are cleared so the SNG can register again.
How to play: the actual controls
Sitting down. From /poker, filter by All / Cash Games / Tournaments, then open a table. Click an empty seat on the felt. For a cash table, a Buy-in field appears showing the legal range (it defaults to the table maximum if you leave it blank); confirm with the Sit button. Tournament entry is a fixed amount, so there is no buy-in field. Guests can watch a table, but clicking a seat opens the sign-in modal instead.
Acting. When it is your turn, the tile bar in front of your seat shows only the actions that are legal right now:
- Fold — surrender the hand (only shown when you owe chips).
- Check — pass, when you owe nothing.
- Call — match the current bet. The tile shows exactly what it costs.
- Bet / Raise — opens a sizing popup: a vertical slider stepped in big blinds, with Min / ⅓ / ½ / Pot / Max presets beside it. Confirm with the button underneath. If you have too few chips to make a real raise, the tile simply reads All-in.
Bet and raise amounts are raise-to totals — the total you will have committed on this street after the action, not the increment on top.
The clock. You have 25 seconds to act. On cash tables you also carry a 30-second time bank, spent in 10-second chunks when the clock runs out, and refilled every time you act voluntarily. When the clock and the bank are both gone, you are auto-checked if checking is legal, otherwise folded — and on a cash table you are then sat out so the table isn't held up. The next hand begins 5 seconds after the previous one settles.
Table menu (☰). Sit out — stop being dealt in (you cannot start sitting out while you still have a live hand; fold it first). Leave — return your chips to your wallet as Coins; the same rule applies, so fold before you go if you are still in a hand. Sitting out on a cash table means you are skipped; you are never blinded off. Returning ("I'M BACK") refills your time bank. In a running tournament, sitting out does the opposite of protecting you — you are still dealt in, your blinds still post, and you are auto-folded on your turn, so you blind away. Leave is unavailable there. See Sit & Go tournaments above.
Straddle (cash tables only, 3+ players). A toggle in the table bar. When it is on and you are under the gun — the seat to the left of the big blind — you post a live blind of 2× the big blind before the deal. It becomes the amount everyone must match, you act last before the flop, and you keep the option to raise.
If you disconnect (cash tables). Your client polls the table every 1.5–4 seconds. Miss that for 15 seconds and you are treated as away: you are sat out rather than blinded off, and you keep your seat and stack. If you are still gone after 4 dealt hands (or 5 minutes on an idle table), your seat automatically cashes out to your wallet. A refresh inside that window walks you back into the game.
None of that protection exists in a tournament. There is no presence grace and no auto-cash-out in an SNG: a disconnected seat keeps being dealt in, keeps posting blinds, and is auto-folded until it busts.
The rules of the hand
Standard No-Limit Hold'em, implemented in main/shared/src/modules/core/poker/engine/. The specifics worth knowing:
- Blinds. The seat to the left of the button posts the small blind, next to their left the big blind. Heads-up (two players), the button posts the small blind and acts first before the flop, last afterwards.
- The deal. Two hole cards each, dealt one at a time going clockwise, starting with the seat to the left of the button.
- The board — no burn cards. The flop is simply the next three cards off the deck, the turn the next one, the river the one after that. (Online convention; it also makes the deck trivially checkable against the published shuffle.)
- Betting rounds: preflop → flop → turn → river. After the river, showdown.
- Minimum bet is one big blind. Minimum raise is the size of the last full bet or raise.
- Short all-ins do not reopen the action. If someone goes all-in for less than a full raise, players who have already acted may call or fold but may not re-raise. The amount to call goes up; the minimum raise does not.
- Side pots are built automatically when players are all-in for different amounts.
- All-in runout. Once fewer than two players can still act, the remaining board is dealt with no more decisions (twice, at a Run It Twice table).
- Uncontested pots are not shown. If everyone folds, the winner takes the pot without revealing anything — no board, no hole cards. Cards are only revealed at a genuine showdown, and only for players who reached it.
- Chops are exact. The evaluator scores each player's best five of seven as a single ordered number; equal numbers split the pot.
Hand rankings (highest to lowest)
Straight Flush · Four of a Kind · Full House · Flush · Straight · Three of a Kind · Two Pair · Pair · High Card
The wheel (A-2-3-4-5) counts as a straight. A royal flush is simply the highest straight flush — the engine does not treat it as a separate category.
Payouts, the rake, and what the house takes
There is no payout table, no multiplier and no RTP for poker, because there is no house bet to have an edge on. Your Coins go into a pot contested by the other real players at the table; the Coins that come back to you are theirs, not a payout from a paytable. What the house takes is the rake, and that — not an edge on a wager — is the cost of playing poker here.
Edge Rebate does not apply to poker. The daily 0%-edge allowance covers instant, one-shot bets only; poker is excluded, along with Blackjack and Crash.
Cash tables
Rake = 10% of the pot, capped at 50.00 Coins, and only if a flop is dealt. (No flop, no drop — a pot that ends before the flop is raked nothing.)
Source: POKER_RAKE_BP = 1_000 (10.00%) and POKER_RAKE_CAP_CENTS = 5_000 (50.00 Coins) in main/shared/src/modules/core/poker/rake.ts.
rake = min(50.00 Coins, floor(pot × 10%))So the cap binds on every pot of 500.00 Coins or more, and above that the rake is a flat 50.00 Coins — a proportionally smaller bite the bigger the pot gets. The rake is drawn from the winners' chips in proportion to what each won, and is recorded as an explicit rake entry on your ledger when you cash out, so the house's take is auditable per player.
Tournaments
The prize pool is raked once, at payout, by the same formula: 10% of the prize pool, capped at 50.00 Coins, taken from the champion's winnings. Because of the cap, that is 50.00 Coins on any prize pool of 500.00 Coins or more — 1% of a full heads-up SNG (2 × 2,500.00 = 5,000.00 pool), and 0.083% of a full 6-max SNG (6 × 10,000.00 = 60,000.00 pool).
Only the champion pays it: second place is paid its 35% share in full, and a cancelled SNG is not raked at all — the whole pool goes back to the chip stacks left on the table.
On strategy
We do not tell you how to play, and we promise you nothing about how it will go. The rake means the table as a whole always takes out less than it puts in, so across every seat poker here is a losing proposition in Coins. No system, betting pattern, table selection or style of play changes that, and nothing on this page should be read as advice for winning. Some seats may be house bots. Play poker because the decisions are interesting, and expect the Coins to go down.
Provable fairness: how the deck is derived
Poker uses its own, versioned fairness spec — pf-hmac-sha256-fy-v1 (main/shared/src/modules/core/poker/engine/fairness.ts). It is not the same encoding the instant games (dice, plinko, crash…) use. If you write your own verifier, implement this one for poker.
The commit-reveal cycle
- Before the deal, the server generates a fresh 32-byte random
serverSeed(64 lowercase hex characters) — a new one for every hand — and publishes its commitment:
commitment = SHA-256( decode_hex(serverSeed) )Note it hashes the decoded 32 bytes, not the hex text.
- The client seed is the table id (a UUID) and the nonce is the hand number at that table. Both are public and visible before the cards come out.
- The deck is derived from those three values (below), and the hand is dealt from it.
- After the hand settles, the server reveals the
serverSeed. Anyone can then re-hash it to check it matches the commitment published beforehand, and re-derive the exact deck.
Because the seed is committed before the deal and revealed afterwards, the server cannot have chosen the shuffle to suit the cards it saw.
The shuffle
A byte stream is produced by HMAC-SHA256:
key = decode_hex(serverSeed) // 32 raw bytes
message = u32be(len(clientSeed)) || clientSeed // length-prefixed, no delimiters
|| u64be(nonce) || u32be(counter)
block(i) = HMAC-SHA256(key, message with counter = i) // 32 bytes
stream = block(0) || block(1) || block(2) || ...The stream is consumed four bytes at a time as big-endian unsigned 32-bit integers. To pick an unbiased index in [0, max]:
range = max + 1
limit = floor(2^32 / range) × range
draw a uint32; if it is ≥ limit, throw it away and draw again // rejection sampling
index = uint32 mod rangeRejecting the tail is what removes modulo bias — every index is exactly equally likely.
The deck starts in a fixed order — for each suit in clubs, diamonds, hearts, spades, each rank 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A (so index 0 = 2♣ … index 51 = A♠) — and is shuffled with Fisher–Yates:
for i = 51 down to 1:
j = unbiased index in [0, i]
swap deck[i], deck[j]From deck to cards
There are no burn cards, so with n players dealt in, the mapping is exactly:
| Deck position | Goes to |
|---|---|
| 0 … n−1 | first hole card, clockwise from the seat left of the button |
| n … 2n−1 | second hole card, same order |
| 2n, 2n+1, 2n+2 | the flop |
| 2n+3 | the turn |
| 2n+4 | the river |
(At a Run It Twice table, a second runout takes the next cards after the first run's.)
Verifying it yourself
Go to /verify, choose Poker, and paste the revealed serverSeed, the committed hash, the table id as the client seed, and the hand number as the nonce. It re-derives the full 52-card deck order and checks the commitment for you. /fairness explains the scheme and is open without an account.
Honest gap: the poker table screen does not display the seed or its commitment, so verifying a hand is not yet a one-click job from the felt. Nothing is hidden, though — it is all in the table-state response your client is already polling, and that endpoint is public. While a hand is live,serverSeedHashcarries its commitment; once the hand settles,lastResultcarries the revealedserverSeed, theclientSeed(the table id), thenonce(the hand number) and the commitment again. Capture the commitment mid-hand, take the seed after it, and you can check the pair yourself. The table id is also right there in the page URL. Until the felt surfaces them, that response is where to copy them from.
A worked hand
Heads-up on Micro 50/100. Both players buy in for 4,000.00 Coins. You are on the button — heads-up, that means you post the small blind (50.00) and your opponent posts the big blind (100.00).
The published values for this hand:
serverSeed(revealed after the hand):3f0a9c2b7e4d18a65c93f0e2b8d47a1069f5c3e28b7d4a0165c9e3f2b8a7d401commitment(published before it):7f3a64b6535319a87d0bc3bb4e3936d34839dbc03ec278fa58572e43cddaf303clientSeed(the table id):2f3c9a71-1c4e-4c9a-9f2d-8b7a6e5d4c31nonce(the hand number):142
Running the derivation above gives a deck that starts:
4D 6C 2H 3H | 9H TC 7C | KS | 8H …Two players, so n = 2. Cards 0 and 2 go to the seat left of the button (the big blind); cards 1 and 3 to the button. Then the flop, the turn, the river:
- Big blind's hole cards: 4♦ 2♥
- Your hole cards (button): 6♣ 3♥
- Flop: 9♥ T♣ 7♣ Turn: K♠ River: 8♥
How it plays:
| Street | Action | Pot |
|---|---|---|
| Preflop | You raise to 300.00; big blind calls | 600.00 |
| Flop 9♥ T♣ 7♣ | BB checks; you bet 400.00; BB calls | 1,400.00 |
| Turn K♠ | Check, check | 1,400.00 |
| River 8♥ | BB checks; you bet 700.00; BB calls | 2,800.00 |
Showdown. Your 6♣ with the board's 7♣ 8♥ 9♥ T♣ makes a straight, ten-high. Your opponent's 4♦ 2♥ miss entirely, so they play the board: K-T-9-8-7 high card. You win.
The pot is 2,800.00 Coins and a flop was dealt, so the rake applies: 10% of 2,800.00 is 280.00, which is above the 50.00 cap, so the rake is 50.00 Coins. You are credited 2,750.00 Coins into your stack.
Your net for the hand: you put 1,400.00 in and got 2,750.00 back — +1,350.00 Coins. Your opponent is down 1,400.00. The house took 50.00 in rake. No real money moved, because none is involved — Coins have no cash value.
This hand is here to show the derivation and the rake arithmetic end to end, with cards that really do come off that seed. It is not a demonstration of how to play, and it says nothing about how any hand of yours will go.
Bots (dev and testing only)
House bots exist in the code but are a development and testing tool — they are gated behind an opt-in that is off in production (CASINO_ALLOW_POKER_BOTS, poker.service.ts), so no bot is ever cast at a live table and every opponent you face is a real player. They are never seated automatically; when enabled in a dev environment they are marked as bots in the table state, their names end in -bot, and they play from a fixed roster of house-owned accounts.
What they can and cannot do, from the code (main/server/core/src/casino/poker-bot.ts):
- They decide from their own two cards and the shared board only — the same information you have. They do not see anyone's hole cards.
- They act legally, like any seat, and pause 0.9–2.6 seconds before acting so the table does not feel mechanical.
- Their choices are heuristic (hand strength, board texture, position, field size, plus a random roll). They are not tuned to take your Coins, and they are not tuned to give them to you either.
We would rather tell you plainly than let you assume every seat is a stranger.
Fair play
Poker pots are the one place in Ganbate where Coins pass legitimately from one player to another, which makes them the obvious place to try to funnel Coins to a friend. Two things sit in the way. The rake charges every raked pot up to 10% of it (capped at 50.00 Coins), so a pass is never free. More to the point, the per-hand net result of every seat is recorded, and one-way chip flow between the same pair of accounts — repeated hands where the same account keeps winning from the same account — is aggregated and surfaced to admins for review. Collusion and chip-dumping are not tolerated.
Rules, odds and fairness: Odds & House Edge · Provably Fair · Verify a bet · Your bets · How Coins work · Responsible Play
Ganbate is a free-to-play social casino for adults 18+. Coins have no cash value. They cannot be withdrawn, cashed out, redeemed, transferred between players, gifted, sold, or traded. There are no prizes of monetary value. Free Coins are always available, so you never need to buy any.