Loading
Your region has been blocked
×
{{ $t('gamemodes.roulette.bonusJackpot') }}
{{ $t('gamemodes.roulette.howDoesItWork') }}
{{ $t('gamemodes.roulette.bonusPotAmount') }}
{{ $t('gamemodes.roulette.roundId') }} #{{ roulette.roundId }}
{{ $t('gamemodes.roulette.previousRolls') }}
{{ $tc('gamemodes.roulette.usersHitBonus', roulette.gray.bets.length + roulette.green.bets.length + roulette.blue.bets.length) }}
{{ $t('gamemodes.roulette.potValuedAt', { amount: website.balanceFormat(roulette.bonusPotAmount) }) }}
1
14
2
13
3
12
4
0
11
5
10
6
9
7
8
{{ $t('pages.fairness.terms.publicSeed') }}
{{ roulette.fairness.publicSeed }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ website.balanceFormat(roulette.gray.myBet) }}
{{ $t('gamemodes.roulette.highestGray') }}
{{ roulette.gray.highestBet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ website.balanceFormat(roulette.gray.highestBet.amount) }}
{{ $tc('gamemodes.roulette.bets', roulette.gray.bets.length) }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ rouletteGet_TotalAmount('gray') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ website.balanceFormat(roulette.green.myBet) }}
{{ $t('gamemodes.roulette.highestGreen') }}
{{ roulette.green.highestBet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ website.balanceFormat(roulette.green.highestBet.amount) }}
{{ $tc('gamemodes.roulette.bets', roulette.green.bets.length) }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ rouletteGet_TotalAmount('green') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ website.balanceFormat(roulette.blue.myBet) }}
{{ $t('gamemodes.roulette.highestBlue') }}
{{ roulette.blue.highestBet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ website.balanceFormat(roulette.blue.highestBet.amount) }}
{{ $tc('gamemodes.roulette.bets', roulette.blue.bets.length) }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ rouletteGet_TotalAmount('blue') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'bonus' ? '' : roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
+{{ website.balanceFormat(card.raffle_price) }}
{{ $t('gamemodes.raffles.noPendingWinnings') }}

{{ $tc('gamemodes.raffles.activeRaffles', raffles.currentRaffles.length) }}
{{ $t('gamemodes.raffles.note') }}
{{ website.balanceFormat(raf.itemPrice) }}
{{ raf.name }}
{{ raf.wear }}
{{ (raf.winnerUser && raf.showWinner) ? $t('gamemodes.raffles.closed') : (raf.winnerUser && !raf.showWinner) ? $t('gamemodes.raffles.rolling') : $t('gamemodes.raffles.waiting') }} {{ (raf.sslots.length >= raf.slots ? raf.slots : raf.sslots.length) + '/' + raf.slots }}
{{ card.amount > 0 ? '+' + website.balanceFormat(card.amount) : website.balanceFormat(card.amount) }}
{{ $t('gamemodes.blackjack.note') }}
{{ getCardNumber(card, 'letter') }}
{{ $t('gamemodes.blackjack.blackjackPays.1') }}
{{ $t('gamemodes.blackjack.blackjackPays.2') }}
{{ $t('gamemodes.blackjack.dealerGot') }}
{{ blackjack.dealer.totalFormatted }}
{{ $t('gamemodes.blackjack.selectAction') }}
{{ $t('gamemodes.blackjack.waitingForDealer') }}...
{{ $t('pages.fairness.terms.publicSeed') }}
{{ blackjack.fairness.publicSeed }}
{{ $t('pages.fairness.terms.secretHash') }}
{{ blackjack.fairness.secretHash }}
{{ blackjack.gameResult ? $t(`others.${blackjack.gameResult.toLowerCase()}`) : '' }}
{{ blackjack.player.totalFormatted }}
{{ $t('gamemodes.blackjack.youGot') }}
{{ getCardNumber(card, 'letter') }}
{{ $t('gamemodes.blackjack.selectBetAmount') }}
{{ $t('gamemodes.blackjack.orTypeHere') }}
{{ $t('pages.fairness.terms.publicSeed') }}
{{ blackjack.fairness.publicSeed }}
{{ $t('pages.fairness.terms.secretHash') }}
{{ blackjack.fairness.secretHash }}
{{ $t('others.atStake') }}
{{ $t('pages.deposit.tabs.eth.description') }}
{{ $t('pages.deposit.qrCode.title') }}
{{ $t('pages.deposit.qrCode.description') }}
{{ $t('others.note') }}:
{{ $t('pages.deposit.tabs.ltc.description') }}
{{ $t('pages.deposit.qrCode.title') }}
{{ $t('pages.deposit.qrCode.description') }}
{{ $t('others.note') }}:
{{ $t('pages.deposit.tabs.btc.description') }}
{{ $t('pages.deposit.qrCode.title') }}
{{ $t('pages.deposit.qrCode.description') }}
{{ $t('others.note') }}:
{{ $t('pages.withdraw.withdrawWith', { method: 'ETH' }) }}
{{ $t('pages.withdraw.tabs.eth.description') }}
{{ $t('pages.withdraw.tabs.eth.steps.1') }} *
$
=
{{ $t('pages.withdraw.tabs.eth.steps.2') }}
{{ $t('others.note') }}:


{{ $t('pages.withdraw.withdrawWith', { method: 'LTC' }) }}
{{ $t('pages.withdraw.tabs.ltc.description') }}
{{ $t('pages.withdraw.tabs.ltc.steps.1') }} *
$
{{ $t('pages.withdraw.tabs.ltc.steps.2') }}
{{ $t('others.note') }}:

Provably fair
Roulette
Raffles
Blackjack
Roulette provably fair

In roulette the outcome of games have already been determined ahead of round start and can be verified using the following values.

  1. public seed – a randomly generated string of text by the server. It is made public ahead of any rolls and rotates after a while.
  2. server seed – a randomly generated string of text by the server. Its encrypted value is shown, to proof that we do not tamper with the value and will be decrypted once the public and server seed have rotated, at which point the rolls have become verifiable.
  3. nonce – a counter value that increases every round and is equal to the total number of rounds played (round identifier).

It is important to know that the server seed only becomes available to the user when it is no longer in use (i.e. rotated). Whenever the seeds rotate the user can verify the previous games to ensure they have not been tampered with.

Code Workflow

Whenever the seeds rotate, and are no longer in use, new values will be generated by the server. It runs the following code on the server-side.

const fairness = require("@bountygg/provably-fair");
const server_seed = fairness.getRandomBytes(24, "hex");
const public_seed = fairness.getRandomBytes(24, "hex");

A calculation can now be made, as all the required values are there. At round start we run a version of the sample code to determine the winning number.

const round_id = 89192;
const hash = fairness.getHash(`${server_seed}-${public_seed}-${round_id}`);
const result = () => {
  const number = parseInt(hash.substr(0, 8), 16);
  return Math.abs(number) % 15;
}
Game History
Secret * Public Seed Round IDs
{{ roulette.fairness.seedHistory[roulette.fairness.seedHistory.indexOf(data) + 1] ? roulette.fairness.seedHistory[roulette.fairness.seedHistory.indexOf(data) + 1] .max_id + 1 : "..." }} - {{ data.max_id }}
* Hashed secret Unhashed secret
Raffles provably fair

In a game like raffles it is important that neither the site nor the player knows the outcome prior to the game starting. We realize this by using an independent third party to interfere with the calculation of the winning slot. In the game there's two distinct values used to calculate the outcome. We’ll be needing the following values.

  1. server seed – a randomly generated string of text by the server. Its encrypted version is shown to the user beforehand.
  2. random salt – a randomly generated string by random.org, as this is a third party neither bounty nor the user knows the value in advance.

These values are combined and converted into a random number using the ChanceJS library.

Code Workflow

Firstly, the following code runs on the server-side whenever a new raffle game is being created. Note that this value is shown to the user prior to the round starting but will remain encrypted until the end of the round.

const fairness = require("@bountygg/provably-fair");
const server_seed = fairness.getRandomBytes(24, "hex");

Secondly, whenever the round starts a call will be made to the Random API provided by random.org. It returns a randomized string of characters that we can use as a salt.

const {
  response,
  value,
} = await fairness.getThirdPartySalt();

Lastly, using the generated values a winning slot will be decided by converting the seed into a random number using the ChanceJS library.

const Chance = require("chance");
const full_seed = `${server_seed}-${value}`;
const slot = Chance(full_seed).integer({
  min: 0,
  max: slotCount - 1 // slots start at index 0
});
Random API

Every time we make a call to the third-party, they will track the amount of calls made with them sequentially (serial number). You can verify that we have not cherry-picked the outcome because as your round was played the serial number has only increased by one call.

You can verify the signature of a random.org call to ensure it was processed by them. You can find the form by clicking here.

Enter Raffle ID
Blackjack provably fair

Within the blackjack game there's a few different values used to calculate the outcome. Using these values, we can prove that the outcome has not been tampered with. We’ll be needing the following values.

  1. public seed – a randomly generated string of text by the server. It will be generated at the creation of a round and will be shown in plain text before starting a round.
  2. server seed – a randomly generated string of text by the server. It will be generated at the creation of a round and will be encrypted using the sha512 algorithm to ensure the user doesn’t know the outcome in advance.
  3. client seed – a random value that may be changed by the user before starting the game, it is not mandatory but important that the user changes his seed. That way the user can ensure that his own input has partially decided the outcome of the game.
  4. nonce – a counter value that either indicates a card for the dealer or a card for the user.

Whenever either the user or the dealer draws a card the nonce will be increased, and a card number based on the values above, will be generated using the ChanceJS library.

Code Workflow

Firstly, the following code runs on the server-side whenever a new blackjack round has been created, at this point the round has not started yet. Note that both values are shown prior to starting a round, but the server seed remains encrypted until the round has finished

const public_seed = provablyFair.getRandomBytes(24, "hex");
const server_seed = provablyFair.getRandomBytes(24, "hex");

Secondly, to start the round, the server will need the client seed. A user may change his client seed whenever he likes, it will not change any other seed apart from the client seed. It will be send to the server at round start.

const client_seed = "a user his own input";

Lastly, the user starts the round. It will send the client seed to the server so it can calculate an outcome. We will just show the calculation of outcome for the first drawn card, but the process works the same for any following cards, it just changes the nonce.

const full_seed = `${public_seed}-${server_seed}-${client_seed}:${nonce}`;
const randomCardNumber = new Chance(full_seed).integer({
  min: 0,
  max: 51
});
Verify
Client Seed
Enter BlackJack ID
BlackJack Card Indexes
const cards = {
    0: "TwoOfDiamonds", 1: "TwoOfHearts", 2: "TwoOfSpades", 3: "TwoOfClubs", 
    4: "ThreeOfDiamonds", 5: "ThreeOfHearts", 6: "ThreeOfSpades", 7: "ThreeOfClubs", 
    8: "FourOfDiamonds", 9: "FourOfHearts", 10: "FourOfSpades", 11: "FourOfClubs", 
    12: "FiveOfDiamonds", 13: "FiveOfHearts", 14: "FiveOfSpades", 15: "FiveOfClubs", 
    16: "SixOfDiamonds", 17: "SixOfHearts", 18: "SixOfSpades", 19: "SixOfClubs", 
    20: "SevenOfDiamonds", 21: "SevenOfHearts", 22: "SevenOfSpades", 23: "SevenOfClubs", 
    24: "EightOfDiamonds", 25: "EightOfHearts", 26: "EightOfSpades", 27: "EightOfClubs", 
    28: "NineOfDiamonds", 29: "NineOfHearts", 30: "NineOfSpades", 31: "NineOfClubs", 
    32: "TenOfDiamonds", 33: "TenOfHearts", 34: "TenOfSpades", 35: "TenOfClubs", 
    36: "JackOfDiamonds", 37: "JackOfHearts", 38: "JackOfSpades", 39: "JackOfClubs", 
    40: "QueenOfDiamonds", 41: "QueenOfHearts", 42: "QueenOfSpades", 43: "QueenOfClubs", 
    44: "KingOfDiamonds", 45: "KingOfHearts", 46: "KingOfSpades", 47: "KingOfClubs", 
    48: "AceOfDiamonds", 49: "AceOfHearts", 50: "AceOfSpades", 51: "AceOfClubs"
}