The TreasureHunt protocol is designed so that each treasure hash can only be claimed once by submitting a valid ZK proof. Once claimed, the system should permanently prevent reuse of the same proof/treasure to protect ETH rewards.
The contract does not cryptographically bind proof uniqueness to on-chain state. If the ZK verifier accepts the same valid proof multiple times (which is normal behavior for most SNARK verifiers), the contract has no on-chain replay protection, allowing repeated claims for the same treasure.
Likelihood:
Occurs whenever a valid proof is generated once (expected protocol usage).
Replays can be executed immediately in the same block or across blocks.
Impact:
Complete ETH drain of TreasureHunt contract.
One treasure → unlimited rewards.
Breaks the core invariant: one treasure = one reward.
Attacker legitimately finds one treasure.
Generates one valid ZK proof off-chain.
3. Calls claimTreasure(proof, treasureHash) → receives REWARD.
4. Repeats the exact same transaction:
Same proof
Same treasureHash
Contract pays again.
Loop until contract balance is zero.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.