MerkleAirdrop holds the airdrop tokens, but it has no owner function to recover ERC20 tokens: i_airdropToken and i_merkleRoot are immutable, and the only owner function, claimFees, withdraws ETH.
Any tokens that cannot be claimed stay in the contract forever. That includes allocations that are never claimed, tokens sent by mistake, and the full balance whenever the root or token configuration is wrong.
Likelihood:
Some recipients of an airdrop commonly never claim. Configuration mistakes also happen; this codebase's own deploy script has two of them (root amount decimals and token address).
Impact:
Unclaimed or misconfigured funds are permanently locked, and the owner has no way to remediate without redeploying and re-funding.
Code inspection: MerkleAirdrop exposes only claim, claimFees, and view functions. No path transfers i_airdropToken, or any other ERC20, except claim, which requires a valid proof for the exact leaf amount.
Add an owner-only recovery that can only be used after a claim deadline, so it cannot be used to rug users during the claim window:
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.