The SnowmanAirdrop
contract is designed to allow users to claim Snowman NFTs by providing a valid Merkle proof and ECDSA signature, burning their Snow tokens in the process. The contract uses a mapping s_hasClaimedSnowman
to track whether an address has claimed to prevent multiple claims. However, the claimSnowman
function does not check this mapping before processing a claim, allowing users to reuse the same valid signature and Merkle proof multiple times to claim additional Snowman NFTs as long as they have sufficient Snow tokens.
Likelihood:
Users can call claimSnowman
multiple times with the same valid signature and Merkle proof whenever they acquire additional Snow tokens.
The issue occurs every time a user with a valid signature and sufficient Snow tokens calls claimSnowman
after their first claim, as the contract does not check s_hasClaimedSnowman
.
Impact:
Multiple Snowman NFTs are minted to the same user, exceeding the intended airdrop allocation.
after claiming a snowman nft Alice calls Snow::earnSnow
to get another snow token. Satoshi then calls claimSnowman
again passing AL_PROOF
to claim another nft even though her nft allocation was already claimed.
add a check to make sure the user hasn't already claimed their snowman nft. this is done only if the merkle proof is successfully validated first so that users that aren't in the merkle tree can stake tokens multiple times.
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.