Provably fair
Every shoe is committed before you see a card, and can be reproduced after the hand.
The commitment
Before a hand starts we generate a random server seed and publish only its SHA-256 hash. You supply a client seed, which you can change at any time, and each hand uses an increasing nonce.
The shuffle
The shoe order is produced by a Fisher-Yates shuffle driven by HMAC-SHA256 over the server seed, client seed and nonce, using rejection sampling so every position is uniform. No browser randomness is involved and the deck is never re-ordered mid-hand.
The reveal
When a seed is retired we publish the server seed. You can then confirm that its hash matches the one shown before play, and re-run the shuffle for any hand from your history to reproduce the exact card order.
Verify it yourself
Each completed hand in your history includes the hashed server seed, the revealed server seed once rotated, your client seed, the nonce and the resulting card order, so an independent implementation can reproduce the result. In History, tap Verify on any hand to run the check in one step.
Or check us without our site: paste this into Node.js with your revealed seeds.
const { createHash, createHmac } = require("crypto");
const [serverSeed, clientSeed, nonce] = ["SERVER_SEED", "CLIENT_SEED", 0];
console.log("hash", createHash("sha256").update(serverSeed).digest("hex"));
function* bytes() { for (let r = 0; ; r++) yield* createHmac("sha256", serverSeed).update(`${clientSeed}:${nonce}:${r}`).digest(); }
const s = bytes(), next = (max) => { const lim = Math.floor(2 ** 32 / max) * max;
for (;;) { const v = ((s.next().value << 24) >>> 0) + (s.next().value << 16) + (s.next().value << 8) + s.next().value; if (v < lim) return v % max; } };
const shoe = [];
for (let d = 0; d < 6; d++) for (const su of "SHDC") for (const r of ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]) shoe.push(r + su);
for (let i = shoe.length - 1; i > 0; i--) { const j = next(i + 1); [shoe[i], shoe[j]] = [shoe[j], shoe[i]]; }
console.log(shoe.slice(0, 12).join(" "));Bet Behind
You can back any seated player with up to $100 USDC on their next hand. Your back pays exactly what their main bet pays (doubles and splits included; side bets are not copied). When you win, 5% of your winnings goes to the player you backed; losses and pushes carry no cut. If they don't play within 10 minutes, your stake is refunded in full. Seat totals are public; who backed whom is never shown.
Side bet paytable
Side bets use the same committed shuffle and are settled the moment your first two cards and the dealer's up-card are dealt. Each side bet matches your main bet up to a maximum of $1.
Table rules: six decks, blackjack pays 3:2, the dealer hits soft 17, and you can double down on a hard or soft total of 9, 10 or 11 (including after a split).
- Perfect Pairs — perfect pair (same suit) 25:1, coloured pair 12:1, mixed pair 6:1.
- 21+3 — suited trips 100:1, straight flush 40:1, three of a kind 30:1, straight 10:1, flush 5:1.
- Mega Royal jackpot — fixed 10¢ bet; 10% of every bet grows the pot. Wins the whole pot only when your first two cards and the dealer's two cards are both K♠ + Q♠ (about 1 in 2.6 million hands). The pot resets to $862.70 after a win.
What the house charges
There is no table fee: 0% rake on every hand. A $1 bet puts exactly $1 on the felt. The house edge comes only from the standard blackjack rules and the side-bet paytables above.
Cash-outs carry a 1% fee to cover processing and Solana network costs.
Who you see at the table
The seat rail shows players who are genuinely here — nobody is invented, borrowed or simulated. Each one appears as a four-character wallet fragment plus a portrait generated from that wallet; never a name, an email address or a full address. A seat is released automatically a few minutes after its player goes quiet, and reactions on the felt are kept for ten minutes.
This document is a working draft. Before launch the operator must have it reviewed and approved by qualified legal counsel in every market served.