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) }}
{{ 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 }}
{{ $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
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