The Snowman NFT supply is expected to directly correspond to the amount of Snow tokens consumed during the airdrop process.
However, Snow is implemented as a fully transferable ERC20 token, and the airdrop contract determines the mint amount based on the receiver’s current balanceOf. This allows Snow tokens to be transferred between accounts and reused to mint Snowman NFTs multiple times.
Likelihood:
Snow transfers are unrestricted at all times
The airdrop logic relies on a mutable, on-chain balance
Impact:
Snowman NFTs can be minted in excess of the intended supply
The fairness and correctness of the airdrop distribution are undermined
Scenario
The Snowman airdrop is designed so that the number of Snowman NFTs minted by an address should exactly match the amount of Snow tokens that address is entitled to and consumes during the claim process.
However, Snow is implemented as a fully transferable ERC20 token, and the airdrop contract dynamically determines the mint amount using balanceOf(receiver). This allows the same Snow tokens to be transferred and reused by multiple addresses to mint Snowman NFTs, inflating the total NFT supply beyond the intended limits.
Step-by-Step Attack Flow
Address A legitimately acquires Snow tokens.
Address A claims Snowman NFTs using claimSnowman, minting NFTs equal to its Snow balance.
After the claim, Address A transfers Snow tokens to Address B.
Address B calls claimSnowman and mints additional Snowman NFTs using the same Snow tokens.
This process can be repeated across unlimited addresses, reusing the same Snow supply.
Approach
Store each user’s eligible Snow amount off-chain.
Commit it on-chain via the Merkle tree.
Never rely on balanceOf during the claim.
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.