Loading
Your region has been blocked
×
{{ $t('gamemodes.roulette.howDoesItWork') }}
{{ $t('gamemodes.roulette.bonusRound') }}
{{ $t('gamemodes.roulette.lastBonusRound') }}
{{ $tc('gamemodes.roulette.rollsAgo', roulette.bonusRoundRollsAgo) }}
{{ $t('gamemodes.roulette.roundId') }} #{{ roulette.roundId }}
{{ $t('gamemodes.roulette.previousRolls') }}
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 === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ website.balanceFormat(roulette.gray.myBet) }}
{{ $t('gamemodes.roulette.highestGray') }}
{{ roulette.gray.highestBet.lvl }}
{{ 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 === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ rouletteGet_TotalAmount('gray') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'gray' ? '+' : roulette.colorWon && roulette.colorWon !== 'gray' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
{{ 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 === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ website.balanceFormat(roulette.green.highestBet.amount) }}
{{ $tc('gamemodes.roulette.bets', roulette.green.bets.length) }}
{{ roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ rouletteGet_TotalAmount('green') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'green' ? '+' : roulette.colorWon && roulette.colorWon !== 'green' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
{{ 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 === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ website.balanceFormat(roulette.blue.highestBet.amount) }}
{{ $tc('gamemodes.roulette.bets', roulette.blue.bets.length) }}
{{ roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ rouletteGet_TotalAmount('blue') }}
{{ bet.lvl }}
{{ roulette.colorWon && roulette.colorWon === 'blue' ? '+' : roulette.colorWon && roulette.colorWon !== 'blue' ? '-' : '' }} {{ website.balanceFormat(bet.amount) }}
{{ card.amount > 0 ? '+' + website.balanceFormat(card.amount) : website.balanceFormat(card.amount) }}
{{ 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.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
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 crypto = require("crypto");
const ChanceJs = require('chance')
function getRandomBytes(size, encoding) {
    return crypto.randomBytes(size).toString(encoding);
}
function getHash(data, algorithm = "sha512", encoding = "hex") {
	return crypto.createHash(algorithm).update(data).digest(encoding);
}
const server_seed = getRandomBytes(24, "hex");
const public_seed = 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 = getHash(`${server_seed}-${public_seed}-${round_id}`);
const isGoldenRound = new Chance(hash).integer({ min: 1, max: 100 }) <= 2;
const result = () => {
  const number = parseInt(hash.substr(0, 8), 16);
  return Math.abs(number) % 15;
}

console.log(`Number: ${result} | Is golden round?: ${isGoldenRound}`);
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
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 crypto = require("crypto");
function getRandomBytes(size, encoding) {
    return crypto.randomBytes(size).toString(encoding);
}
const public_seed = getRandomBytes(24, "hex");
const server_seed = 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"
}