In a typical airdrop contract, a user should only be able to claim their airdropped tokens or NFTs once. After a successful claim, the contract should record this and prevent further claims by the same address.
In the SnowmanAirdrop contract, the claimSnowman function does not verify whether the receiver has already claimed their Snowman NFT. While the contract sets the s_hasClaimedSnowman[receiver] flag to true after a claim, it fails to check this flag before processing a new claim. This oversight allows users to repeatedly call the claim function and mint multiple NFTs illegitimately.
Likelihood:
Any user whose claim is valid (correct Merkle proof and signature) can repeatedly call claimSnowman() with the same parameters.
This can occur as long as the user keeps enough tokens in their wallet and keeps reusing the proof and signature.
Impact:
A single user can mint multiple Snowman NFTs unfairly.
The lack of a s_hasClaimedSnowman[receiver]
check allows the same user to reuse the same valid Merkle proof and ECDSA signature to repeatedly claim Snowman NFTs. Since the contract doesn’t track whether an address has already claimed (until after transferring and minting), this logic executes again every time without restriction.
The mitigation adds a pre-check to validate whether the receiver
has already claimed the NFT.
The claim function of the Snowman Airdrop contract doesn't check that a recipient has already claimed a Snowman. This poses no significant risk as is as farming period must have been long concluded before snapshot, creation of merkle script, and finally claiming.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.