Snowman.mintSnowman is declared external with no access control whatsoever — no onlyOwner, no onlyAirdrop, no caller check. Any account can call it directly and mint any number of Snowman NFTs to any address without holding Snow tokens, without a Merkle proof, and without a valid signature.
The intended flow requires passing through SnowmanAirdrop.claimSnowman, which enforces Merkle tree membership, EIP-712 signature verification, and Snow token staking. However, Snowman.mintSnowman is directly callable by anyone:
The unused SM__NotAllowed error is a clear indicator that access control was intended but never implemented.
Total break of NFT supply control. The entire Snowman collection becomes infinitely mintable by any anonymous account at zero cost beyond gas. The downstream SnowmanAirdrop machinery — Merkle verification, signature verification, Snow staking — is rendered economically meaningless. An attacker can also front-run legitimate claimants to grab the lowest tokenIds since s_TokenCounter starts at 0.
Result: [PASS] — attacker holds 1,000 freshly-minted Snowman NFTs without any Snow tokens, Merkle proof, or signature.
Restrict mintSnowman so it can only be called by the SnowmanAirdrop contract. The contract already declares an unused error SM__NotAllowed() — clearly intended for this gate:
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.