编译器
0.8.21+commit.d9974bed
文件 1 的 8:BasicMintConfiguration.sol
pragma solidity ^0.8.21;
struct BasicMintConfiguration {
uint256 price;
uint64 mintStart;
uint64 mintEnd;
uint32 maxPerWallet;
uint32 maxPerTransaction;
uint32 maxForModule;
uint32 maxSupply;
}
文件 2 的 8:BasicMintModule.sol
pragma solidity ^0.8.21;
import {IBasicMintModule, IConfigurable} from "create/interfaces/v1/IBasicMintModule.sol";
import {IMintPayout} from "create/interfaces/v1/IMintPayout.sol";
import {IMintContract} from "create/interfaces/v1/IMintContract.sol";
import {BasicMintConfiguration} from "create/interfaces/v1/BasicMintConfiguration.sol";
import {Version} from "create/contracts/v1/Version.sol";
contract BasicMintModule is IBasicMintModule, Version {
IMintPayout public immutable mintPayout;
mapping(address => BasicMintConfiguration) private _configurations;
mapping(address => mapping(address => uint256)) private _mintedByAddress;
mapping(address => uint256) public mintedByContract;
error InvalidQuantity();
error TooManyTokensPerTransaction();
error TooManyTokensPerCollector();
error TooManyTokensForModule();
error MintNotStarted();
error MintEnded();
error IncorrectPayment();
error MaxSupplyReached();
constructor(address _mintPayout) Version(1) {
mintPayout = IMintPayout(_mintPayout);
}
function updateConfiguration(bytes calldata args) external override {
BasicMintConfiguration memory _config = abi.decode(args, (BasicMintConfiguration));
_configurations[msg.sender] = _config;
emit ConfigurationUpdated(msg.sender, _config);
}
function configuration(address _contract) external view returns (BasicMintConfiguration memory) {
return _configurations[_contract];
}
function mint(address _contract, address _to, address _referrer, uint256 _quantity) external payable {
_mint(_contract, _to, _referrer, _quantity);
}
function mint_efficient_7e80c46e(address _contract, address _to, address _referrer, uint256 _quantity)
external
payable
{
_mint(_contract, _to, _referrer, _quantity);
}
function _mint(address _contract, address _to, address _referrer, uint256 _quantity) internal {
BasicMintConfiguration memory config = _configurations[_contract];
if (_quantity == 0) revert InvalidQuantity();
if (config.maxPerTransaction > 0 && _quantity > config.maxPerTransaction) revert TooManyTokensPerTransaction();
if (config.maxPerWallet > 0) {
if (_mintedByAddress[_contract][_to] + _quantity > config.maxPerWallet) {
revert TooManyTokensPerCollector();
}
}
if (config.maxForModule > 0 && mintedByContract[_contract] + _quantity > config.maxForModule) {
revert TooManyTokensForModule();
}
if (block.timestamp < config.mintStart) revert MintNotStarted();
if (config.mintEnd > 0 && block.timestamp > config.mintEnd) revert MintEnded();
uint256 protocolFee = mintPayout.protocolFee();
if (msg.value != (config.price + protocolFee) * _quantity) revert IncorrectPayment();
if (config.maxSupply > 0 && IMintContract(_contract).totalMinted() + _quantity > config.maxSupply) {
revert MaxSupplyReached();
}
_mintedByAddress[_contract][_to] += _quantity;
mintedByContract[_contract] += _quantity;
mintPayout.mintDeposit{value: msg.value}(_contract, msg.sender, _referrer, _quantity);
IMintContract(_contract).mint(_to, _quantity);
}
}
文件 3 的 8:IBasicMintModule.sol
pragma solidity ^0.8.21;
import {BasicMintConfiguration} from "create/interfaces/v1/BasicMintConfiguration.sol";
import {IConfigurable} from "create/interfaces/v1/IConfigurable.sol";
interface IBasicMintModuleEvents {
event ConfigurationUpdated(address indexed _contract, BasicMintConfiguration _config);
}
interface IBasicMintModule is IConfigurable, IBasicMintModuleEvents {
function configuration(address _contract) external view returns (BasicMintConfiguration memory);
function mint(address _contract, address _to, address _referrer, uint256 _quantity) external payable;
function mint_efficient_7e80c46e(address _contract, address _to, address _referrer, uint256 _quantity)
external
payable;
}
文件 4 的 8:IConfigurable.sol
pragma solidity ^0.8.21;
interface IConfigurable {
function updateConfiguration(bytes calldata data) external;
}
文件 5 的 8:IMetadataRenderer.sol
pragma solidity ^0.8.21;
interface IMetadataRenderer {
function tokenURI(uint256 tokenId) external view returns (string memory uri);
}
文件 6 的 8:IMintContract.sol
pragma solidity ^0.8.21;
import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol";
interface IMintContractEvents {
event RoyaltyUpdated(uint256 bps);
event ModuleAdded(address module);
event ModuleRemoved(address module);
event MetadataRendererUpdated(address renderer);
}
interface IMintContract is IMintContractEvents {
function mint(address to, uint256 quantity) external;
function adminMint(address to, uint256 quantity) external;
function payoutRecipient() external view returns (address recipient);
function totalMinted() external view returns (uint256 total);
function addMintModule(address mintModule) external;
function removeMintModule(address mintModule) external;
function isMintModuleApproved(address mintModule) external view returns (bool isApproved);
function updateExternalConfiguration(address[] calldata configurables, bytes[] calldata configData) external;
function setMetadataRenderer(IMetadataRenderer renderer) external;
function metadataRenderer() external returns (IMetadataRenderer metadataRenderer);
function refreshMetadata() external;
function setRoyalty(uint256 bps) external;
function royaltyBps() external returns (uint256 bps);
}
文件 7 的 8:IMintPayout.sol
pragma solidity ^0.8.21;
interface IMintPayoutEvents {
event Deposit(address from, address to, bytes4 reason, uint256 amount);
event Withdraw(address from, address to, uint256 amount);
event MintDeposit(
address depositedBy,
address mintContract,
address minter,
address referrer,
address creator,
uint256 creatorPayout,
uint256 referralPayout,
uint256 protocolPayout,
uint256 totalAmount,
uint256 quantity,
uint256 protocolFee
);
event ProtocolFeeUpdated(uint256 fee);
}
interface IMintPayout is IMintPayoutEvents {
function balanceOf(address owner) external view returns (uint256);
function totalSupply() external view returns (uint256);
function protocolFee() external view returns (uint256 fee);
function setProtocolFee(uint256 fee) external;
function protocolFeeRecipientAccount() external view returns (address);
function withdrawProtocolFee(address to, uint256 amount) external;
function mintDeposit(address mintContract, address minter, address referrer, uint256 quantity) external payable;
function deposit(address to, bytes4 reason) external payable;
function depositBatch(address[] calldata recipients, uint256[] calldata amounts, bytes4[] calldata reasons)
external
payable;
function withdraw(address to, uint256 amount) external;
function withdrawAll(address to) external;
}
文件 8 的 8:Version.sol
pragma solidity ^0.8.21;
abstract contract Version {
uint32 public immutable contractVersion;
constructor(uint32 _contractVersion) {
contractVersion = _contractVersion;
}
}
{
"compilationTarget": {
"src/Create/contracts/v1/BasicMintModule.sol": "BasicMintModule"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 250000
},
"remappings": [
":ERC721A/=lib/ERC721A/contracts/",
":base64/=lib/base64/",
":create/=src/Create/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
":erc721a-upgradeable/=lib/erc721a-upgradeable/contracts/",
":forge-std/=lib/forge-std/src/",
":fundrop/=src/Fundrop/",
":openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":operator-filter-registry/=lib/operator-filter-registry/src/",
":solady/=lib/solady/src/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_mintPayout","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IncorrectPayment","type":"error"},{"inputs":[],"name":"InvalidQuantity","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintEnded","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"TooManyTokensForModule","type":"error"},{"inputs":[],"name":"TooManyTokensPerCollector","type":"error"},{"inputs":[],"name":"TooManyTokensPerTransaction","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"mintStart","type":"uint64"},{"internalType":"uint64","name":"mintEnd","type":"uint64"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"uint32","name":"maxPerTransaction","type":"uint32"},{"internalType":"uint32","name":"maxForModule","type":"uint32"},{"internalType":"uint32","name":"maxSupply","type":"uint32"}],"indexed":false,"internalType":"struct BasicMintConfiguration","name":"_config","type":"tuple"}],"name":"ConfigurationUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"configuration","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"mintStart","type":"uint64"},{"internalType":"uint64","name":"mintEnd","type":"uint64"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"uint32","name":"maxPerTransaction","type":"uint32"},{"internalType":"uint32","name":"maxForModule","type":"uint32"},{"internalType":"uint32","name":"maxSupply","type":"uint32"}],"internalType":"struct BasicMintConfiguration","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPayout","outputs":[{"internalType":"contract IMintPayout","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint_efficient_7e80c46e","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"args","type":"bytes"}],"name":"updateConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"}]