The Claimed event is intended to log the address that received the reward, but claim() emits msg.sender instead of recipient.
As a result, off-chain indexers, UIs, and monitoring tools will record the wrong payout recipient.
Likelihood:
This occurs on every successful claim where msg.sender differs from recipient
The contract explicitly requires recipient != msg.sender, so the emitted recipient is always wrong for valid claims.
Impact:
The actual ETH transfer still goes to the correct recipient, so funds are not directly lost because of this bug.
However, event consumers will see incorrect claim data, which can break frontends, analytics, accounting, and dispute resolution.
The PoC performs a valid claim from caller while sending the reward to a separate recipient. The transaction succeeds and ETH is transferred to recipient, but the emitted Claimed event records caller as the recipient.
Emit the actual reward recipient instead of msg.sender.
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.