diff --git a/packages/1155-contracts/src/interfaces/IFixedPriceAllowedMintersStrategy.sol b/packages/1155-contracts/src/interfaces/IFixedPriceAllowedMintersStrategy.sol index dfd9598f8..d46ca3683 100644 --- a/packages/1155-contracts/src/interfaces/IFixedPriceAllowedMintersStrategy.sol +++ b/packages/1155-contracts/src/interfaces/IFixedPriceAllowedMintersStrategy.sol @@ -37,4 +37,5 @@ interface IFixedPriceAllowedMintersStrategy { event MinterSet(address indexed mediaContract, uint256 indexed tokenId, address indexed minter, bool allowed); error ONLY_MINTER(); + error InvalidSaleTime(); } diff --git a/packages/1155-contracts/src/minters/fixed-price/FixedPriceAllowedMintersStrategy.sol b/packages/1155-contracts/src/minters/fixed-price/FixedPriceAllowedMintersStrategy.sol index d90b259b7..27746c059 100644 --- a/packages/1155-contracts/src/minters/fixed-price/FixedPriceAllowedMintersStrategy.sol +++ b/packages/1155-contracts/src/minters/fixed-price/FixedPriceAllowedMintersStrategy.sol @@ -74,6 +74,9 @@ contract FixedPriceAllowedMintersStrategy is Enjoy, SaleStrategy, LimitedMintPer /// @param tokenId The token id to set the sale config for /// @param salesConfig The sales config to set function setSale(uint256 tokenId, SalesConfig calldata salesConfig) external { + if (salesConfig.saleStart >= salesConfig.saleEnd) { + revert InvalidSaleTime(); + } salesConfigs[msg.sender][tokenId] = salesConfig; emit SaleSet(msg.sender, tokenId, salesConfig); @@ -157,7 +160,7 @@ contract FixedPriceAllowedMintersStrategy is Enjoy, SaleStrategy, LimitedMintPer /// @notice The version of the sale strategy function contractVersion() external pure override returns (string memory) { - return "1.0.0"; + return "1.0.1"; } function contractURI() external pure override returns (string memory) { diff --git a/packages/1155-contracts/test/minters/fixed-price/FixedPriceAllowedMintersStrategy.test.ts b/packages/1155-contracts/test/minters/fixed-price/FixedPriceAllowedMintersStrategy.test.ts new file mode 100644 index 000000000..1fbf97f10 --- /dev/null +++ b/packages/1155-contracts/test/minters/fixed-price/FixedPriceAllowedMintersStrategy.test.ts @@ -0,0 +1,58 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { FixedPriceAllowedMintersStrategy } from "../../../typechain-types"; + +describe("FixedPriceAllowedMintersStrategy", () => { + let fixedPriceMinter: FixedPriceAllowedMintersStrategy; + + beforeEach(async () => { + const FixedPriceMinter = await ethers.getContractFactory("FixedPriceAllowedMintersStrategy"); + fixedPriceMinter = await FixedPriceMinter.deploy(); + await fixedPriceMinter.deployed(); + }); + + describe("setSale", () => { + it("should set sale with valid time window", async () => { + const now = await time.latest(); + const saleConfig = { + saleStart: now + 100, + saleEnd: now + 1000, + maxTokensPerAddress: 5, + pricePerToken: ethers.utils.parseEther("0.1"), + fundsRecipient: ethers.constants.AddressZero + }; + + await expect(fixedPriceMinter.setSale(1, saleConfig)) + .to.emit(fixedPriceMinter, "SaleSet"); + }); + + it("should revert when saleEnd is before saleStart", async () => { + const now = await time.latest(); + const saleConfig = { + saleStart: now + 1000, + saleEnd: now + 100, + maxTokensPerAddress: 5, + pricePerToken: ethers.utils.parseEther("0.1"), + fundsRecipient: ethers.constants.AddressZero + }; + + await expect(fixedPriceMinter.setSale(1, saleConfig)) + .to.be.revertedWithCustomError(fixedPriceMinter, "InvalidSaleTime"); + }); + + it("should revert when saleStart equals saleEnd", async () => { + const now = await time.latest(); + const saleConfig = { + saleStart: now + 100, + saleEnd: now + 100, + maxTokensPerAddress: 5, + pricePerToken: ethers.utils.parseEther("0.1"), + fundsRecipient: ethers.constants.AddressZero + }; + + await expect(fixedPriceMinter.setSale(1, saleConfig)) + .to.be.revertedWithCustomError(fixedPriceMinter, "InvalidSaleTime"); + }); + }); +});