The visible “casino” is a thin real-time UI over two hard systems: a money ledger and a crypto wallet. Roughly 80% of the genuine engineering difficulty lives there, not in the games. This document maps the full system — the player-facing surface, the money internals, the third-party integration contracts, the account/identity/responsible-gambling subsystem, the operator back-office, and the operational flows that tie them together — ranks every component by how optional it is to launch, and goes one level into the parts that are actually hard.
People call them “casinos,” but technically each is four products fused into one balance and one real-time session:
The “casino” you see is a UI over a money ledger and a wallet service. Everything else either sits on those two, or is integrated rather than built.
Two products are easy to forget because of where they sit. The first is the player-facing application itself (§4) — the ~150-feature real-time client (wallet, lobby, bonus center, VIP, social, provably-fair verifier, responsible-gambling controls) that is the casino to the user. The second is the invisible operator back-office (§14) — a 15-plus-module admin panel for players, payments, bonuses, affiliates, risk, and analytics. Beneath both is a fifth load-bearing subsystem players only half-see: accounts, identity & responsible gambling (§13) — registration, authentication, KYC, limits, self-exclusion, geolocation. Each of these is as much engineering as the games, and you cannot run real money without at least their cores.
The single most useful lens on this system: most of what makes it look like Stake is optional. The mandatory core is small. Axis = can you ship and operate without it?
Even a fully bought white-label has these; the vendor just owns them.
| Component | Why mandatory |
|---|---|
| Accounts / auth / sessions | No identity → no balance to bet. Registration, login, session lifecycle (§13). |
| Player client (wallet UI, lobby, game launch, history) | The product the user touches. A backend with no usable client is not a casino (§4). |
| Money ledger (multi-asset, double-entry, integer money) | Holds player funds, survives concurrency. A bug here is direct, unrecoverable loss. |
| Crypto wallet / payments (deposit + withdraw, ≥1 chain) | It’s a crypto casino. No deposit/withdraw → no product. |
| ≥1 game content source | You need something to bet on. Which source is a Tier-1/2 choice — “games exist” is mandatory, “games are original” is not. |
| Edge / DDoS / basic security | Constant attack target; unprotected it doesn’t stay up. |
| Geo-blocking + legal wrapper | Must hard-block prohibited jurisdictions to exist at all (§13.5). |
| Component | Optionality |
|---|---|
| Aggregated content (slots + live) | The default answer to “≥1 game source,” and the reason originals are optional. Bought over a seamless-wallet API; for most entrants this is the whole catalog. |
| KYC / AML pipeline | Required for compliant withdrawals and high-risk flows; often tiered and vendor-integratable. Regulated models may require verification before play; crypto/offshore models commonly gate stricter checks on withdrawals, volume, bonus/risk events and source-of-funds thresholds (§13.3). |
| Responsible-gambling controls (limits, self-exclusion) | Server-side limit enforcement + self-exclusion is small to build and present in every serious platform (§13.4). |
| Custody hardening (hot/cold, MPC/HSM, policy) | Wallet is Tier 0; its hardening is Tier 1. Can start simple, harden as float grows (§6). |
| Chain-analysis screening | Banking/licensing requirement at scale; skippable very early, mandatory fast. |
| Reconciliation (on-chain vs ledger liabilities) | Near-mandatory ops automation; operators who skip it find the hole the hard way. |
| Logging / audit / significant-events | Without a queryable, tamper-evident event & game log you cannot resolve disputes, reconcile, or prove fairness (§17). |
| Back-office / admin — core (player lookup, withdrawal approval queue, balance adjust, ban/lock) | You cannot operate real money without it. The minimum operations console is mandatory; the 15-tab suite is Tier 2. |
| Provider settlement / reconciliation (GGR rev-share) | Mandatory the moment you have third-party providers; it’s how you pay them and stay solvent. |
None required to launch or operate. How you compete, not how you exist.
| Component | What it buys | Cost of skipping |
|---|---|---|
| Original in-house games | The differentiator, best margin, “verify it yourself” trust. | You’re a reskinned aggregator. Viable, undifferentiated. |
| Real-time tier | Shared-round games (Crash), live feed, chat. | Largely skippable if you skip originals — see cascade. |
| Bonus / VIP / rakeback / gamification | Retention; the main reason crypto players stay. | Higher churn; not a blocker. |
| Sportsbook | A second product on one balance. | Pure bolt-on; integrate later or never. |
| Chat / social / rain / tips | Community + virality (BC.Game’s signature). | Quieter product; no functional loss. |
| Advanced anti-fraud | Loss prevention at scale. | Basic checks are Tier 1; advanced scales with size. |
| Back-office depth (bonus builder, affiliate/agent system, CRM, analytics/graphs, VIP host tooling) | Operational leverage; the 15-tab admin suite. | You run on spreadsheets + manual ops. Works small, breaks at scale. |
┌─────────────────────────────────────────┐
│ Edge / CDN │
│ Cloudflare (DDoS, WAF, geo, bot mgmt) │
└───────────────┬──────────────────────────┘
│
┌────────────────────────────┼────────────────────────────┐
│ │ │
┌──────▼──────┐ ┌────────▼────────┐ ┌────────▼────────┐
│ Web/App │ WS/REST │ API Gateway │ gRPC │ Realtime / WS │
│ (Next/React) │◄─────────►│ (auth, rate- │◄─────────►│ fan-out (NATS/ │
│ + mobile │ │ limit, routing) │ │ Redis pub/sub) │
└──────────────┘ └────────┬─────────┘ └─────────────────┘
│
┌───────────────┬─────────────────────┼─────────────────────┬──────────────────┐
│ │ │ │ │
┌──▼───────┐ ┌────▼──────┐ ┌────────▼────────┐ ┌───────▼───────┐ ┌──────▼──────┐
│ LEDGER │ │Wager engine│ │ Wallet / Chain │ │ Aggregator │ │ Sportsbook │
│ (double- │ │ + in-house │ │ Service (HD │ │ Adapter │ │ Adapter │
│ entry, │ │ games + │ │ wallets, hot/ │ │ (seamless │ │ (3rd party) │
│ balances)│ │ RNG) │ │ cold, signing) │ │ wallet API) │ │ │
└──┬────────┘ └────┬───────┘ └────────┬────────┘ └───────┬───────┘ └─────────────┘
│ │ │ │
│ ┌────▼─────┐ ┌───────▼──────┐ ┌───────▼────────┐
│ │ seed │ │ Custody (MPC/ │ │ Game providers │
│ │ commit/ │ │ HSM) + nodes/ │ │ (Evolution, │
│ │ reveal │ │ RPC + indexer │ │ Pragmatic...) │
│ └──────────┘ └───────────────┘ └────────────────┘
│
┌──▼─────────────────────────────────────────────────────────────────────────┐
│ Cross-cutting: Accounts/Identity/KYC · Bonus/VIP · Anti-fraud/AML · Risk │
│ Geolocation · Responsible-gambling limits · Notifications (email/SMS/push) │
│ Event pipeline → data warehouse · Audit/significant-events log · Observability│
├──────────────────────────────────────────────────────────────────────────────┤
│ BACK-OFFICE / ADMIN (§14): players · payments · bonuses · affiliates · │
│ reports/graphs · risk · CMS · staff RBAC · PROVIDER SETTLEMENT (GGR rev-share)│
└──────────────────────────────────────────────────────────────────────────────┘
Cross-cutting services in the lower box are not optional plumbing details: accounts/identity (§13), the significant-events/audit log and event pipeline → warehouse (§17), and notifications are load-bearing subsystems referenced throughout. They’re drawn flat here because every vertical column depends on them.
The product the user actually touches — and the surface the original document omitted entirely. A mature crypto casino client is ~150 features across roughly a dozen areas. It is a real-time single-page app: one seamless balance, updated over WebSocket, shared across originals, slots, live, and sport. Below is the surface map drawn from the Stake / BC.Game / Shuffle help centers, tiered by how much you need at launch.
| Area | Features (representative) | Tier |
|---|---|---|
| Onboarding | Register by email / social (Google, Twitch) / wallet; username + strong-password; email verification; age & geo gate; referral-code entry; first-run KYC-lite (name, address, DOB). | T0 |
| Auth & session | Login, 2FA/TOTP prompt, password reset, “remember device,” active-sessions list + revoke, login history, last-login-time display. | T0 |
| Wallet / cashier | Multi-currency balance + fiat-equivalent display; deposit (per-chain address + QR, network select, memo/tag warning, confirmation tracker); withdraw (address, network + fee, 2FA, whitelist); currency swap/convert; on-ramp (MoonPay/Swapped); Vault / savings pocket (lock funds out of play; BC.Game-style VaultPro yield is a separate optional product); transaction history. | T0/T1 |
| Casino lobby | Category nav (Favourites, Originals, Slots, Live, Game Shows, New); global search; provider filter; favorites; recently played; personalized “Picks for You”; live big-win / winners feed; jackpots; per-game info pages (RTP, house edge). | T1 |
| Game play | Launch (iframe / native), fullscreen, in-game balance + currency switch, demo / play-for-fun, per-game bet history, provably-fair seed panel (client seed, server-seed hash, nonce, cursor, rotate, verify) + standalone verifier. | T1 |
| Sports | Markets (pre-match + live), bet slip (single / multi / same-game), cash-out, odds-format switch, bet-protection (e.g. “Stake Shield”). | T2 |
| Bonus center | Active bonuses + wagering progress; promo/“bonus drop” code redemption; welcome/deposit match; reload; cashback/lossback; free spins; daily/weekly races + leaderboard; raffles; quests/challenges; flash-drops in chat. | T2 |
| VIP / loyalty | Tier & XP progress (Stake-style long tier ladder; Shuffle publishes 50+ levels); instant rakeback claim; level-up / daily / weekly / monthly bonuses; reload/recharge; BC.Game-style SVIP / VIP host contact. | T2 |
| Profile & security | Settings hub (Preferences / Security / Offers / Verification / Sessions); 2FA setup + recovery; withdrawal-address whitelist; email/withdrawal/login locks; public profile + hideable stats; account closure / self-exclusion entry. | T1 |
| Responsible gambling | Set deposit / loss / wager / session limits; cool-off (“break in play”); self-exclude; reality-check / session timer; self-assessment + help links — surfaced from every play screen. | T1 |
| Social | Live chat (often gated by account age / wager volume), rain/rainbot drops, tips/send where allowed (2FA-guarded), leaderboards/races, public stats, winners feed. | T2 |
| Support | Help center, 24/7 live chat, ticketing, FAQ/forum, dedicated email channels (support / recovery / account-closure). | T1 |
| Notifications & settings | In-app notification center, Do-Not-Disturb, email/SMS/push prefs; language (15+), currency-display + local-currency toggle, theme, accessibility/haptics, odds format, hide-balance; native app / APK. | T2 |
The hardest correctness problem in the system. You are running a multi-asset bank with adversarial users; a single double-spend or lost-update is a direct, unrecoverable loss.
Never store balance as a single mutable integer you UPDATE. Store append-only ledger transactions made of balancing ledger lines; balance is a derived (and cached) sum.
ledger_transactions id (monotonic) type (deposit, withdrawal_hold, withdrawal_settle, bet, payout, bonus, rollback, adjustment) ref_type / ref_id (chain tx / provider txn / game round / admin action) idempotency_key UNIQUE status (posted, reversed, voided) created_at ledger_lines id transaction_id account_id (player, house, provider_payable, bonus_liability, jackpot_pool, fee, onchain_inventory...) asset (BTC, ETH, USDT...) balance_bucket (withdrawable, bonus_locked, withdrawal_hold, vault, promo, provider_settlement...) amount (signed integer minor units — NEVER float) created_at
Invariant: for each ledger_transaction, the sum of all ledger_lines.amount per asset equals zero. A bet moves value from player withdrawable balance to house/game clearing; a payout moves value back; a withdrawal moves player funds into a hold, then settles the hold against on-chain inventory. Money is conserved by construction because every credit has an equal debit.
bet, win, and rollback callbacks, each atomic and linked by round/transaction ids.correction_debit after resettlement: model it explicitly as a negative receivable / recovery balance, not as an invisible overdraft.SELECT … FOR UPDATE) or routing all of one account’s writes to a single actor/partition. High-frequency autobet makes this a throughput problem: a heavy player fires hundreds of bets/sec, so the hot path (check → debit → settle → credit) must be low-latency. The durable ledger/event log is committed before acknowledging the money event; caches are read-through/write-through mirrors or actor-local state, never an async write-behind source of truth.
There is exactly one player balance (the custodial ledger, §5). Every content source — in-house games and every third-party provider — debits and credits that same balance in real time; providers never hold player funds. This is the “seamless wallet” model, as opposed to the legacy “transfer wallet” where players manually move funds into a per-provider sub-wallet.
externalTxId-style permanent dedup key).Whether you run your own nodes + HSM or use a custody provider, the object model is the same and worth naming explicitly:
A single hot wallet is a throughput and stuck-transaction bottleneck. The at-scale pattern:
CONFIRMING.gasThreshold / gasCap / maxGasPrice) so token sweeps and payouts don’t fail for lack of gas.Withdrawal safety is a policy-engine problem, not an if amount > X check. A transaction-authorization policy evaluates rules top-down, first match wins, default-deny:
PENDING_AML_SCREENING stage where a chain-analysis provider verdict gates progression (§13.3, §15).Deposits and withdrawals move through an explicit status machine you consume via webhooks. A representative lifecycle:
SUBMITTED → PENDING_AML_SCREENING → PENDING_ENRICHMENT → PENDING_AUTHORIZATION
→ QUEUED → PENDING_SIGNATURE → BROADCASTING → CONFIRMING → COMPLETED
terminal-negative: BLOCKED (policy) · REJECTED · FAILED · CANCELLED
COMPLETED_BUT_3RD_PARTY_FAILED / _REJECTED — the on-chain send succeeded and funds left the vault even though a downstream step failed. These must be reconciled explicitly or you silently lose money on the books.sum(on-chain holdings) ≥ sum(user liabilities). Any drift is a P0. This is the single most important operational safeguard, and it ties wallet + ledger together (§18 flow vi).Math.random() — a few hundred lines of shared plumbing. The real undertaking is building original games; fairness lives inside each one. Game-session rules that apply to all games (recovery, display, autoplay, RTP) are in §8.
Everything “provably fair” reduces to one deterministic function: RNG(serverSeed, clientSeed, nonce, cursor) → stream of floats in [0,1).
SHA256(serverSeed) before any bet (the commitment).// byte stream: chain HMACs by round index
function* byteStream(serverSeed, clientSeed, nonce) {
let round = 0;
while (true) {
const d = hmacSha256(serverSeed, `${clientSeed}:${nonce}:${round}`); // 32 bytes
for (const b of d) yield b;
round++;
}
}
// 4 bytes -> uniform float, base-256 positional
function bytesToFloat(b) {
let f = 0;
for (let i = 0; i < 4; i++) f += b[i] / Math.pow(256, i + 1);
return f; // [0,1)
}
Selection over a finite set uses a Fisher–Yates shuffle driven by the stream; any non-power-of-two integer draw uses rejection sampling, never modulo (modulo bias is an exploitable fairness defect). On seed rotation the old serverSeed is revealed; a public verifier re-hashes it (must equal the commitment) and replays every outcome with the same code.
SHA256(serverSeed) before the first bet; never mutate the seed in use.(serverSeed, clientSeed, nonce, cursor) only. No wall-clock, no post-bet input.Note: provable fairness is the crypto-casino alternative/supplement to traditional certified-RNG. The public standards still expect server-side-only outcome generation, RNG strength against state-compromise/known-input attacks, and statistical testing (§8.1) — provable fairness gives the player self-verification on top.
This — not fairness — is the engine worth factoring out. Every game runs the same lifecycle:
1. validate bet (limits, balance, RG limits, session) 2. atomically DEBIT stake (idempotency_key = bet_id) 3. nonce = next(seedPair) (atomic increment) 4. outcome = game.resolve(rng(...), betParams) 5. payout = game.payout(outcome, betParams) // house edge baked in 6. atomically CREDIT payout (if > 0) (same bet_id txn) 7. record bet (seeds-hash, nonce, params, outcome, payout) // replay/dispute
Shared concerns that live here: limits & max exposure (cap max payout per round so one hit can’t blow the bankroll), autobet (the main ledger-load multiplier), deterministic replay, and the real-time fabric for shared-round games.
The genuinely hard part — and nothing to do with crypto. For each game you design the payout function so that:
RTP = Σ P(outcome)·payout(outcome) must equal (1 − edge) across every legal bet config (every dice target, every Plinko risk level, every mine count).For any single-outcome game the fair multiplier is just (1 − edge) / P(win). The work is in multi-outcome games where you shape a whole distribution.
| Game | Outcome & bytes | Payout / house-edge | State / real-time |
|---|---|---|---|
| Dice | 1 float → roll ∈ [0,100) |
mult = (100/winChance%)·(1−e); edge uniform across targets |
Stateless. Throughput-bound (autobet). |
| Limbo | 1 float, inverse-CDF heavy tail | P(result ≥ m) = (1−e)/m; payout = target |
Stateless. Distribution carries the edge. |
| Crash | h from HMAC, reduced mod M=2⁵²; instant-bust carries edge |
floor((100·M−h)/(M−h))/100; P(≥m) ≈ (1−e)/m |
Shared round. Server-authoritative curve + cashout race + WS fan-out. The only truly hard real-time game. |
| Plinko | n floats (L/R per row) → bucket, k ~ Binomial(n,½) |
Designed paytable per risk; Σ C(n,k)/2ⁿ · payoutₖ = (1−e) |
Stateless. Rare edge bucket must be inside max-payout cap. |
| Mines | Fisher–Yates board (25 tiles, M mines), committed at start | payout(k) = [C(25,k)/C(25−M,k)]·(1−e) |
Stateful round. Committed-board invariant is the whole game. |
| Keno | Partial Fisher–Yates draw; hits = overlap | Hypergeometric paytable; balanced per pick-count | Stateless. |
| Wheel | 1 float → segment via cumulative weights | edge = 1 − Σ segProb·segPayout |
Stateless. Simplest multi-outcome. |
| Card games (Hilo, Blackjack…) |
Full 52-card Fisher–Yates shoe, committed at deal | Rules-driven edge (dealer rules, 3:2, etc.) | Stateful + decision tree. Most code-heavy; fairness = committed shoe. |
A layer the original document skipped: the rules every game round must obey regardless of who built it. These come straight out of the public iGaming technical standards (GLI-19 / Delaware) and they constrain in-house games and shape how you consume aggregated content. They are the difference between “the math is right” and “the round survives a disconnect, a crash, and a dispute.”
During play the client must surface, at minimum: current funds available to wager; current wager amount + active wagers; and for the last completed game — the outcome and amount won. The credit meter is shown whenever a wager can be placed; restricted/bonus credits are wagered before unrestricted funds (§5 callout).
Every round must be reconstructable and re-presentable as a labeled replay: date/time, stake (incl. bonus), outcome, funds before/after, player choices, intermediate phases, and any jackpot award. Bonus/feature rounds retain at least the last ~50 events. This is the dispute-resolution substrate and feeds the per-game log (§17.2).
This applies to stateful originals (Mines mid-board, Blackjack mid-hand, a Crash position) and to aggregated games — where you handle it via the provider’s rollback and round-status semantics (§9). Either way it must be idempotent against the ledger.
You will not build slots or live dealer — you integrate them. This is the default game catalog and the reason originals are optional.
The novel engineering is not the games — it’s implementing the money callback contract correctly and idempotently. The original doc summarized this as “/bet, /win, /rollback, HMAC.” The real contract is more demanding. Hub88, St8, 568win and similar integrations differ in endpoint names, signature schemes, amount scaling, status codes, token rules and rollback behavior; your platform should implement a provider adapter per integration and normalize those callbacks into one internal wallet protocol.
The provider/aggregator is the client; you expose signed callbacks it calls on every money event:
| Endpoint | Purpose | Notes |
|---|---|---|
balance | Balance inquiry | Read-only; must be fast. |
bet / debit | Debit stake, open/continue a round | Insufficient funds → dedicated decline status, balance unchanged. |
win / credit | Credit winnings, may close the round | Amount may be 0. References the bet via parent-transaction id. |
rollback / cancel | Reverse a referenced transaction (voided round) | New txn id for the rollback + reference to the original. |
Specialized credits a full build must also accept: free_credit (free spins — may arrive with no preceding debit), jackpot_credit, promo_credit, bonus_buy_debit/credit, correction_debit/credit (sports/odds resettlement), and out-of-session buyin/payout (tournament/jackpot entry & prize). | ||
transaction_uuid / transaction_id / transferCode): an action with the same key must never be processed twice. This is the exactly-once guarantee on the ledger.request_uuid): dedupes the HTTP call — a duplicate must return the identical stored response (same balance/status), not reprocess.credit or cancel may reference a token a week or more old, and a rollback may arrive for a transaction you never recorded as succeeding → handle rollback-of-unknown as an idempotent no-op.356000); other providers send decimal strings or their own minor-unit scale. Agree and pin the scaling per integration.correction_debit even when the player cannot cover it. Do not let this make normal spendable balance semantics fuzzy; post it to an explicit receivable/recovery bucket or a controlled negative sub-balance and still reconcile it as provider-driven correction (§5).round id; the final transaction carries round_closed: true (there is usually no separate “round end” endpoint). Multi-bet and cumulative-bet rounds are supported.RS_OK, RS_ERROR_NOT_ENOUGH_MONEY, RS_ERROR_INVALID_TOKEN, RS_ERROR_DUPLICATE_TRANSACTION, RS_ERROR_LIMIT_REACHED…). Return the right one — provider behavior branches on it.Providers expose a transactions/round list pull (by time range / round / user) for reconciliation — store every callback yourself and reconcile against it. That feeds the B2B layer:
Distinct from the player wallet, and easy to forget. Per bet, no funds move to the provider — their game server calls your seamless wallet to debit/credit the player’s balance. The money you owe providers is settled separately, B2B:
So the “seamless wallet that pays different providers” is two mechanisms: real-time player-balance callbacks (per bet) + periodic GGR rev-share settlement (B2B). Conflating them is a common modelling error.
Almost always a turnkey provider (BetBy, Digitain, Altenar) integrated like the aggregator: their odds engine + trading + settlement, your wallet + identity. In-house (rare, very expensive) means real-time odds feeds, a risk engine, bet-slip + cash-out logic, automated settlement, and a trading team — a whole company on its own. Note the sportsbook reuses the seamless-wallet contract (§9), including correction_debit/credit for odds resettlement and bet-builder/cash-out as multi-leg round semantics.
Retention machinery — the main reason crypto players stay. It is tightly coupled to the ledger (locked balances), the anti-fraud engine (abuse), and the back-office (campaign builder). The surface is broad; vendor platforms ship all of it.
The subsystem the original document scattered into a single 2FA bullet. It is its own product: registration, the account state machine, authentication, KYC, responsible-gambling enforcement, and geolocation. Most of it is mandatory to operate real money, and the public standards specify it in detail — presented here as engineering requirements (what the platform must do), not as a licensing position.
registered → active (after verification + acceptances) → {suspended, self-excluded, dormant, closed}. Dormant re-access requires additional identity verification; closure refunds the cleared balance (unless under a temporary exclusion); fraudulent accounts are suspended.The largest piece of the platform players never see — commonly 15+ modules, and frequently as much code as the player-facing app. A minimal operations console is mandatory to run real money; the full CRM/bonus/affiliate/analytics suite is where a lot of the actual engineering goes and grows mandatory at scale. The module list below is triangulated across SOFTSWISS, EveryMatrix, and SoftGamings.
| Module | What it does | Tier |
|---|---|---|
| Player management / single customer view | Search, profile, KYC state, balance adjustments, lock/ban/self-exclude, notes, device/login history, RG limits, tags & segments, duplicate/linked-account detection. | T1 |
| Player activity | Bet/round history, sessions, IP/device, full game logs + game-round replay for dispute resolution. | T1 |
| Player financials (“player calculation”) | Per-player deposits, withdrawals, GGR/NGR, bonus cost, lifetime value, P&L. | T2 |
| Transactions + withdrawal review | Deposit/withdrawal queues with manual approve/reject, risk-scored sign-off, adjustments, AML flags. The money-out control (§6.3, §18-ii). | T1 |
| Bonus management | Campaign builder: deposit match, free spins, cashback, reload, no-deposit, rakeback, lootbox; wagering requirements, eligibility, schedules, budgets; event-triggered bonus API; bonus-abuse guard. | T2 |
| Commissions / affiliate / agent | Programs (rev-share, CPA, CPL, hybrid, tiered), affiliate hierarchies / sub-affiliate NGR-share, tracking links + postbacks, statements, fiat + crypto payouts. | T2 |
| VIP / loyalty & gamification | Tiers, XP, rakeback config, loyalty shop, missions, tournaments/leaderboards, manual VIP assignment, host tooling. | T2 |
| Payments config | Methods, chains, currencies, deposit/withdrawal limits + fees, PSP/cashier orchestration, per-currency bet limits. | T1 |
| Game management | Enable/disable games & providers, categories, featured slots, per-jurisdiction game gating, RTP config for in-house games, recommendation-engine tuning. | T1 |
| Reports & analytics (graphs) | GGR/NGR trends, deposits/withdrawals, DAU/MAU, retention cohorts, game & provider performance, conversion funnels; configurable reports (60+ dimensions), real-time transaction monitoring. | T2 |
| Risk & fraud | Flagged accounts, multi-account graphs, review queue, transaction monitoring, AML alerts. | basic T1 |
| CRM / marketing | Segments, campaigns (email/SMS/push), promotions, mailing, A/B. | T2 |
| Content / CMS | Banners, pages, lobby/CMS management, localization, promo display. | T2 |
| Support | Tickets, player notes, live-chat integration. | T2 |
| Provider settlement | Per-provider GGR, rev-share, invoices vs internal records (§9.5). | T1 |
| Staff / RBAC | Admin roles & permissions + immutable audit log of every admin action (§17). | T1 |
| Responsible gambling | Limits, self-exclusion register, reality-check config, multi-jurisdiction RG engine. | T1 |
| Tournaments / races / leaderboards | Create and manage prize events. | T2 |
Even treated purely as engineering, these shape the schema and the money path, so they’re designed in, not appended. Most of the mechanics live in the sections cross-referenced below — this is the index:
Absent from the original document, and the part of the public standards that reads most like a system spec. You cannot resolve a dispute, reconcile a discrepancy, pass an audit, or prove fairness without a queryable, tamper-evident record of what happened. Treat this as a first-class subsystem, not logging-as-an-afterthought.
A single system clock is the time source for all time-stamping (transactions, game rounds, significant events) and the reporting reference; all components are time-synchronized, and a change to the master time is itself a logged event. Stamp everything UTC.
Append-only; alterations to accounting/reporting/event data only via supervised controls and themselves logged with before-value, after-value, element, time, and user. Keep the audit store separated from the operational DB (WORM / hash-chaining is the common implementation). No mechanism may auto-clear data on error.
Generate reports on demand, daily, and over MTD/YTD/LTD intervals; each report carries operator id, title, interval, generation time, a “no activity” indicator, and is exportable (CSV/XLS). The standards-named set: Game Performance (theoretical vs actual RTP, wagers/wins/voids, rake, funds held in interrupted games), Operator Liability (total held for players), Large Jackpot Payout, and Significant Events & Alterations (with before/after values). Build these off the warehouse (§14.2), not the live ledger.
The seven end-to-end sequences that tie the sections together. Each names where idempotency, authorization, and logging live — the recurring failure points.
player requests deposit address → wallet derives per-user address (HD) / tag-memo [§6] on-chain tx arrives → indexer matches tx → user → asset → wait for confirmation threshold (reorg safety) [§6 deposit] → on "cleared": atomic CREDIT ledger (idempotency_key = tx hash) [§5] → notify player; tx visible in history [§4, §17.2] → sweep address → omnibus (gas-station fuels fee) [§6.1]
player requests withdrawal (address, network, amount, 2FA) [§4, §13.2]
→ RG / limit / self-exclusion check [§13.4]
→ debit ledger to a pending/hold entry (idempotent) [§5]
→ authorization policy: AML screen → amount rule →
auto-approve | route to N-of-M manual review [§6.3, §14]
→ sign (hot co-signer) → broadcast → confirm [§6.2, §6.4]
→ on COMPLETED: settle hold; on FAILED/REJECTED: refund
→ watch COMPLETED_BUT_3RD_PARTY_FAILED (funds left!) [§6.4]
→ log significant event if large / adjusted [§17.2]
provider → POST /bet (signed, transaction_uuid, round) [§9.1–9.3]
→ verify signature over whole body + IP allowlist
→ dedupe: transaction_uuid (money) + request_uuid (HTTP)
→ balance check; insufficient → decline status (NO rollback)
→ atomic DEBIT; respond {status, balance} fast (≈ low-tens ms) [§9.4]
provider → POST /win (may be 0; round_closed=true)
→ dedupe → atomic CREDIT → respond balance
on void/timeout → provider POST /rollback (ref = original)
→ reverse referenced txn; rollback-of-unknown = no-op [§9.2]
all callbacks recorded for reconciliation [§9.5]
grant bonus → credit LOCKED/bonus sub-balance [§5, §12.2] → set wagering requirement + eligibility + expiry play: restricted credits wagered first; track turnover [§8.3] → on requirement met: convert bonus → withdrawable → on expiry / breach / cancel: void remaining bonus abuse checks run throughout (multi-acct, collusion) [§12.4, §15]
staff initiates balance adjust / correction in admin [§14] → RBAC permission check → maker-checker: second admin approves (money-moving) → atomic ledger entry (type=adjustment, ref, reason) [§5] → SIGNIFICANT EVENT logged: before/after, element, user [§17.2–17.3] → player notified if required
daily: pull provider transactions/round list [§9.5] → match against your recorded callbacks (per provider) → compute GGR/NGR per provider → reconcile vs provider invoice (monthly rev-share) → flag discrepancies → back-office queue [§14] parallel: prove sum(on-chain) ≥ sum(liabilities) daily — drift = P0 [§6.5]
player disputes a round / balance via support [§4, §14] → pull game-round log + replay (seeds, nonce, outcome) [§8.4, §17.2] → provably-fair: re-hash server seed = commitment? replay outcome [§7] → pull financial-transaction + access log (with IP) [§17.2] → reconstruct balance at timestamp from append-only ledger [§5] → resolve; record correspondence (retain ~5y) [§17.5]
| Layer | Common choices |
|---|---|
| Frontend | React / Next.js, TypeScript, WebSocket client; React Native / native for mobile |
| API / services | Node.js (TS) or Go; gRPC internal; REST/WS external |
| Realtime | WebSocket gateways + Redis Streams / NATS / Kafka |
| Money / ledger DB | PostgreSQL (serializable / row locks), strict integer money; sometimes event-sourced |
| Cache / hot balance | Redis |
| Game engines | Go / Node, deterministic, stateless where possible |
| Wallet / chain | Own nodes + indexer (Bitcoin Core, Geth/Erigon, TRON, Solana) or node providers; MPC/HSM custody (Fireblocks-class) |
| Aggregator / sportsbook | Third-party (SoftSwiss/Slotegrator/Hub88; BetBy/Digitain) |
| Identity / KYC | Sumsub/Jumio; geolocation provider; chain-analysis (Chainalysis/Elliptic) |
| Analytics / warehouse | ETL → OLAP store / read replica (BigQuery/ClickHouse/Snowflake-class); BI dashboards |
| Notifications | Email/SMS/push provider; in-app notification service |
| Edge / security | Cloudflare (DDoS, WAF, bot, geo) |
| Infra | Kubernetes, multi-region, IaC; Prometheus/Grafana + tracing; append-only audit logs / WORM store |
| Path | Tier 0 | Tier 1 | Tier 2 |
|---|---|---|---|
| Turnkey / white-label | vendor-owned | vendor-owned | mostly vendor; little control |
| Hybrid (“be the next Stake”) | build | integrate (aggregator, KYC, chain-analysis) | build originals + real-time, integrate sportsbook |
| Fully custom | build | build | build everything incl. sportsbook trading |
Stake / Shuffle / BC.Game sit toward the custom/hybrid end: they own a substantial player product, wallet/ledger surface, rewards system and original-game surface, while still relying on integrated third-party content for much of the catalog. The highest-leverage parts to build yourself are the multi-asset double-entry ledger, the crypto wallet/custody service, the provably-fair originals, the player app, and the Crash-class real-time engine. Everything else is integration — but note that “integration” still means building the operator side of the seamless-wallet contract (§9), the account/identity/RG subsystem (§13), the logging/reporting layer (§17), and the player client (§4) correctly. Those are not vendor gifts in the hybrid path.
The order is deliberate: money correctness → custody → client + content → ops → identity/RG → fairness → real-time → retention → reporting → scale. Every later stage assumes the ledger underneath it is provably correct and every event is logged.
What each cluster of claims was checked against. Standards are used as an engineering completeness checklist; numeric thresholds are representative defaults, frequently overridable by a specific jurisdiction or provider.
| Source | What it backs here |
|---|---|
| GLI-19 v3.0 — Interactive Gaming Systems (read in full) | §8 game-session integrity (recovery, recall, RTP floor, autoplay, demo separation), §13 accounts/auth/RG/geolocation, §17 logging/significant-events/reporting/retention/system-integrity. |
| Delaware iGaming technical spec / RFP FIN13001 (adopts GLI-19) | Corroborates §8/§13/§17; self-imposed-limit categories (deposit/wager/loss/session), 24h loosening delay, last-login display, geolocation re-checks. |
| Hub88 / St8 / 568win seamless-wallet API docs | §9 callback contract, two-level idempotency, signature schemes, amount-scaling divergence, status codes + rollback-trigger rule, late-callback handling, the latency warning, §10 sportsbook resettlement. |
| Fireblocks developer + “withdrawals at scale” docs | §6 vault/omnibus model, hot/cold = MPC-share location, withdrawal pools + per-TPS sizing, stuck-tx (RBF/CPFP/25-chain), gas station, transaction-authorization policy, webhook lifecycle + COMPLETED_BUT_3RD_PARTY_FAILED hazard. |
| SOFTSWISS · EveryMatrix · SoftGamings platform pages | §14 back-office module inventory; §12 bonus taxonomy, gamification (loyalty shop/missions), bonus-abuse guard, unified bonus, jackpots, affiliate CPL/sub-affiliate, 60+ dimension reports, game-round replay, per-jurisdiction gating. |
| Stake · BC.Game · Shuffle help centers | §4 player-facing surface map (Stake Vault as separated storage; BC.Game VaultPro as yield/savings; Shuffle wallet/verification/VIP/provably-fair docs), §12 reward types and rollover restrictions, §13 tiered KYC + 2FA/security recovery. |
One-line summary. The mandatory core is ledger + wallet + accounts/identity + a player client + some content + edge security + geo-block + a logged, reconcilable record. Everything that makes it look like Stake — original games, the real-time engine they require, bonuses/gamification, sportsbook, social — is Tier-2 optional. The single highest-leverage product decision is whether to build originals, because that choice pulls the hard real-time stack and strengthens the case for owning Tier 0. The most under-estimated surfaces are the ones the first draft of this document omitted: the player client, the full seamless-wallet money contract, the account/identity/RG subsystem, and the logging/reporting/retention layer.
Draft, exploratory — architecture, product surfaces, integration contracts & operational flows. Game design, business/licensing strategy, and cost/team sizing are out of scope. Standards cited as engineering checklists, not legal advice.