The Claimed event is intended to log which address received the reward. However, it emits msg.sender (the proof submitter) instead of recipient (the address that actually receives the ETH). These two addresses are always different — the claim() function explicitly enforces recipient != msg.sender. Any off-chain indexer, explorer, or frontend tracking the Claimed event will display the wrong beneficiary.
Likelihood:
Triggers on every single successful claim() call, 100% of events are wrong.
The contract explicitly enforces recipient != msg.sender, guaranteeing the logged address never matches the paid address.
Impact:
Off-chain indexers, explorers, and frontends tracking Claimed events display the wrong winner
Participants monitoring events to confirm their reward was received will see an incorrect address
Any protocol building on top of this contract that uses the event to track payouts will have corrupted data
The event is declared as event `Claimed(bytes32 indexed treasureHash, address indexed recipient);`, which clearly indicates that the second indexed field is meant to represent the reward recipient, but `claim()` emits `Claimed(treasureHash, msg.sender)` instead of `Claimed(treasureHash, recipient)`, even though the ETH transfer is sent to recipient and the proof itself is constructed around the public inputs (treasureHash, recipient). As a standalone finding, this is appropriately low severity because it is fundamentally an event/accounting inconsistency rather than a direct loss-of-funds issue: the core state transition and payout still follow the intended recipient, but off-chain consumers reading the event log will observe incorrect metadata about who was associated with the claim.
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.