Scheduled maintenance
The site will go down for maintenance from October 15, 2026 at 01:14 PM UTC .
Scheduled maintenance
The site will go down for maintenance from October 15, 2026 at 01:14 PM UTC .
Rewards are earned from a random play for each person you refer once they complete the spin streak challenge by spinning the wheel 2 days in a row and claiming their reward. Every play pays out gems, XP and USD with every result able to be checked by you, independently of us.
Every reel uses a Kumaraswamy curve, a close relative of the Beta distribution whose formula can be inverted exactly, so anyone can reproduce a result by hand. A uniform number
u
between 0 and 1 is turned into a reward with:
x = (1 - (1 - u)^(1 / scale))^(1 / shape)
reward = min + step × floor(((max - min) / step) × x + 0.5)
shape
below 1 gives the curve its long tail. scale
is solved so that the average reward, after rounding to the step, is exactly the advertised average. Rewards are paid to the nearest gems, whole XP and cent.
| Reel | min | max | step | mean | shape | scale |
|---|---|---|---|---|---|---|
| Gems | 10 | 500 | 1 | 150 | 0.5 | 1.19 |
| XP | 1 | 50 | 1 | 15 | 0.5 | 1.19 |
| USD | 0.05 | 10 | 0.01 | 0.1 | 0.5 | 18.4 |
Referral rewards follow the same commit-and-reveal scheme used by online casinos, so we cannot pick or change a result once you have started playing:
r
(0 gems, 1 XP, 2 USD) we compute
HMAC-SHA256(key: server seed, message: "client seed:nonce:r")
and divide its first 52 bits by 252
to get u.
Enter a revealed server seed, the client seed and a nonce to recompute that play:
You can also run this in your browser's console:
async function reel(serverSeed, clientSeed, nonce, index, { min, max, step, shape, scale }) {
const bytes = (text) => new TextEncoder().encode(text);
const key = await crypto.subtle.importKey(
"raw", bytes(serverSeed), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]
);
const digest = new Uint8Array(
await crypto.subtle.sign("HMAC", key, bytes(`${clientSeed}:${nonce}:${index}`))
);
let bits = 0n;
for (let i = 0; i < 7; i++) bits = (bits << 8n) | BigInt(digest[i]);
const u = Number(bits >> 4n) / 2 ** 52; // first 52 bits
const x = Math.pow(1 - Math.pow(1 - u, 1 / scale), 1 / shape);
const k = Math.floor(((max - min) / step) * x + 0.5);
return min + k * step;
}
Different devices can disagree in the last digit of floating point maths, which only matters for a result that falls exactly on a rounding boundary.