MM2Bet
MM2Bet

Provably Fair

How we guarantee every game outcome is fair and verifiable

Verify a Game

What is Provably Fair?

Provably fair is a cryptographic system that allows you to independently verify that every game outcome on MM2.Bet was determined fairly and was not manipulated by us or anyone else. The outcome of each game is determined before you play, committed to via a hash, and can be verified after the game ends.

How It Works

Every game uses three components to generate its outcome:

Server seed — A random string generated by our server before each game. You are shown its SHA-256 hash before the game begins, but the actual seed is kept secret until the game ends. This prevents us from changing it after the fact.

Client seed — A seed that you can set yourself, or one is generated for you. This ensures the server cannot predetermine the outcome alone.

Nonce — A counter that increments with each game, ensuring a unique outcome even when the same seeds are used.

The Process

  1. Pre-commitment — Before you bet, the server shows you SHA-256(server_seed). This locks the outcome.
  2. Game play — The outcome is calculated using HMAC-SHA256(server_seed, client_seed:nonce).
  3. Reveal — After the game, the server seed is revealed. Verify its hash matches the pre-commitment.
  4. Verification — Recalculate the outcome yourself with the revealed seeds to confirm the result.

Game Algorithms

Coinflip

hash = HMAC-SHA256(server_seed, client_seed + ":coinflip:" + uid)
roll = parseInt(hash[0:8], 16) % 1,000,000
roll < 500,000 → Heads | roll ≥ 500,000 → Tails

Mines

For each mine i:
  hash = HMAC-SHA256(server_seed, client_seed + ":mine:" + i + ":" + attempt + ":mines:" + uid)
  cell = parseInt(hash[0:8], 16) % 25
Skip collisions, repeat until all mines placed

Limbo

hash = HMAC-SHA256(server_seed, client_seed + ":limbo:" + uid)
value = parseInt(hash[0:13], 16)  // 52 bits
multiplier = floor(2^52 / (value + 1) × (1 - house_edge%) × 100) / 100

Dice

hash = HMAC-SHA256(server_seed, client_seed + ":dice:" + uid)
roll = parseInt(hash[0:8], 16) % 10000 / 100  // 0.00 to 99.99
Win if roll is over/under target (player's choice)

Blackjack

For position i in deck (0 to 51):
  hash = HMAC-SHA256(server_seed, client_seed + ":" + i)
  j = parseInt(hash[0:8], 16) % (i + 1)
  swap deck[i] with deck[j]
Deterministic Fisher-Yates shuffle, cards dealt in order

Upgrader

hash = HMAC-SHA256(server_seed, client_seed)
roll = parseInt(hash[0:8], 16) / 0xFFFFFFFF  // 0.0 to 1.0
Win if roll < calculated win chance

Why This Matters

  • We cannot change game outcomes after you bet
  • We cannot predict your client seed contribution
  • Every game result is independently verifiable by anyone
  • The house edge is exactly as stated — nothing more

If the hash of the revealed server seed ever fails to match the pre-committed hash, the game was tampered with. This has never happened and never will.