Game Rules: Crash Minimal¶
Single source of truth for how Crash Minimal plays. Player-facing terms, operator-facing SLA, and cert-lab (GLI-11) submission all cite this document.
Paired documents:
- par-sheet.md, math model, RTP, volatility.
- rng-spec.md, cryptographic outcome derivation.
- error-codes.md, platform-wide status codes.
Any change to this document is a regated change, see change-management.md.
Submission status: pre-cert. This plugin has not been submitted to any cert lab. The rules below are derivable from
games/crash-minimal/src/as of the most recent commit; the RTP regression, test vectors, and independent math review remain open before GLI-11 submission.
1. Game overview¶
Crash Minimal is a provably-fair single-multiplier crash game. Each round
rolls a multiplier ≥ 1.00× with a long right tail. The player commits to a
cashout multiplier before the round starts; if the rolled
crashMultiplier reaches or exceeds the player's cashoutMultiplier, the
player wins stake × cashoutMultiplier (minus operator commission);
otherwise the stake is lost.
This plugin ships as the second reference implementation of the
GamePlugin contract (see B2B_ROADMAP.md §4), its purpose is to validate the plugin seam against a continuous-outcome
game, as distinct from Ketapola Dice's discrete LOW/HIGH shape.
2. Round lifecycle¶
Same plugin-driven state machine as every other game: PENDING →
BETTING_OPEN → ROLLING → RESULT → SETTLED / VOIDED. Plugin-specific
observations:
- Only one selection shape:
{ cashoutMultiplier: number }with1.01 ≤ cashoutMultiplier ≤ 10_000(games/crash-minimal/src/selection.ts). - No manual cashout in this minimal variant, the commit is the cashout. A richer variant with live cashout would be a separate plugin.
3. Outcome¶
The round produces a single crashMultiplier ∈ [1.00, maxMultiplier] with
two decimal precision. Derivation is in
rng-spec.md §6; the brief form:
hmac = HMAC_SHA256(serverSeed, clientSeed + ':' + nonce)
u_raw = first 52 bits / 2^52, uniform[0, 1)
if u_raw < houseEdge:
crashMultiplier = 1.00, house-bust branch
else:
u = (u_raw - houseEdge) / (1 - houseEdge)
crashMultiplier = floor(100 / (1 - u)) / 100, two-decimal
clamp to [1.00, maxMultiplier]
4. Settlement¶
From games/crash-minimal/src/settle.ts:
- Win (
crashMultiplier ≥ cashoutMultiplier):gross = stake × cashoutMultiplier,payout = max(0, gross − commissionMicro). - Loss (
crashMultiplier < cashoutMultiplier): stake is lost, no payout.
Commission is a flat commissionMicro per bet, matching the
OperatorGameConfig shape used by every game.
5. Configuration parameters¶
Per-operator-per-currency, stored on OperatorGameConfig.configJson and
validated by the plugin at engine startup
(games/crash-minimal/src/config.ts):
| Parameter | Type | Default | Meaning |
|---|---|---|---|
houseEdge |
number ∈ [0, 1) | 0.01 | Pre-roll bust probability, sets RTP to 1 − houseEdge. |
maxMultiplier |
number ≥ 1.01 | 1000 | Hard cap on crashMultiplier to bound the client animation and wire payload. |
6. Session lifecycle¶
Identical to Ketapola Dice, see
ketapola-dice/docs/game-rules.md §8
for the platform-wide contract. One gameCode (crash-minimal) per
session; serverSeed / clientSeed / nonce drive RNG; seed rotation
mechanics unchanged.
7. Source of truth¶
| Question | Answer lives in |
|---|---|
| Rules (this doc) | games/crash-minimal/docs/game-rules.md |
| Math | par-sheet.md |
| RNG | rng-spec.md |
| Outcome code | games/crash-minimal/src/outcome.ts |
| Settlement code | games/crash-minimal/src/settle.ts |
| Platform wallet contract | docs/wallet-api.md |