SnowmanAirdrop::MESSAGE_TYPEHASH Breaks EIP-712 Signature Verification.Description: The contract defines an EIP-712 typeHash for the struct SnowmanClaim, but contains a typo in the struct's type string:
The word "addres" is not a valid Solidity type and should be "address". Since EIP-712 requires exact string encoding of struct types for hashing and signature verification, this typo causes the hash to mismatch the intended structure.
As a result, the getMessageHash() function will produce an incorrect digest, leading to signature verification failure when using _hashTypedDataV4().
Impact:
Any off-chain EIP-712 signatures will not match the on-chain MESSAGE_TYPEHASH, causing signature validation logic to fail silently.
The airdrop mechanism becomes non-functional.
Users will be unable to claim Snowman NFTs using valid signatures.
The entire airdrop or delegation mechanism becomes non-functional, defeating the core purpose of signature-based access control.
This may result in loss of trust, inaccessible rewards, or a complete failure of the signature-based claim flow.
Proof of Concept: This test shows how the incorrect MESSAGE_TYPEHASH breaks EIP-712 signature validation, even if everything else is correct.
Alice’s off-chain signature is based on: keccak256("SnowmanClaim(address receiver, uint256 amount)")
The contract computes the digest using:
keccak256("SnowmanClaim(addres receiver, uint256 amount)")
→ This changes the keccak256 output entirely.
As a result: ecrecover(digest, v, r, s) will return the wrong address.
Add this into the TestSnowmanAirdrop.t.sol:
Also add this into SnowAirdrop.sol:
Recommended Mitigation: Fix the typo in the type string:
A typo in the `MESSAGE_TYPEHASH` variable of the `SnowmanAirdrop` contract will prevent signature verification claims. Used `addres` instead of `address`
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.