The documentation gap, and how we closed it
Skin.club's provably fair page explains what the system does without saying how. It tells you outcomes are random and unaltered, that your roll history is complete, that seed-change history is visible. It contains no formula.
The formula is published, just somewhere else: Skin.club's official Medium explainer. That document is written in prose rather than code, and prose leaves gaps. Three of them matter enough to produce a wrong answer with no error message.
So we did not rely on the prose. On 22 July 2026 we took a real revealed roll from Skin.club's own Check Roll tool and worked backwards until our implementation reproduced it exactly:
| Value | |
|---|---|
| Server seed | 1862b99dc42ce8a0c05bc458b250bd20 |
| Client seed | cce4eedfa71787e499c44552981ca48a |
| Nonce | 259 |
| Roll | 66,748 |
That is an operator-produced outcome, not a self-computed example, which makes it a genuine end-to-end confirmation rather than a code cross-check.
The formula, precisely
key = clientSeed-nonce (your seed, dash separator)
message = serverSeed (the site's secret)
|
v
HMAC-SHA512 <-- key and message are the reverse of normal
|
v
first 15 hex characters as an integer
|
v
( integer mod 100,000 ) + 1 = roll from 1 to 100,000
The three things the prose left ambiguous
Each of these was settled by the real roll, and each produces a plausible wrong number rather than an obvious failure.
| Wrong assumption | Roll it returns | Correct answer |
|---|---|---|
| Conventional key and message | 21,721 | 66,748 |
| Underscore separator | 5,533 | 66,748 |
| Salt included in the roll | Wrong number | 66,748 |
Every one of those is a valid-looking roll in range. That is the whole difficulty: nothing signals which is right except a real outcome to check against.
The HMAC is inverted
Nearly every provably fair system keys the HMAC with the server seed and passes the client seed and nonce as the message. Skin.club does the opposite. Running the conventional way round on the seeds above returns 21,721 instead of 66,748.
The separator is a dash
The key is clientSeed-nonce. Using an underscore instead returns 5,533. Again, a perfectly plausible number.
The salt is not in the roll
Skin.club exposes a secret salt alongside the seeds, and the obvious assumption is that it feeds the calculation. It does not. The salt exists only to key the commitment, and including it in the roll gives the wrong answer.
The commitment is not a plain hash
The public hash Skin.club shows before you play is HMAC-SHA256 keyed with the salt over the server seed. It is not a plain SHA-256 of the server seed, and it is not SHA-256 of the server seed concatenated with the salt. We tested both; neither reproduces the published hash.
This matters because the commitment check is the half of provably fair that proves the site did not swap its seed after seeing your play. If you check it the ordinary way it will fail, and the natural reading of that failure is that Skin.club cheated. It did not. The commitment simply uses a construction most tools do not try.
The verifier above knows this and runs the correct check automatically.
Fifteen hex characters, and why that is awkward
The slice is the first 15 hex characters of the digest, which is 60 bits of information. That is more than a standard JavaScript number can hold exactly, since ordinary floating-point integers stop being reliable above 53 bits.
A verifier that converts that slice using normal arithmetic will be silently wrong for a portion of rolls: correct most of the time, quietly off in the cases where the top bits matter. Ours runs the conversion through arbitrary-precision integers so the result is exact for every possible digest.
What this page confirms
The case opening and upgrade mode share one engine, and that engine is confirmed against the real roll above. The maximum roll number is 100,000 for case opening; other mechanics on the site may use a different ceiling, which is why the verifier exposes it as an adjustable value rather than assuming.
Skin.club's public reception is polarised, and its Trustpilot profile carries roughly 1,755 reviews including recurring accusations that results are rigged, which Skin.club has responded to by pointing at its provably fair system. That is exactly the situation an independent check is for. Rather than taking either side's word, you can now recompute the roll yourself, on your own device, and see what the math says.
What a match proves is narrow and real: that specific roll came from values fixed before you played. It says nothing about withdrawals, support, or the odds attached to any case, and we are explicit about what verification cannot prove.