The claim() function is intended to let each eligible address collect their own 25 USDC allocation by submitting a valid merkle proof.
However, the function accepts an arbitrary account parameter with no verification that the caller is the account being claimed for. Because merkle proofs for all four eligible addresses are reconstructable from the public makeMerkle.js output, any third party can call claim() for every eligible address without their knowledge or consent.
Likelihood:
Any caller who reconstructs the four merkle proofs from the public script output triggers all four claims in a single transaction, paying only 4 × 1 Gwei in fees
A malicious actor front-runs a legitimate user's pending claim() transaction by submitting the same call first, causing the original transaction to revert once H-1 is fixed and s_hasClaimed is in place
Impact:
All four eligible addresses are force-claimed without consent — if the token has transfer restrictions, tax mechanics, or blacklist logic, receiving tokens unexpectedly may cause harm to the recipient
Once H-1 is mitigated with claim tracking, an attacker can permanently lock out all four legitimate claimants by front-running and force-claiming every address before the real owners act
Because account is a free parameter with no caller restriction, any address can submit a valid proof on behalf of an eligible address. The attacker only needs the four proofs — which are deterministically derivable from the public merkle root and the known eligible address list — to drain all allocations in four transactions. The scenario below illustrates how a third party who owns none of the eligible addresses can force-claim the entire airdrop:
Require that the caller is the account being claimed for, or alternatively implement EIP-712 signature verification so that the eligible address authorizes the claim off-chain and a relayer can submit it on their behalf. The simpler fix prevents any unauthorized caller from triggering a claim; the signature-based approach additionally enables gasless claims via a trusted relayer without sacrificing authorization.
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.