
Provably Fair is a system allowing players to verify that the site operates legitimately and doesn't tamper with game results. It leverages cryptography and third party input to generate random values. At the end of the game, players can verify that the outcome was indeed determined by the original seed and inputs, thus proving that the game was fair.
In that way, both sides control random outcome (User and Server).
In "Boxes" we use 3 parts for generating a ticket number: server seed, client seed, nonce.
For determining drop outcome we build a "Ticket system", where each item in the box is assigned to unique ticket range.
The server seed is the first of the seed for each outcome. Initially, our system creates a random 64-character Server Seed. Before any box is opened, we share a hashed version of this seed with a user. Only hashed server seed is revealed to prevent any players from predicting future outcomes.
After each opening, a server seed is rotated with new generated one. Before opening, a user can check the hashed server seed and compare it with the actual server seed after a game.
Hashed_Server_Seed == SHA256(Server_Seed)
The client seed is the second part of the seed for each outcome. The user has complete control over a client seed. A ticket outcome depends on the client seed, and changing leads to different items will be dropped.
When a user creates an account, the platform initiates a client seed with a random 64-character string.
A nonce is a number used as a third part of the seed for each outcome. For each box opening session, nonce is "1". If the user opens multiple boxes in one game, a nonce is incremented by 1 for each spin.
You can check our algorithm with our tool at the end of the page or run the JavaScript code manually. An item's ticket number can be found on the box page.
const serverSeed = "0bcfbdd1bdb8b5a3cc36f29dedc03fdf705a18b3610e46f094fe3337475de0ea";
const clientSeed = "5e62aa1e3792036cf6bcc5f59f1c9f6a18d0438410077db13b531b4604dfad6c";
const nonce = 1;
random(serverSeed, clientSeed, nonce).then((x) => console.log("Open result", x));
async function sha512(str) {
return crypto.subtle.digest("SHA-512", new TextEncoder("utf-8").encode(str)).then((buf) => {
return Array.prototype.map
.call(new Uint8Array(buf), (x) => ("00" + x.toString(16)).slice(-2))
.join("");
});
}
async function random(...parts) {
const combinedHash = await sha512(parts.join(":"));
const hashInt = BigInt("0x" + combinedHash);
const maxInt = BigInt(100000000);
return Number((hashInt % maxInt) + BigInt(1));
}