The Merkle tree is committed at a snapshot of each claimer's Snow balance. claimSnowman should verify against that snapshotted amount, but instead it reads the live balance and rebuilds the leaf from it, so any balance change after the snapshot makes the recomputed leaf mismatch the committed root and reverts.
getMessageHash (line 117) also reads the live balance, so the EIP-712 digest the user signs no longer matches either.
Likelihood:
A balance change is trivial to cause: the receiver earns 1 wei via earnSnow, buys via buySnow, transfers out, or a griefer sends a 1-wei dust transfer in. Any of these permanently invalidate the proof.
Impact:
Eligible users are permanently denied their airdrop (claim DoS), and a griefer can brick any specific victim's claim by dusting them with 1 wei of Snow.
A 1-wei dust transfer to the receiver after snapshot makes claimSnowman revert with SA__InvalidProof.
Take amount as a calldata parameter, compute the leaf and digest from it, and only require the live balance to cover it.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.