The getMessageHash function in SnowmanAirdrop.sol does not include chainId in the EIP-712 signature message. This allows signatures generated for one blockchain network to be replayed on another network where the contract is deployed, enabling double-claiming of NFTs.
The contract uses EIP-712 signatures to allow users to delegate their NFT claim to a third party. However, the signature message does not include the chain ID, meaning a signature generated on Ethereum mainnet can be replayed on Polygon, Arbitrum, or any other chain where the contract is deployed.
File: src/SnowmanAirdrop.sol (lines 95-103)
Severity: Medium
Likelihood: Medium
Impact: Medium
❌ Signatures can be replayed across different chains
❌ Users can claim NFTs multiple times (once per chain)
❌ Double-spending of airdrop allocation
✅ Requires contract deployment on multiple chains
Scenario: Alice claims NFTs on Ethereum mainnet, then replays the same signature on Polygon.
Expected Behavior: Alice should only be able to claim once across all chains.
Actual Behavior: Alice can claim on each chain where the contract is deployed.
Test Output:
What This Proves:
✅ Signature does not include chainId
✅ Same signature valid on multiple chains
✅ Users can double-claim NFTs
✅ Airdrop allocation can be stolen multiple times
Include chainId in the EIP-712 message to prevent cross-chain replay:
Why This Fixes It:
✅ Each chain has a unique chainId
✅ Signatures are chain-specific
✅ Cannot replay signature on different chains
✅ Prevents double-claiming across chains
EIP-712: Typed structured data hashing and signing
Cross-chain replay attack vulnerability
Similar findings in multiple multi-chain DeFi protocols
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.