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
13,249
last 30 days
Total wagered
128,473
all games combined
Overall hold
6.01 %
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.

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
2,188
Wagered
16,667
Realised hold
5.33 %

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
1,578
Wagered
22,230
Realised hold
6.26 %

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,609
Wagered
25,016
Realised hold
5.60 %

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
651
Wagered
30,107
Realised hold
6.64 %

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
797
Wagered
7,699
Realised hold
-3.94 %

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
548
Wagered
3,925
Realised hold
21.66 %

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,878
Wagered
22,829
Realised hold
6.56 %

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
RNGrng.ts