Normal Behavior:
When a user is eligible for a Snowman NFT via an airdrop, they should be able to claim it exactly once by providing a valid Merkle proof and EIP-712 signature. The contract uses s_hasClaimedSnowman
to track if a user has already claimed.
Issue:
The claimSnowman()
function does not check whether a user has already claimed their NFT. This allows a user to call the function and receive unlimited NFTs repeatedly, provided they still hold the token amount and can replay the same proof and signature.
Likelihood:
Any user with a valid Merkle proof and EIP-712 signature can execute the claimSnowman()
function multiple times.
No verification exists to block repeat claims; the s_hasClaimedSnowman[receiver]
flag is written to after the transfer and mint, but never checked.
Impact:
Unlimited NFT mints to the same user, potentially devaluing the collection.
Infinite draining of Snow
tokens from the user to the contract with no rate limiting, increasing risk if tokens can be recovered later or used maliciously.
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.