MerkleAirdrop.claim() is designed so that an eligible address calls it to receive their USDC allocation. The function requires the caller to pay the 1 gwei fee and provide a valid Merkle proof for the claimed account.
account is a caller-supplied parameter — msg.sender is never validated against it. Any third party can supply any eligible address as account, pay the 1 gwei fee themselves, and trigger the token transfer to that address. The recipient still receives their tokens, but they did not consent to or initiate the transaction.
Likelihood:
Merkle proofs are typically published or derivable from the Merkle tree data (which must be public for users to generate their own proofs). Any observer who knows a valid (account, amount, proof) tuple can trigger the claim.
Impact:
Users who want precise control over when they receive tokens — for tax timing, wallet migration, or protocol interaction sequencing — have their claims frontrun and executed without consent.
A griefing actor can claim on behalf of all 4 eligible addresses, depositing USDC into wallets the recipients may not actively monitor, disrupting their intended workflows.
A third party (satoshi) calls claim() with Alice's address and proof before Alice does. Alice receives her tokens but did not control the timing.
Require msg.sender == account so only the eligible address can trigger its own claim:
Alternatively, remove the account parameter entirely and use msg.sender:
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.