The SnowMerkle
script and SnowmanAirdrop
contract use incompatible methods for generating Merkle tree leaf hashes, creating a critical incompatibility that prevents users from claiming their airdrop rewards.
In SnowMerkle.s.sol
the leaf hash is generated using:
Where data
is a bytes32[]
array containing the address (converted to bytes32) and amount.
However, in SnowmanAirdrop.sol
the leaf hash is expected to be:
Where receiver
and amount
are directly encoded as address
and uint256
types respectively.
The key differences are:
SnowMerkle
uses ltrim64()
to remove array metadata, while SnowmanAirdrop
does not
SnowMerkle
encodes a bytes32[]
array, while SnowmanAirdrop
encodes individual typed parameters
The data structure and encoding methods are fundamentally different
Protocol administrators run SnowMerkle
script to generate Merkle proofs for airdrop participants
Users attempt to claim their airdrop by calling claimSnowman()
with the generated proof
The MerkleProof.verify()
function fails because the leaf hash computed in SnowmanAirdrop
doesn't match any leaf in the Merkle tree
Transaction reverts with SA__InvalidProof()
error
No user can successfully claim their airdrop, regardless of their eligibility
The entire airdrop mechanism becomes non-functional
Users cannot claim their entitled Snowman NFTs despite having valid Snow token balances
Align the leaf hash generation method in SnowMerkle.s.sol
to match SnowmanAirdrop.sol
In SnowMerkle.s.sol:
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.