The Memorabilia mints NFTs until maxSupply is reached. The problem is The check currentItemId < maxSupply prevents minting the final item.
function redeemMemorabilia(uint256 collectionId) external {
MemorabiliaCollection storage collection = collections[collectionId];
require(collection.priceInBeat > 0, "Collection does not exist");
require(collection.isActive, "Collection not active");
require(collection.currentItemId < collection.maxSupply, "Collection sold out");
}
function test_MemorabiliaOffByOne() public {
vm.prank(organizer);
uint256 collectionId = festivalPass.createMemorabiliaCollection(
"Limited Edition", "ipfs://QmLimited", 50e18, 2, true
);
vm.prank(address(festivalPass));
beatToken.mint(user1, 100e18);
vm.prank(user1);
festivalPass.redeemMemorabilia(collectionId);
assertEq(festivalPass.balanceOf(user1, festivalPass.encodeTokenId(collectionId, 1)), 1);
(, , , , uint256 currentItemId, ) = festivalPass.collections(collectionId);
assertEq(currentItemId, 2);
vm.prank(user1);
vm.expectRevert("Collection sold out");
festivalPass.redeemMemorabilia(collectionId);
}
// FestivalPass.sol
function redeemMemorabilia(uint256 collectionId) external {
// ...
- require(collection.currentItemId < collection.maxSupply, "Collection sold out");
+ require(collection.currentItemId <= collection.maxSupply, "Collection sold out");
// ...
}