Three modes, three algorithms
Most platforms run one engine and vary a parameter. CSGOEmpire genuinely does not. Roulette, case opening and case battles use different hash functions, different message formats and different ways of turning a digest into a result. A tool that handles one of them tells you nothing about the other two.
All three are confirmed here against CSGOEmpire's own published values.
| Mode | Confirmed against | Result |
|---|---|---|
| Roulette | Published round 8,878,257 | bonus |
| Case opening | CSGOEmpire's own published code | ticket 54,293 |
| Case battle | Published battle 1,013,463 | 56,288 |
Roulette: a whole day, decided in advance
Roulette is the simplest of the three and the most unusual in how it is scheduled.
SHA-256( serverSeed-publicSeed-roundNumber ) plain hash, hyphens
|
v
first 8 hex characters as an integer
|
v
value mod 15 -> 0 = bonus, 1 to 7 = orange, 8 to 14 = black
The scheduling is the interesting part. CSGOEmpire generates the entire day's results at 00:00 UTC and publishes the hashed server seed for that whole period. At 00:00 UTC the following day it reveals the unhashed seed, and every round from the previous 24 hours becomes checkable at once.
That is a stronger commitment than a per-round reveal. A site that commits to a full day in advance cannot adjust a single round in response to what players are doing, because every subsequent round for the next 24 hours is already fixed by the same seed.
Case opening: the client seed's length is part of the message
This is the detail nobody outside CSGOEmpire documents, and it is the reason general-purpose verifiers fail here.
key = serverSeed
message = clientSeed-LENGTH(clientSeed)-nonce
|
v
HMAC-SHA256
|
v
first 6 hex byte-pairs, each divided by 256^(position)
and summed -> a value between 0 and 1
|
v
( value x ticketQuantity ) rounded down, + 1 = your ticket
The length field nobody documents
Read the message format again. Between your client seed and the nonce sits the number of characters in your client seed. If your client seed is test, the message contains test-4-30 for nonce 30. There is no cryptographic reason for it. It is simply what CSGOEmpire's code does, and omitting it produces a completely different digest.
Base-256 fractional digits, not a slice
The conversion is also unlike the usual slice-and-divide. Instead of reading a fixed number of hex characters as one integer, CSGOEmpire takes six byte-pairs and treats them as successive fractional digits in base 256, summing them into a value between 0 and 1. One item is worth 10,000 tickets.
Where CSGOEmpire contradicts itself
CSGOEmpire's case opening help article gives worked inputs and states the answer is 87,664. Running CSGOEmpire's own published code on those same inputs produces 54,293.
We have checked this carefully, because a discrepancy in an operator's own documentation is a serious claim. The inputs in the article, run through the algorithm the same article describes, give 54,293. The likeliest explanation is mundane: the 87,664 figure appears to come from a screenshot of a different opening than the one the worked example describes.
Our adapter follows the code, not the prose, and returns 54,293. We flag it here rather than quietly picking one, because if you check that example yourself you will hit the same contradiction and deserve to know it is documented rather than a fault in your working.
Case battles: an EOS block instead of a client seed
Battles cannot use one player's client seed, because there is more than one player and no reason any of them should supply the shared input.
CSGOEmpire uses the hash of an EOS blockchain block that is mined after every player has joined. Nobody at the table can know that value in advance, including CSGOEmpire, and anyone can look it up afterwards on a public EOS explorer to confirm the same block was used.
key = serverSeed (fixed when the battle is created)
message = eosBlockSeed-roundNumber-playerPosition
The conversion is the same six-byte-pair pipeline as case opening, against a quantity of 100,000. Tiebreakers drop the player position from the message and use the number of tied players as the quantity instead.
The April 2024 cutoff
Code published before 18 April 2024 differs from the current version. If you are checking something older than that and it will not reproduce, the change is the likely reason rather than an error in your inputs.
What a passing check settles
A match proves the specific round came from values fixed before you played. Given that all three modes are confirmed against CSGOEmpire's own published results, and that the case-opening path involves a field almost nobody would guess, reproducing one independently is meaningful.
It settles that round and nothing else. Whether a withdrawal arrives, how support behaves, or what any case contains are separate questions, and we are explicit about what verification cannot prove.