PVPspinArena

Fairness protocol v1

Every jackpot winner is decided on the server with cryptographic randomness before the wheel spins. The wheel only replays a result that is already recorded. Before a round takes entries we publish a hash of a secret seed; once the round ends we reveal the seed so anyone can recompute the winner.

Before entries open:
  server_seed      = 32 random bytes (CSPRNG, Postgres pgcrypto)
  server_seed_hash = SHA256(server_seed)            -> published on the game

Fixed message (known before any entry):
  message(c) = "PVPCasino:jackpot:v1:" + game_id + ":" + draw_version + ":" + c

After entries close (N = final pot in cents = ticket count):
  limit = floor(2^64 / N) * N
  for c = 0, 1, 2, ...:
    h = HMAC-SHA256(key = server_seed, data = message(c))
    r = first 8 bytes of h, big-endian unsigned 64-bit
    if r < limit: winning_ticket = r mod N; stop       (rejection sampling: no modulo bias)
  winner = entry with ticket_start <= winning_ticket < ticket_end

After settlement: server_seed is revealed on the game record.

What this does and doesn't prove

Verify a draw

Or open any completed game and press “Verify”.

Coinflip protocol v1

Uses the same seed-commitment engine as Jackpot, with its own message prefix so results from one game can never be reused for another.

When the game is created (before any opponent exists):
  server_seed      = 32 random bytes (CSPRNG, Postgres pgcrypto)
  server_seed_hash = SHA256(server_seed)            -> published on the game

Fixed message (no free parameter):
  message = "PVPCasino:coinflip:v1:" + game_id + ":" + draw_version

  h    = HMAC-SHA256(key = server_seed, data = UTF-8(message))
  side = (h[0] & 1) == 0 ? HEADS : TAILS             (exactly 50/50: one bit)

The result is fixed when the opponent joins, hidden until the flip starts,
and the seed is revealed once the game is settled.

Verify a coinflip

Runs entirely in your browser; nothing is sent to our servers.

Published test vectors (32)
game_idserver_seedfirst byteside
10000000000000000000000000000000000000000000000000000000000000000101TAILS
1000000000000000000000000000000000000000000000000000000000000000000182HEADS
10000000000000000000000000000000000000000000000000000000000000000101TAILS
1000000000000000000000000000000000000000000000000000000000000000000182HEADS
12345ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff242HEADS
7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77TAILS
12345ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff242HEADS
7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77TAILS
42000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f68HEADS
2147483648000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f25TAILS
42000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f68HEADS
2147483648000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f25TAILS
1deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef90HEADS
100deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef231TAILS
1deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef90HEADS
100deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef231TAILS
123459f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a0849TAILS
79f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08100HEADS
123459f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a0849TAILS
79f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08100HEADS
420123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef218HEADS
21474836480123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef203TAILS
420123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef218HEADS
21474836480123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef203TAILS
1a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a50HEADS
100a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5197TAILS
1a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a50HEADS
100a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5197TAILS
123455a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a185TAILS
75a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a152HEADS
123455a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a185TAILS
75a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a152HEADS