Root: Missing nonce/chainID in signed message
Impact: Attacker reuse signatures to drain funds
Root: Merkle leaf uses live balance vs snapshot
Impact: Users invalidate proofs after generation
Root: s_hasClaimedSnowman
set after transfers
Impact: Reentrancy allows multiple NFT mints
The function combines multiple insecure patterns:
Signatures can be replayed across chains as they lack nonce/chainID.
Merkle proofs become invalidatable as they depend on real-time balances.
State updates happen after external calls (violating CEI), enabling reentrancy.
No decimal scaling mints NFTs proportional to raw token units (e.g., 1e18 NFTs per 1 token).
Likelihood:
High (Signature reuse is trivial)
Medium (Requires block timing)
Impact:
: Critical (Full contract drain)
High (Unauthorized claims)
Claims use snow balance of receiver to compute the merkle leaf, making proofs invalid if the user’s balance changes (e.g., via transfers). Attackers can manipulate balances or frontrun claims to match eligible amounts, disrupting the airdrop.
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.