BETA: test TORQ has no value and will be reset before the real token.
TCWIKI
EN PT
PLAY

Collect

Provably Fair Crates

How every crate is rolled from a secret fixed in advance plus your own seed, why nobody can pick or change a result, and how to check any crate yourself.

The idea in one minute#

When you open a crate, the game does not "just pick" a car. The result is calculated from three things: a secret seed whose fingerprint was published before the day began, your own seed, and a counter that goes up by one with every crate you open. The calculation is the same public formula for everyone, so anybody can redo it later and get the exact same car.

That gives you two guarantees:

  • We cannot choose a result. The secret seed is kept hidden until the day ends, but its fingerprint (hash) was published, and recorded on Solana, before you picked your seed.
  • You cannot be singled out. Nothing about a crate depends on who you are, only on the inputs above.

The four steps#

  1. A secret is fixed before the day starts. Every UTC day has one random server seed, kept secret until the day ends. Before the day begins we publish only its hash (a SHA-256 fingerprint). A hash cannot be turned back into the seed, but it also cannot be matched by a different seed, so the seed cannot be swapped afterwards. Tomorrow's hash is already public today. We also record each hash on the Solana network (a memo transaction anyone can look up), and we publish a beacon: a Solana blockhash taken after the commitment. The day's real key is made from the seed and that beacon, so a result cannot be known in advance even by us.
  2. You bring your own seed. Your client seed is generated by your own browser the first time you play and is yours to keep or change at any time. Your account also has a permanent fair ID, so two players with the same seed never get the same crate. Changing it only affects crates you open afterwards. Each crate also uses a nonce: a counter that starts at 0 and goes up by 1 with every crate you open, so two crates never share the same inputs.
  3. One public formula rolls the crate. The server seed and the beacon make the day key; then the day key, your fair ID, your client seed, the nonce and the crate type go through HMAC-SHA256 to produce a stream of random numbers. In order, they decide the rarity (using the published odds, see Crates), the model, the colour and the small stat variations. The pity rule uses your pity counter from before the open, and that counter is published with every open.
  4. The seed is revealed at 00:01 UTC. The seed stays secret until the day ends; one minute after, we publish it. Anyone can check that its hash matches the one we published before the day, and re-roll every crate of that day.

Where to look#

Open the Mint tab of the Transparency page. It has:

  • Every crate opened, newest first, with the car, rarity, colour and the last 4 characters of the wallet. You can filter by crate and rarity. Epic and Legendary pulls are highlighted.
  • Advertised vs actual: the published odds next to what the crates really gave. Pity opens are left out of the actual bar on purpose, because they are guaranteed Rare or better.
  • Daily seeds: two compact cards for today and tomorrow (locked until the reveal, with the hash and on-chain badges, times in your own timezone), and a table of past days with the revealed seed and a hash check.
  • A verifier: your browser re-runs the crate formula and compares it with the server record.

In the game, the crate shop has a Provably fair panel where you can see your client seed, your next nonce and today's hash, and change your client seed. After an opening, a small Verify link takes you to that exact crate on the Transparency page.

Verify a crate in the browser#

  1. Open a crate in the game, then press the small Verify link on the result screen. Or open the Mint tab and press Verify on any row.
  2. If the day has been revealed, you will see a green result: the seed hash matches, and your browser got the same car as the server and the public log.
  3. If the day is not over yet, you will see revealed at 00:01 UTC. Come back after that; the crate is already recorded and cannot change.

You can also check any crate with the manual form: day, client seed, nonce, crate type and your pity counter before that crate (all of these are shown in the log and in the game).

Verify by hand#

You do not need our page at all. The formula is simple enough to do with any tool that can compute HMAC-SHA256.

  1. Take the revealed server seed (64 hex characters) and check that its SHA-256 equals the hash published for that day. The hash is taken over the 32 raw bytes of the seed, not over the text.
  2. Make the day key: HMAC-SHA256 with the 32 seed bytes as the key and the beacon text as the message. Then build the message text fairId:clientSeed:nonce:crate:i, for example 0123...abcd:my-seed:3:street:0. Compute HMAC-SHA256 with the day key, for i = 0, 1, 2 and so on, and join the results into one long byte stream.
  3. Read the stream 4 bytes at a time as big-endian numbers. To draw a whole number below n, take the next number u; if u is at or above 2^32 minus (2^32 mod n), skip it and take the next one; otherwise the draw is u mod n. This avoids any bias.
  4. First draw: an integer below 1000. Compare it with the odds in per mille, in the order Common, Uncommon, Rare, Ultra Rare, Epic, Legendary. Street is 800, 150, 35, 11, 3, 1. Paddock is 520, 320, 115, 32, 10, 3. Founders is 180, 420, 270, 95, 28, 7. A draw below the first number is Common, and so on.
  5. Pity open (Street and Paddock, when your counter before the open is 15 or more): the first draw is made only among Rare, Ultra Rare, Epic and Legendary, using their own numbers as the total (50 for Street, 160 for Paddock).
  6. Second draw: the model among the models of that rarity. Third draw: an integer below 100 for the colour: 0 to 44 Gray, 45 to 72 White, 73 to 89 Blue, 90 to 97 Green, 98 to 99 Red.

The stat variations come from four more numbers in the same stream. The exact code is public in the project's shared package (crateOutcome), and it is the same function the server and the verifier page use.

Good to know#

  • The log started when provably fair crates went live. Crates opened before that have no fair record.
  • The log shows a stable nickname-like code per account instead of your wallet details. Your client seed and nonce appear in the log only after the day is revealed, because they are verification inputs.
  • This covers crates. Workshop builds and tuning use the server's own randomness for now.
  • Provably fair proves the result was not chosen after the fact. It does not change the odds: a crate is still a game of chance (see Crates).