SnowmanAirdrop.sol::claimSnowman()
The claimSnowman()
function in SnowmanAirdrop.sol
utilizes a mapping s_hasClaimedSnowman[receiver]
to record whether a recipient has successfully claimed. However, there is a critical missing require
or if
condition at the beginning of the function that would check this state variable before allowing the claim process to proceed. The mapping is only set to true
at the very end of the function after all other logic has executed.
Without an initial check, a user may be able to replay claim transactions with the same Merkle proof and signature (especially if the signature replay vulnerabilities [H-6] and [H-7] are not fully mitigated). This oversight could lead to double claims, where a single eligible user can mint multiple NFTs from a single entitlement, resulting in an inflated NFT supply and an unfair distribution.
Add a require
statement at the very beginning of the claimSnowman
function to ensure that a receiver can only execute the claim process if they have not already claimed.
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.