Each treasure reward can be claimed only once.
Multiple claims on the same Treasure are allowed due to the bug.
Likelihood:
Reason 1: Each claim will run this check.
Impact:
Impact 1: Line 88 checks claimed[_treasureHash] (an immutable storage variable that is never initialized, defaults to bytes32(0)) instead of claimed[treasureHash] (the function parameter). This causes the duplicate check to always validate the same storage slot regardless of which treasure is being claimed.
A valid treasure discovery can claim multiple times.
Replace the _treasureHashwith treasureHashin claim function: TreasureHunt.claim().
In `claim()`, the guard uses `claimed[_treasureHash]`, where `_treasureHash` is an immutable state variable that is never initialized to the caller-supplied treasure identifier, while the contract later marks `claimed[treasureHash] = true` using the function argument instead. As a result, the duplicate-claim check and the state update are performed against different keys, which means a previously claimed treasure is not actually blocked from being claimed again with the same valid proof and `treasureHash`. This breaks a core invariant of the protocol described in the README, namely, that each treasure can only be redeemed once, and allows one valid treasure/proof pair to be reused to drain rewards repeatedly until either the `MAX_TREASURES` cap or the contract balance is exhausted.
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.