The Merkle root used to validate airdrop claims is stored as an immutable variable and set only in the constructor. There is no function to update the root after deployment. The root is intended to represent a snapshot of eligible recipients and their allocations at a specific point in time.
An immutable root causes two critical issues: (1) new users who acquire Snow after the snapshot cannot be added to the tree and thus cannot claim, and (2) if the root or tree generation contains errors (typos, wrong amounts, missing addresses), there is no way to correct it without redeploying the entire contract.
Likelihood (high):
The root is fixed at deployment; any mistake in the off-chain tree generation is permanent.
Users who earn or receive Snow after the snapshot block are excluded from the tree and can never claim.
Operational errors (wrong block, bug in script, data export issues) require full redeployment to fix.
Impact (high):
Legitimate recipients permanently excluded from the airdrop.
No recovery path for incorrect allocations without redeploying and migrating state.
Protocol must redeploy to support additional batches or corrections, increasing cost and complexity.
Severity (high):
Protocol deploys SnowmanAirdrop with root computed from a snapshot at block N.
User Alice earns Snow via earnSnow() after block N (or buys Snow later). Alice is not in the Merkle tree.
Alice cannot claim: there is no leaf for her address; no valid proof exists.
There is no setMerkleRoot or similar function; the root cannot be updated to include Alice.
Alternatively, the tree generation script has a bug and omits 100 valid recipients. Those recipients cannot claim. The only fix is redeploying the contract with a corrected root.
Replace the immutable root with a mutable storage variable and add an access-controlled setter. Use a timelock or multi-sig for root updates to reduce centralization risk.
Consider emitting an event on root update and documenting the snapshot block or criteria for each root to avoid confusion.
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.