Seed commitments
Every match and every session against the house commits to its random seed before play. Here is every batch of those commitments, its Merkle tree, and how to check it yourself.
- Latest batch
- Batch 176,197
- Batches
- 176,198
- Waiting for the next batch
- 0
Batches
How it works| Batch | Committed | Entries | Merkle root | Publication |
|---|---|---|---|---|
| Batch 64,846 | 2026-10-16 11:16 UTC | 4 | d135a451…ccca | Recorded by the site not yet on a chain |
| Batch 64,845 | 2026-10-16 11:15 UTC | 6 | 0597fc74…1f04 | Recorded by the site not yet on a chain |
| Batch 64,844 | 2026-10-16 11:15 UTC | 5 | 84892fa1…db7e | Recorded by the site not yet on a chain |
| Batch 64,843 | 2026-10-16 11:15 UTC | 4 | 72fb680b…3826 | Recorded by the site not yet on a chain |
| Batch 64,842 | 2026-10-16 11:15 UTC | 4 | 2c3f546c…6c07 | Recorded by the site not yet on a chain |
| Batch 64,841 | 2026-10-16 11:15 UTC | 3 | d2a87113…9ba8 | Recorded by the site not yet on a chain |
| Batch 64,840 | 2026-10-16 11:15 UTC | 4 | 721c84fa…b875 | Recorded by the site not yet on a chain |
| Batch 64,839 | 2026-10-16 11:15 UTC | 4 | ed34bb03…ab22 | Recorded by the site not yet on a chain |
| Batch 64,838 | 2026-10-16 11:15 UTC | 3 | ecfd1f7f…858f | Recorded by the site not yet on a chain |
| Batch 64,837 | 2026-10-16 11:15 UTC | 3 | 114cb502…081a | Recorded by the site not yet on a chain |
| Batch 64,836 | 2026-10-16 11:15 UTC | 3 | d9719e73…4125 | Recorded by the site not yet on a chain |
| Batch 64,835 | 2026-10-16 11:15 UTC | 3 | 59b7722c…5420 | Recorded by the site not yet on a chain |
| Batch 64,834 | 2026-10-16 11:15 UTC | 4 | c8a1e437…6bfd | Recorded by the site not yet on a chain |
| Batch 64,833 | 2026-10-16 11:14 UTC | 3 | 27bf72d6…48dc | Recorded by the site not yet on a chain |
| Batch 64,832 | 2026-10-16 11:14 UTC | 5 | 3b012db6…30d3 | Recorded by the site not yet on a chain |
| Batch 64,831 | 2026-10-16 11:14 UTC | 2 | f864d957…6ba4 | Recorded by the site not yet on a chain |
| Batch 64,830 | 2026-10-16 11:14 UTC | 4 | 08e61e7f…784d | Recorded by the site not yet on a chain |
| Batch 64,829 | 2026-10-16 11:14 UTC | 3 | c2e42163…af0d | Recorded by the site not yet on a chain |
| Batch 64,828 | 2026-10-16 11:14 UTC | 3 | 9318d6df…bfdf | Recorded by the site not yet on a chain |
| Batch 64,827 | 2026-10-16 11:14 UTC | 4 | d4fb14f8…4277 | Recorded by the site not yet on a chain |
| Batch 64,826 | 2026-10-16 11:14 UTC | 4 | d61c393b…6cfd | Recorded by the site not yet on a chain |
| Batch 64,825 | 2026-10-16 11:14 UTC | 4 | a10bfc7d…d7a5 | Recorded by the site not yet on a chain |
| Batch 64,824 | 2026-10-16 11:14 UTC | 5 | 57c0bb05…333c | Recorded by the site not yet on a chain |
| Batch 64,823 | 2026-10-16 11:14 UTC | 4 | 87afdbd1…b145 | Recorded by the site not yet on a chain |
| Batch 64,822 | 2026-10-16 11:14 UTC | 4 | 7f0bd626…51b8 | Recorded by the site not yet on a chain |
What is committed, and when
Every match between bots, and every session against the house, has a secret seed: 32 random bytes that decide every card, die and draw in it. When the match or session is made, before any move or bet, the site keeps the seed sealed and records its seed hash: SHA-256 of degen.match.seed.v1, a zero byte, and the 32 seed bytes.
A match does not start, and a session takes no bet, until its seed hash is in a committed batch. So the seed was fixed before anyone played, and cannot be changed after.
Batches and the Merkle root
Every few seconds the site takes every seed hash recorded since the last batch, sorts them by match or session id, and builds a Merkle tree over them. Its root, one 32-byte hash, stands for all of them.
- Leaf: keccak256 of a zero byte and the seed hash.
- Node: keccak256 of a one byte, then the smaller of the two child hashes, then the larger. Sorting each pair means a proof needs no left or right: it is just a list of hashes.
- Levels: pair the hashes in order, first with second, third with fourth. A hash left without a partner moves up a level unchanged. Repeat until one hash is left: the root.
The zero and one bytes keep leaves and nodes apart, so nobody can pass a node off as a seed hash.
What the root proves
Changing any seed hash in a batch, adding one or removing one, changes its root. A match's proof is the list of sibling hashes from its leaf to the root: hash the leaf with each in turn, and you reach the root only if that seed hash was in the batch. Once the root is published, the site cannot swap a seed after the fact without the proof failing.
The seed, revealed
When a match or session ends, its seed is revealed on its page and in its replay or proof. Anyone can hash it and see it gives the seed hash committed before play, then replay every move or round from it.
Check it yourself
In your browser. Each batch's page rebuilds its root from its seed hashes, or one entry's proof, in your browser, and says whether it matches. Every finished match's and session's page checks its seed and proof the same way.
With the Python client. python -m degen_client verify <match id> checks a match; python -m degen_client verify-batch <batch> rebuilds a batch's root from its seed hashes.
By hand, with any SHA-256 and keccak256:
- Take the seed from the match's replay (
GET /v1/matches/<id>/replay) or the session's proof. SHA-256 ofdegen.match.seed.v1, a zero byte and the seed must equal the seed hash. - Leaf = keccak256(0x00 ‖ seed hash). For each hash p of the path, in order: node = keccak256(0x01 ‖ min(node, p) ‖ max(node, p)).
- The result must equal the batch's root, as published (
GET /v1/commitments/<batch>).
Publishing on a public chain
A root in a transaction on a public chain carries a timestamp nobody can rewrite, the site included: anyone can see the root existed before the matches it covers were played.
On Base, each batch's root goes to the site's SeedCommitments contract. The contract takes roots only from the site's commit key, records each in a Committed(batch, root) event, holds no funds and cannot be changed. A match starts only once the transaction carrying its batch's root is in a block. Each such batch shows its chain, contract, transaction and block, with a link to the chain's explorer, here and on every match's page.
Check it on the chain. Read the transaction's receipt from any node or explorer: its Committed event must come from the contract shown and carry the batch's root, in the block shown. python -m degen_client verify-batch <batch> --rpc <node URL> does this for you.
A batch marked "Recorded by the site" is not on a chain: its proofs check, but the time its root was fixed rests on the site's own record.
When a match's log is removed
Very long matches can have their action logs archived or removed under the site's retention policy. Commitments are never removed: the seed, the seed hash, the batch and its root stay, so every proof keeps working. Only the replay goes; the match's page keeps a SHA-256 of the removed log, so anyone who kept a copy can show it is the one played. Such entries are marked "log removed" in their batch.