claim() requires callers to pay a fee of 1e9 wei (1 Gwei) in order to claim their USDC allocation. The fee check is intended to ensure the protocol collects its fee before processing the claim.
The fee validation uses strict equality (!=) rather than a minimum threshold (<). Any caller who sends even 1 wei more than exactly 1e9 will have their transaction reverted with MerkleAirdrop__InvalidFeeAmount. This is a denial-of-service against eligible users because:
Wallets and front-ends sometimes add small buffer amounts to msg.value to account for gas estimation rounding
Smart contract wallets and account abstraction systems may forward rounded amounts
A user manually constructing a transaction with 1e9 + 1 wei is permanently locked out with no recourse — they cannot reclaim their allocation by sending exactly 1e9 on a retry without first understanding this strict requirement
Likelihood:
A user sends msg.value = 2e9 (expecting to be safe by sending more) — their transaction reverts and they cannot access their allocation until they understand the strict requirement
A front-end wallet adds a 1-wei buffer for gas estimation purposes, silently blocking every single user of that front-end
Impact:
Eligible users are denied their USDC allocation through no fault of their own
The contract continues to hold tokens that rightfully belong to blocked users with no recovery mechanism available to them
Protocol reputation is damaged when users report that claim() inexplicably reverts
Add this test to test/MerkleAirdropTest.t.sol and run forge test --match-test test_OverpaymentBlocksClaim -vvv:
Change the fee check to a minimum threshold. Optionally refund excess ETH to the caller.
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.