Describe the normal behavior in one or more sentences
Under normal operation, each treasure should be claimable only once. A successful call to `claim()` is supposed to mark that `treasureHash` as used so later attempts with the same treasure revert.
Explain the specific issue or problem in one or more sentences
The contract checks claimed[_treasureHash], but _treasureHash is never initialized. After a successful claim, the contract marks claimed[treasureHash] = true, which means it writes to a different key than the one it reads. In practice, one valid proof for a real treasure can be replayed until the full reward pool is exhausted.
Likelihood: High
Reason 1 // Describe WHEN this will occur (avoid using "if" statements)
The bug is present from deployment because _treasureHash is left at its default zero value in the constructor.
Reason 2
The issue occurs as soon as a user obtains one valid proof for any nonzero treasureHash, because the same calldata remains replayable until claimsCount reaches MAX_TREASURES.
Impact:
A single treasure can be claimed repeatedly, so the protocol no longer enforces the intended one-treasure-one-reward rule.
The full 100 ETH reward pool can be drained by replaying one valid proof ten times, leaving legitimate winners with nothing to claim
Use the same key for both the replay check and the claimed-state update. The simplest fix is to remove the unused _treasureHash variable and gate claims directly on the user-supplied treasureHash.
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.