The contract is funded with i_airdropToken, and tokens can only leave through claim(). claimFees() sweeps only ETH (address(this).balance) to the owner, so any airdrop tokens belonging to accounts that never claim are stuck forever.
(src/MerkleAirdrop.sol:42-47)
Likelihood: Low
Real airdrops almost always have a non-zero unclaimed tail (lost keys, inactive users, abandoned addresses). The condition for stranded value is normal, but it requires those recipients to simply not claim, which is outside an attacker's control.
Impact: High
The undistributed i_airdropToken balance becomes permanently unrecoverable. For a large campaign this can mean a substantial, indefinitely frozen amount of value with no administrative path to reclaim or redistribute it.
After some recipients claim and others do not, the owner has no function to retrieve the leftover token balance.
Add an onlyOwner rescue for the airdrop token, ideally gated behind a claim deadline.
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.