Root + Impact
Description:
The contract constructs a Merkle leaf and verifies an ECDSA signature based only on the user’s address and token amount. There is no per‑claim nonce or timestamp included. After an initial successful claim, a user can restore their Snow token balance (via transfer or purchase) to the same amount, then reuse the identical Merkle proof and signature to call claimSnowman() a second time, resulting in duplicate NFT mints and supply inflation.
Key code snippet:
Risk
Likelihood:
A user able to rebuy or transfer tokens back can repeat the claim.
No safeguard exists once proof and signature checks pass.
Impact:
Multiple NFT airdrops to the same address.
Airdrop supply exceeds intended distribution.
Unfair advantage and loss of trust in the protocol.
Proof of Concept
User A holds the required amount of Snow tokens.
Call claimSnowman(A, proof, v, r, s) → NFTs minted (first claim).
Transfer or repurchase the same amount of Snow tokens to A.
Call claimSnowman(A, proof, v, r, s) again → NFTs minted a second time.
Recommended Mitigation
Add a per‑user nonce to leaf generation and signature:
Increment nonce before verification in claimSnowman():
Retain the boolean s_hasClaimedSnowman check as an extra guard.
Update off‑chain Merkle tree and signing scripts to include the nonce in both proof generation and EIP‑712 hashing.
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.