TheClaimedevent is intended to record who discovered and solved each treasure, serving as an on-chain attribution record for leaderboards, NFT rewards, or reputation systems
The event incorrectly emitsmsg.senderinstead ofrecipient, allowing front-runners to steal attribution credit since the ZK proof binds therecipientaddress but NOT themsg.sender
Likelihood: HIGH
This will occur whenever a valid proof transaction is visible in the mempool before confirmation
MEV bots and front-runners actively monitor for valuable transactions to copy
The attacker simply copies the exact calldata and submits with higher gas
Impact: MEDIUM
Front-runners steal on-chain attribution for all treasure discoveries without solving any puzzles
Legitimate solvers receive their ETH rewards but lose all recognition/credit
Corrupts leaderboards, NFT distributions, or reputation systems based on
Claimed
events
In competitive CTF environments, this allows one attacker to claim credit for all 10 treasures
The vulnerability allows front-runners to steal attribution credit while the legitimate solver still receives the ETH reward. This attack is particularly damaging in competitive environments where reputation matters.
Emit therecipientaddress instead ofmsg.senderin theClaimedevent, since the recipient is cryptographically bound to the proof:
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 contract’s attribution event records `msg.sender` instead of the actual rewarded recipient. A mempool watcher can copy a legitimate claimant’s transaction and front-run it using the same proof, `treasureHash`, and bound recipient, causing the ETH to still go to the rightful recipient while the on-chain event credits the attacker’s address as the claimer. That means the core economic asset is not stolen, but the protocol’s on-chain attribution layer is, which is a real integrity failure wherever `Claimed` is used as the canonical record of who found a treasure for leaderboards, reputation, prizes, or any other downstream recognition system. In a competitive contest setting, this enables a single bot to systematically preempt honest solvers and capture apparent credit for every discovery without ever finding the treasure.
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.