Every player on PackRush should have complete confidence that every result is 100% fair and tamper-proof. To guarantee this, all of our games use a provably fair system that allows anyone to verify that every outcome is random, unbiased, and not manipulated by PackRush or any other party.
This ensures the integrity of every game, guaranteeing that the outcome of every pack open and battle is entirely unpredictable and transparent.
PackRush uses SHA-512 cryptographic hashing combined with a commitment scheme for pack openings. For battles, we add an additional layer of security by incorporating future EOS blockchain block hashes, ensuring outcomes cannot be predicted or manipulated.
Server Seed (Secret)
Generated by PackRush and kept hidden until your game ends. A hashed version is shown before play to prove it can't be changed later.
Client Seed (Public)
Chosen or generated on your device, ensuring you directly contribute to each random result. You can check and change your client seed below.
Nonce
An auto-incrementing counter that makes every result unique (1st pack = nonce 1, 2nd = nonce 2, etc.).
Step (Battles)
An incrementing counter for each pack opened in a battle (1st pack = step 1, 2nd = step 2, etc.). This ensures each pack in a battle has a unique, verifiable result.
Together, these values are combined as clientSeed:serverSeed:nonce, hashed with SHA-512, and converted to a ticket number between 1 and 1,000,000. This ticket number determines which prize you receive.
For battles, we use the same ticket number generation but combine your seeds with the hash of a future EOS blockchain block. For user players, the format is clientSeed:eosBlockHash:serverSeed:nonce:step. For bot players, we use a deterministic seed constructed from all user seeds in the battle (in the format clientSeed_serverSeed for each user), prefixed with the bot identifier, combined with the EOS block hash and step. The format is BOT_1_clientSeed_serverSeed:eosBlockHash:step. This ensures that battle outcomes are not known until the block is mined and that no player (or bot) can manipulate the result.
Once your game is complete, PackRush reveals the unhashed server seed, allowing anyone to verify that the result matches the pre-commitment and was not altered.
You can change your client seed at any time.
The server seed is first provided in its hashed form. This seed, when combined with the client seed and a nonce, is used to generate random numbers. After each purchase, the unhashed server seed is revealed in your purchase history, allowing you to independently verify the fairness of the results. To ensure continued integrity, the server seed is refreshed after every purchase.
For full transparency, we also provide verification functions you can use to confirm the fairness of your outcomes. The server seed, client seed, and nonce used in all games are recorded and can be reviewed in your game history.
Server Seed
Client Seed
Nonce
Verification code example:
import crypto from 'crypto'
export const sha512 = (value: string) =>
crypto.createHash('sha512').update(value).digest('hex')
export const combineSeeds = (
clientSeed: string,
serverSeed: string,
nonce: number
) => sha512(`${clientSeed}:${serverSeed}:${nonce}`)
export const getTicketNumber = (
hash: string,
maxNumber = 1_000_000
) => {
const hashInt = BigInt('0x' + hash)
const maxInt = BigInt(maxNumber)
return Number((hashInt % maxInt) + BigInt(1))
}Battles use EOS blockchain block hashes for provably fair randomness. When a battle is created, a future EOS block number is selected. Once that block is mined, its hash is combined with player seeds to determine outcomes.
Each pack in a battle uses an incrementing step number (1, 2, 3, etc.) to ensure every pack opening has a unique, verifiable result. Use the player type dropdown to verify what the bots received in your battle - their outcomes are deterministic and can be independently verified.
Player Type
Client Seed
Server Seed
Nonce
EOS Block Hash
Step (Pack Number)
Battle verification code example:
import crypto from "crypto"
export const sha512 = (value: string) =>
crypto.createHash("sha512").update(value).digest("hex")
export const getTicketNumber = (
hash: string,
maxNumber = 1_000_000
) => {
const hashInt = BigInt("0x" + hash)
const maxInt = BigInt(maxNumber)
return Number((hashInt % maxInt) + BigInt(1))
}
// For USER players:
const userCombined = `${clientSeed}:${eosBlockHash}:${serverSeed}:${nonce}:${step}`
const userHash = sha512(userCombined)
const userTicket = getTicketNumber(userHash)
// For BOT players:
// The "Server Seed" from the battle modal is already the full combined string
// Format: BOT_1_{clientSeed}_{serverSeed}:{eosBlockHash}:{step}
const botHash = sha512(serverSeedFromModal)
const botTicket = getTicketNumber(botHash)Every player on PackRush should have complete confidence that every result is 100% fair and tamper-proof. To guarantee this, all of our games use a provably fair system that allows anyone to verify that every outcome is random, unbiased, and not manipulated by PackRush or any other party.
This ensures the integrity of every game, guaranteeing that the outcome of every pack open and battle is entirely unpredictable and transparent.
PackRush uses SHA-512 cryptographic hashing combined with a commitment scheme for pack openings. For battles, we add an additional layer of security by incorporating future EOS blockchain block hashes, ensuring outcomes cannot be predicted or manipulated.
Server Seed (Secret)
Generated by PackRush and kept hidden until your game ends. A hashed version is shown before play to prove it can't be changed later.
Client Seed (Public)
Chosen or generated on your device, ensuring you directly contribute to each random result. You can check and change your client seed below.
Nonce
An auto-incrementing counter that makes every result unique (1st pack = nonce 1, 2nd = nonce 2, etc.).
Step (Battles)
An incrementing counter for each pack opened in a battle (1st pack = step 1, 2nd = step 2, etc.). This ensures each pack in a battle has a unique, verifiable result.
Together, these values are combined as clientSeed:serverSeed:nonce, hashed with SHA-512, and converted to a ticket number between 1 and 1,000,000. This ticket number determines which prize you receive.
For battles, we use the same ticket number generation but combine your seeds with the hash of a future EOS blockchain block. For user players, the format is clientSeed:eosBlockHash:serverSeed:nonce:step. For bot players, we use a deterministic seed constructed from all user seeds in the battle (in the format clientSeed_serverSeed for each user), prefixed with the bot identifier, combined with the EOS block hash and step. The format is BOT_1_clientSeed_serverSeed:eosBlockHash:step. This ensures that battle outcomes are not known until the block is mined and that no player (or bot) can manipulate the result.
Once your game is complete, PackRush reveals the unhashed server seed, allowing anyone to verify that the result matches the pre-commitment and was not altered.
You can change your client seed at any time.
The server seed is first provided in its hashed form. This seed, when combined with the client seed and a nonce, is used to generate random numbers. After each purchase, the unhashed server seed is revealed in your purchase history, allowing you to independently verify the fairness of the results. To ensure continued integrity, the server seed is refreshed after every purchase.
For full transparency, we also provide verification functions you can use to confirm the fairness of your outcomes. The server seed, client seed, and nonce used in all games are recorded and can be reviewed in your game history.
Server Seed
Client Seed
Nonce
Verification code example:
import crypto from 'crypto'
export const sha512 = (value: string) =>
crypto.createHash('sha512').update(value).digest('hex')
export const combineSeeds = (
clientSeed: string,
serverSeed: string,
nonce: number
) => sha512(`${clientSeed}:${serverSeed}:${nonce}`)
export const getTicketNumber = (
hash: string,
maxNumber = 1_000_000
) => {
const hashInt = BigInt('0x' + hash)
const maxInt = BigInt(maxNumber)
return Number((hashInt % maxInt) + BigInt(1))
}Battles use EOS blockchain block hashes for provably fair randomness. When a battle is created, a future EOS block number is selected. Once that block is mined, its hash is combined with player seeds to determine outcomes.
Each pack in a battle uses an incrementing step number (1, 2, 3, etc.) to ensure every pack opening has a unique, verifiable result. Use the player type dropdown to verify what the bots received in your battle - their outcomes are deterministic and can be independently verified.
Player Type
Client Seed
Server Seed
Nonce
EOS Block Hash
Step (Pack Number)
Battle verification code example:
import crypto from "crypto"
export const sha512 = (value: string) =>
crypto.createHash("sha512").update(value).digest("hex")
export const getTicketNumber = (
hash: string,
maxNumber = 1_000_000
) => {
const hashInt = BigInt("0x" + hash)
const maxInt = BigInt(maxNumber)
return Number((hashInt % maxInt) + BigInt(1))
}
// For USER players:
const userCombined = `${clientSeed}:${eosBlockHash}:${serverSeed}:${nonce}:${step}`
const userHash = sha512(userCombined)
const userTicket = getTicketNumber(userHash)
// For BOT players:
// The "Server Seed" from the battle modal is already the full combined string
// Format: BOT_1_{clientSeed}_{serverSeed}:{eosBlockHash}:{step}
const botHash = sha512(serverSeedFromModal)
const botTicket = getTicketNumber(botHash)