SnowmanAirdrop is designed to track all claimers — the comment on the array declaration explicitly states this intent.
SnowmanAirdrop declares address[] private s_claimers with a comment indicating it should track all claimers. However, claimSnowman() never pushes to this array and no function reads from it. The array is dead code that consumes a storage slot in the contract layout and adds deployment gas cost without providing any usable functionality; the only tracking that exists is the s_hasClaimedSnowman[receiver] mapping (per-address lookup, no enumeration).
Likelihood:
The array is dead on every contract instance — no execution path ever writes to or reads from it.
There is no security impact, but the mismatch between the comment and the implementation is a code quality signal.
Impact:
No security impact. The array is dead code. There is no way to enumerate all claimers on-chain, though the s_hasClaimedSnowman mapping provides per-address lookup. The storage slot declaration wastes a small amount of deployment gas.
Place this test in test/ and run forge test --match-test testClaimersArrayNeverPopulated.
vm.load reads slot 0 of the airdrop contract — the storage location for s_claimers length. The assertion confirms the array is never written to despite successful claims.
Remove the dead array declaration. The s_hasClaimedSnowman mapping already provides per-address claim tracking, and no code path reads from s_claimers. Keeping a never-populated array wastes a storage slot in the contract layout and adds unnecessary deployment gas.
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.