Under normal behavior, a Merkle Drop contract reconstructs a leaf node using a user's address and their eligible snapshot amount, then verifies this leaf against a stored Merkle Root to authorize a claim.
However, the SnowmanAirdrop contract incorrectly retrieves the amount used for the leaf generation directly from the user's current token balance (i_snow.balanceOf(receiver)). Because Merkle Roots are generated from static off-chain snapshots, the contract forces a strict dependency where the user's current balance must exactly match their snapshot balance.
The root cause is highlighted below:
Likelihood: High
The contract logic relies on balanceOf(receiver) for leaf construction in every single execution of claimSnowman.
ERC20 token balances are public and mutable; any third party can modify another user's balance by transferring a minimal amount (1 wei) of tokens to them.
Impact: High
Legitimate users will be permanently blocked from claiming their airdrop if they have bought more tokens or received any tokens since the snapshot was taken.
A malicious actor can perform a "Dusting Attack" by sending 1 wei of Snow to all eligible addresses, causing the calculated leaf hash to mismatch the Merkle Root for every user, effectively bricking the entire airdrop.
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.