claim() emits Claimed(treasureHash, msg.sender) at line 111, but the payout at line 107 goes to recipient. Line 86 explicitly forbids recipient == msg.sender, so these are guaranteed different addresses on every successful claim. The event's indexed parameter is named recipient (line 44) yet contains the submitter. Any off-chain tool filtering Claimed by payee address points at the wrong person.
Likelihood: certain on every successful claim. Impact: indexers, dashboards, and incident-response tooling cannot attribute payouts to the real payee. Gas sponsors or relayers show up in the log instead of the winner. No fund loss.
Actual trace from the H-01 PoC (ten replays from 0x...BAD):
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.