What is Provably Fair?

ROCKETPOT is Provably Fair, which means you can easily verify its randomness and fairness.

The Provably Fair system is a mathematical method that is used to ensure that no one, neither players nor the operator of the site, can know the result of the game before it starts and noone can tamper with the randomness of the game.

How it works?

We have generated a chain of 8,000,000 SHA256 hashes. Each element is the hash of the lowercase, hexadecimal string representation of the previous hash.

The hash of the chain's last element is 5de24be2ba88f21070aca0b909a23ba8977a60e047e750dc6bd637aa3b4defc8

Every game maps to a hash in the chain: The 8,000,000th element of the chain is the hash of game #1 and the first element in the chain is the hash of game #8,000,000.

How to verify it?

To verify that a hash belongs to a game #n, simply hash it n times and compare the result with the terminating hash.

To calculate a game's result from its hash:

    const CryptoJS = require("crypto-js");

    function generateGameResultFromSeed(roundSeed, salt) {

      // Number of most significant bits to use
      const nBitsToUse = 52;

      // Step 1. HMAC_SHA256(message=seed, key=salt)
      const hmac = CryptoJS.HmacSHA256(roundSeed, salt);
      const roundHash = hmac.toString(CryptoJS.enc.Hex);

      // Step 2. r = 52 most significant bits
      const roundRandSource = roundHash.slice(0, nBitsToUse / 4);
      const r = parseInt(roundRandSource, 16);

      // Step 3. Calculate crash = r / 2^52, uniformly distributed in [0; 1)
      const twoPower52 = Math.pow(2, nBitsToUse);
      let crash = r / twoPower52;

      // Step 4. Calculate crash normalized in 100 - 100B range
      crash = Math.floor(97 / crash);
      crash = Math.min(crash, 100000000000);
      crash = Math.max(crash, 100);

      // Step 5. Take next 52 bits as seed for player selection in Jackpot round
      const jpPlayerRandSource = roundHash.slice(nBitsToUse / 4, 2 * nBitsToUse / 4);
      const jpPlayerRandom = parseInt(jpPlayerRandSource, 16);

      // Step 6. Take next 52 bits as seed for picking Jackpot value on the wheel
      const jpValueRandSource = roundHash.slice(2 * nBitsToUse / 4, 3 * nBitsToUse / 4);
      const jpValueRandom = parseInt(jpValueRandSource, 16);

      return {roundHash, jpPlayerRandom, jpValueRandom, crash, roundSeed};
Before being used to calculate the corresponding result, each game hash is salted with the lowercase, hexadecimal string representation of the hash of a bitcoin block.

The number of the block to use was published on the Bitcointalk forum (URL before it was mined, proving that we didn't deliberately pick a chain that is unfavorable for players.

This block is #591433 with hash 00000000000000000014ccc7303b1be1fd8c6b2cb5e961d57fbdc57f661db418

It can be verified that we posted the number of the block to use before it was mined at the following snapshots of the bitcointalk seeding event post: , and (thanks LoyceV for scraping and archiving the post!)