Expected: The EIP-712 getMessageHash
function in SnowmanAirdrop
should generate a valid type hash using the correct type signature string, which matches the one used to generate off-chain signatures (e.g., via MetaMask, Ethers.js, Ledger, etc.). This type hash is critical to ensuring deterministic domain separation and preventing signature forgery.
Bug: The current implementation contains a typo in the type string used to generate the EIP-712 MESSAGE_TYPEHASH
:
Note that "addres"
is misspelled — it should be "address"
. As a result:
The on-chain hashTypedDataV4
will never match any valid off-chain signature, since every EIP-712 signer will hash a different string.
Signature recovery will fail, and no user will be able to claim their NFT via signature-based verification.
This completely breaks the EIP-712 part of the airdrop flow.
Likelihood:
This issue will always occur when someone tries to submit a valid EIP-712 signature.
Off-chain wallets (e.g., MetaMask) use correct EIP-712 formats, but the contract is using a mismatched hash due to the typo.
Thus, signature-based claims will consistently fail, even for legitimate users.
Impact:
This leads to a complete denial-of-service for all users trying to claim NFTs via signature verification.
Breaks hybrid Merkle + EIP-712 claim mechanisms, which may have been used to prevent Sybil attacks.
Destroys user trust and utility of the signature system — even users with valid airdrop entries cannot claim.
Airdrop becomes non-functional for users relying on signatures.
This mismatch causes ECDSA signature recovery (ECDSA.recover
) to fail, as the message digest signed off-chain will never match the one computed on-chain.
Correct the typo in the EIP-712 type string. Once fixed:
The on-chain digest will match the one signed off-chain.
The recovered signer will be valid, and signature-based claims will succeed.
Signature validation becomes secure and functional as intended.
If additional EIP-712 fields are added in the future (e.g., deadline, nonce), ensure the type string is updated accurately and tested using eth_signTypedData_v4.
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.
The contest is complete and the rewards are being distributed.