One address. One epoch. One exact Secret.
Every read and write must use the same Ethereum Mainnet deployment. The address that submits Commit must also submit Reveal and Claim.
Chain ID 1. Verify deployed bytecode and the official Game address before signing.
chainId = 1Read the current epoch, start block, and immutable timing constants.
currentEpoch()Commit only while the block offset is below COMMIT_BLOCKS.
offset < 4,800Create one cryptographically random 32-byte value. Never use a timestamp or Math.random().
bytes32 secretStore chain, Game, wallet, epoch, Secret, and Commitment before sending the transaction.
DO NOT PUBLISHHash wallet + epoch + Secret, simulate, estimate gas, then sign the Commit.
commitMint(commitment)Wait until the current block reaches epochStart + COMMIT_BLOCKS, but not the epoch end.
4,800 ≤ offset < 7,200Use the same address, epoch, and original Secret. Verify the hash before signing.
revealMint(epoch, secret)Claim is available only after the epoch reaches its final block.
offset ≥ 7,200Read Reveal count, claim limit, claimed count, and your claimed status.
epochClaimLimit(epoch)Simulate first. If selected and capacity remains, Claim mints the Being.
claimMint(epoch)Verify the receipt, events, ownership, token ID, Being state, and on-chain metadata.
BeingMinted + TransferThe wallet address is part of the hash
ADDRESS
Use the exact address that will send commitMint. Address A cannot Reveal Address B's Commitment.
EPOCH
Use the epoch returned immediately before Commit. A Secret committed for Epoch N cannot Reveal Epoch N+1.
SECRET
Use exactly 32 bytes. Preserve every byte unchanged until the Reveal transaction confirms.
commitMint. Commit accepts only the Commitment hash. Publishing the Secret before Reveal defeats the concealment step.Generate locally, simulate, then sign
Etherscan does not generate or remember your Secret
- Open the verified contract and confirm the address exactly.
- Use Read Contract to obtain
currentEpoch(),epochStart(epoch),COMMIT_BLOCKS(), andEPOCH_BLOCKS(). - Generate the 32-byte Secret and Commitment offline with a trusted tool.
- Save the complete private record before connecting Etherscan.
- Under Write Contract, connect the correct wallet and call
commitMint(commitment). - During Reveal, reconnect the same address and call
revealMint(epoch, secret). - After epoch close, call
claimMint(epoch). A successful Reveal does not guarantee selection when oversubscribed.
Each wallet follows an isolated state machine
| Stored and checked per address | Why it cannot mix |
|---|---|
commitments(epoch, wallet) | The mapping is keyed by both epoch and address. |
revealed(epoch, wallet) | Reveal is recorded only for the caller whose Commitment matches. |
claimedEpoch(epoch, wallet) | Claim status belongs to that address and epoch. |
hasMintedBeing(wallet) | Each address can successfully Mint only one lifetime Being. |
When switching accounts, re-read all state for the newly selected address. Never reuse another address's Secret record. A Safe or other smart-contract wallet must execute Commit, Reveal, and Claim through that same contract wallet address.
Stop before signing when any check fails
BEFORE COMMIT
- Correct chain and Game address.
- Commit window is open.
- No existing current-epoch Commitment.
- Wallet has not already Minted.
- Secret record is safely stored.
BEFORE REVEAL
- Reveal window is open.
- Same wallet and epoch.
- Recomputed hash equals on-chain Commitment.
revealedis false.- Simulation succeeds.
BEFORE CLAIM
- Epoch is complete.
- Reveal succeeded.
- Claim has not already executed.
- Wallet has not already Minted.
- Simulation confirms eligibility.