The Snowman
contract is designed to issue NFTs to users who have staked Snow
tokens through the SnowmanAirdrop
contract. The expected behavior is that only users who participate in the staking mechanism receive Snowman
NFTs as a form of reward.
However, the mintSnowman()
function in Snowman.sol
is declared external
and lacks any access control. As a result, any address can call this function and mint an arbitrary number of NFTs to any recipient. This breaks the intended tokenomics and reward logic by allowing free and unlimited minting of NFTs without staking Snow
tokens.
Likelihood:
The vulnerable function is declared external, making it callable by any externally owned account or contract.
There is no access control modifier (onlyOwner, onlyAirdrop, etc.), so no checks prevent unauthorized callers.
Impact:
Unlimited Minting: Any actor can mint arbitrary numbers of NFTs, inflating supply and undermining scarcity.
Broken Tokenomics: The staking-reward model fails since NFTs can be obtained without staking Snow tokens.
Airdrop Fairness Undermined: Legitimate stakers lose confidence if anyone can mint freely.
Protocol Integrity Damage: Reputation and trust suffer; integrations expecting correct supply may malfunction.
Restrict mintSnowman() so only the authorized SnowmanAirdrop contract (or another allowed address) can call it:
Ensure that SnowmanAirdrop is deployed first (or its address is known) and passed into the Snowman constructor.
In the SnowmanAirdrop contract, implement the staking checks and Merkle-based validation before calling mintSnowman().
Optionally, add further sanity checks (e.g., max amount per stake, event logging) as needed for governance or monitoring.
The mint function of the Snowman contract is unprotected. Hence, anyone can call it and mint NFTs without necessarily partaking in the airdrop.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.