Under normal behavior, a Merkle airdrop is expected to enforce a snapshot-based allocation, where each recipient can claim exactly the amount committed to in the Merkle tree, and no more. The Merkle proof should cryptographically bind the recipient address to a fixed allocation amount, ensuring distribution fairness and preventing over-claims.
The issue arises because SnowmanAirdrop.sol reconstructs the Merkle leaf using the recipient’s current Snow token balance at claim time, rather than a fixed allocation amount defined during Merkle tree generation. Since Snow balances are mutable after the Merkle root is published, users can increase their balance before claiming, causing the contract to validate a proof against a value that was never intended to be claimable. This allows recipients to mint more Snowman NFTs than their original Merkle allocation, breaking a core protocol invariant.
Likelihood:
Snow token balances are freely mutable after the Merkle root is generated, since users can earn weekly Snow, purchase Snow with ETH/WETH, or receive transfers before claiming.
The vulnerable logic is executed on the main claim path, requiring only a single standard transaction with no special timing, permissions, or edge conditions.
Impact:
Users can mint more Snowman NFTs than allocated in the Merkle tree, permanently breaking distribution correctness.
The Snowman NFT supply becomes inflated relative to intended allocations, irreversibly corrupting protocol state and diluting honest recipients.
The Merkle leaf must be validated against a fixed allocation amount provided as calldata and committed in the Merkle tree, rather than a dynamic ERC20 balance.
Additionally:
Use the verified allocatedAmount consistently for staking and NFT minting.
Do not derive Merkle inputs from mutable on-chain state.
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.