Fairness

How CivBet stays fair.

Every game on CivBethas a documented house edge. The rules engines are open source, all randomness comes from the operating system's cryptographic RNG, and every bet and payout lands in a permanent public ledger. The numbers below are pulled live from that ledger — not stage-managed.

Rounds played
23,146
last 30 days
Total wagered
587,191
all games combined
Overall hold
-3.14 %
house take / wagered

By game

Each card shows the documented edge, a one-line description of the math, and the realised hold from the last 30 days. With enough rounds, realised should converge on documented — if it doesn't, something is off and we want to know about it. Poker is the exception: it's player-vs-player, so it earns rake rather than a house edge and has no single rate to converge on. Its numbers are broken down in full further down this page, and are left out of the totals above so a rake rate doesn't skew the house-edge average.

Slots

Documented edge
4.80 %

Per cell: independent weighted draw (coal 38% → diamond 2%). 7 paylines, per-line stake = bet/7. Pays on 3/4/5 consecutive matches from the left. The leftover fractional coin is settled with unbiased rounding, so the 95.2% RTP holds at every stake.

One crypto.randomInt(0, 100) per cell (15 cells per spin) mapped onto symbol weights, plus one crypto draw per spin to settle the fractional-coin payout without bias.

Rounds
4,517
Wagered
16,920
Realised hold
17.10 %

Roulette

Documented edge
2.70 %

European single-zero wheel (37 pockets). Every bet type has coverage × payout_multiplier = 36, so the house edge is exactly 1/37 across the board.

One crypto.randomInt(0, 37) per spin chooses the winning pocket.

Rounds
3,137
Wagered
192,888
Realised hold
-10.41 %

Blackjack

Documented edge
0.50 %

Single deck, dealer hits soft 17, blackjack pays 3:2, split pairs to four hands with double-after-split, no insurance / no surrender. ~0.5% edge against optimal basic strategy.

Fisher–Yates shuffle of a 52-card deck driven by crypto.randomInt at the start of each hand.

Rounds
5,239
Wagered
165,868
Realised hold
-0.19 %

Crash

Documented edge
3.00 %

3% instant-bust probability on the 1/(1-r) crash curve. Cash-out time is server-authoritative; multiplier is clamped to the round's crash point.

One crypto.randomInt(0, 1_000_000) per round seeds the crash point.

Rounds
377
Wagered
6,056
Realised hold
-2.16 %

Mines

Documented edge
1.00 %

Multiplier = 0.99 × C(25, k) / C(25-m, k) where m is the mine count and k is the safe reveals. Floored to 2dp in the house's favour.

Partial Fisher–Yates over indices 0..24 places mines uniformly at random at bet time.

Rounds
1,219
Wagered
16,184
Realised hold
7.54 %

Coin Flip

Documented edge
1.00 %

Fair 50/50 coin. Winning bets pay 1.98× the stake (1% house edge baked into the payout, not into the coin).

One crypto.randomInt(0, 2) per flip selects heads or tails.

Rounds
7,600
Wagered
178,066
Realised hold
-1.52 %

Plinko

Documented edge
1.00 %

16-row board; the ball lands in bucket i with binomial probability C(16, i) / 2^16. Every peg is a fair 50/50 — the 1% edge lives in the payout multipliers, not the ball. Each risk table (low/medium/high) is tuned so Σ P(i) × multiplier(i) ≤ 0.99, and the leftover fractional coin is settled with unbiased rounding so the RTP holds at every stake.

16 × crypto.randomInt(0, 2) per drop pick the left/right bounce at each row, plus one crypto draw to settle the fractional-coin payout without bias.

Rounds
1,057
Wagered
11,209
Realised hold
6.01 %

Poker (PvP)

Top rake band
5.00 %

No-Limit Hold'em between players, 2 to 4 to a table — the house is not a counterparty and wins nothing when you lose. Rake schedule: pots up to 10 are free, 11–20 pay a flat 1, larger pots pay 5% capped at 10 big blinds. Hands that end before the flop are never raked, and the uncalled part of a bet is returned before rake is worked out.

Each hand's deck is shuffled deterministically from a 32-byte server seed via an HMAC-SHA256 stream driving Fisher–Yates. SHA-256 of that seed is published to the table before anyone acts, and the seed itself is revealed when the hand ends, so the shuffle can be recomputed and checked.

Rounds
1,000
Wagered
21,694
Realised rake
4.00 %

Poker — player vs player

Poker is the one game where the house isn't your opponent: pots move between players, and the house takes a rake. Hands that end before the flop are never raked at all (“no flop, no drop”), and every band is capped at 10 big blinds. There is no house edge to converge on, so instead of a hold number this section reports the rake actually taken, straight from the per-hand audit rows.

Pot sizeRake
Up to 10Nothing
11 – 201 Diamond
Over 205%, max 10 big blinds

Being precise about that middle band: a flat Diamond on an 11-Diamond pot is 9.1%, above the 5% the top band charges. It exists because 5% of a small pot rounds down to nothing, and we'd rather state the schedule plainly than advertise “5%” and quietly charge more. Big pots run well under 5% for the opposite reason — the 10 BB cap bites. The realised figure below is the honest average across both.

Hands (last 30 days)

1,000

Total pots

21,694

Rake taken

867(4.00% of pots)

  • Commit-reveal decks. Before any action in a hand, every player is shown SHA-256(server_seed). When the hand ends, the seed is revealed. The deck order is derived deterministically from the seed (HMAC-SHA256 counter stream driving a Fisher–Yates shuffle over the ordered deck), so anyone can recompute the exact 52-card order and verify the server could not have reordered cards in response to play.
  • What that doesn't prove. Commit-reveal proves the deck was fixed before betting; it does not, by itself, prove the server never showed one player another's hole cards. Our answer to that is the same as every major poker site's, stated honestly: an open-source engine, an append-only event log, revealed seeds — and an operator with no stake in the outcome, because the house isn't in the hand.
  • Uncalled bets are never raked. The uncalled portion of a bet returns to the bettor before rake is computed, and hands that end preflop pay no rake at all.

How the randomness works

  • Cryptographic RNG. Every random draw comes from node:crypto.randomInt — the same primitive used for generating cryptographic keys. JavaScript's Math.random is banned in the games directory and the test suite enforces it.
  • Server-authoritative. The client never decides outcomes. It sends your bet and your choice; the server independently rolls the result and writes both the stake and the payout to the ledger in a single atomic transaction.
  • Per-round audit trail. Every completed round is inspectable from your History — click Auditon any row to see the post-round state (Crash point, mine layout, dealer cards, slot grid, etc.) and, for multi-step games, the server seed stored on the round's session row. For the house games the seed currently functions as a stable identifier; poker already uses full commit-reveal (see the poker section above), and extending it to the single-roll games is on the roadmap.
  • Immutable ledger. Every bet and every payout lands as a row in our transactions table. The realised-hold numbers on this page are computed live from those rows; there's no separate “what we want to show” table.

Verify it yourself

Don't take our word for it — read the code. Each game's rules engine is a single small file, and the math above is right there in plain TypeScript.

GameRules engine
Slotsslots-data.ts
Rouletteroulette-data.ts
Blackjackblackjack.ts
Crashcrash.ts
Minesmines.ts
Coin Flipcoinflip.ts
Plinkoplinko-data.ts
Poker (PvP)poker/engine.ts
RNGrng.ts