文件 1 的 19:AdminControl.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./IAdminControl.sol";
abstract contract AdminControl is Ownable, IAdminControl, ERC165 {
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private _admins;
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IAdminControl).interfaceId
|| super.supportsInterface(interfaceId);
}
modifier adminRequired() {
require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
_;
}
function getAdmins() external view override returns (address[] memory admins) {
admins = new address[](_admins.length());
for (uint i = 0; i < _admins.length(); i++) {
admins[i] = _admins.at(i);
}
return admins;
}
function approveAdmin(address admin) external override onlyOwner {
if (!_admins.contains(admin)) {
emit AdminApproved(admin, msg.sender);
_admins.add(admin);
}
}
function revokeAdmin(address admin) external override onlyOwner {
if (_admins.contains(admin)) {
emit AdminRevoked(admin, msg.sender);
_admins.remove(admin);
}
}
function isAdmin(address admin) public override view returns (bool) {
return (owner() == admin || _admins.contains(admin));
}
}
文件 2 的 19:Allowlist.sol
pragma solidity ^0.8.0;
import {AdminControl} from "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol";
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
abstract contract Allowlist is AdminControl {
bytes32 public merkleRoot;
bool public allowlistEnabled;
function ifEnabledCheckAllowlist(bytes32[] calldata merkleProof)
internal
view
returns (bool)
{
return !allowlistEnabled || isOnAllowlist(merkleProof);
}
function isOnAllowlist(bytes32[] calldata merkleProof)
internal
view
returns (bool)
{
return
MerkleProof.verify(
merkleProof,
merkleRoot,
keccak256(abi.encodePacked(msg.sender))
);
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(AdminControl)
returns (bool)
{
return AdminControl.supportsInterface(interfaceId);
}
function toggleAllowlist() external adminRequired {
allowlistEnabled = !allowlistEnabled;
}
function setAllowlist(bytes32 _merkleRoot) external adminRequired {
merkleRoot = _merkleRoot;
}
function setAllowlistStatus(bool status) public adminRequired {
allowlistEnabled = status;
}
}
文件 3 的 19:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 4 的 19:Counters.sol
pragma solidity ^0.8.0;
library Counters {
struct Counter {
uint256 _value;
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
文件 5 的 19:CreatorExtension.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
abstract contract CreatorExtension is ERC165 {
bytes4 constant internal LEGACY_EXTENSION_INTERFACE = 0x7005caad;
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) {
return interfaceId == LEGACY_EXTENSION_INTERFACE
|| super.supportsInterface(interfaceId);
}
}
文件 6 的 19:CreatorExtensionBasic.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol";
import "../core/ICreatorCore.sol";
import "./ICreatorExtensionBasic.sol";
import "./CreatorExtension.sol";
abstract contract CreatorExtensionBasic is AdminControl, CreatorExtension, ICreatorExtensionBasic {
function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, CreatorExtension, IERC165) returns (bool) {
return interfaceId == type(ICreatorExtensionBasic).interfaceId
|| super.supportsInterface(interfaceId);
}
function setBaseTokenURI(address creator, string calldata uri) external override adminRequired {
require(ERC165Checker.supportsInterface(creator, type(ICreatorCore).interfaceId), "Requires creator to implement ICreatorCore");
ICreatorCore(creator).setBaseTokenURIExtension(uri);
}
function setBaseTokenURI(address creator, string calldata uri, bool identical) external override adminRequired {
require(ERC165Checker.supportsInterface(creator, type(ICreatorCore).interfaceId), "Requires creator to implement CreatorCore");
ICreatorCore(creator).setBaseTokenURIExtension(uri, identical);
}
function setTokenURI(address creator, uint256 tokenId, string calldata uri) external override adminRequired {
require(ERC165Checker.supportsInterface(creator, type(ICreatorCore).interfaceId), "Requires creator to implement CreatorCore");
ICreatorCore(creator).setTokenURIExtension(tokenId, uri);
}
function setTokenURI(address creator, uint256[] calldata tokenIds, string[] calldata uris) external override adminRequired {
require(ERC165Checker.supportsInterface(creator, type(ICreatorCore).interfaceId), "Requires creator to implement CreatorCore");
ICreatorCore(creator).setTokenURIExtension(tokenIds, uris);
}
function setTokenURIPrefix(address creator, string calldata prefix) external override adminRequired {
require(ERC165Checker.supportsInterface(creator, type(ICreatorCore).interfaceId), "Requires creator to implement CreatorCore");
ICreatorCore(creator).setTokenURIPrefixExtension(prefix);
}
}
文件 7 的 19:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 8 的 19:ERC165Checker.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
library ERC165Checker {
bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;
function supportsERC165(address account) internal view returns (bool) {
return
_supportsERC165Interface(account, type(IERC165).interfaceId) &&
!_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
}
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
}
function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
internal
view
returns (bool[] memory)
{
bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
if (supportsERC165(account)) {
for (uint256 i = 0; i < interfaceIds.length; i++) {
interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
}
}
return interfaceIdsSupported;
}
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
if (!supportsERC165(account)) {
return false;
}
for (uint256 i = 0; i < interfaceIds.length; i++) {
if (!_supportsERC165Interface(account, interfaceIds[i])) {
return false;
}
}
return true;
}
function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
(bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
if (result.length < 32) return false;
return success && abi.decode(result, (bool));
}
}
文件 9 的 19:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
set._values[toDeleteIndex] = lastvalue;
set._indexes[lastvalue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 10 的 19:IAdminControl.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface IAdminControl is IERC165 {
event AdminApproved(address indexed account, address indexed sender);
event AdminRevoked(address indexed account, address indexed sender);
function getAdmins() external view returns (address[] memory);
function approveAdmin(address admin) external;
function revokeAdmin(address admin) external;
function isAdmin(address admin) external view returns (bool);
}
文件 11 的 19:ICreatorCore.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface ICreatorCore is IERC165 {
event ExtensionRegistered(address indexed extension, address indexed sender);
event ExtensionUnregistered(address indexed extension, address indexed sender);
event ExtensionBlacklisted(address indexed extension, address indexed sender);
event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender);
event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints);
event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints);
event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints);
event ExtensionApproveTransferUpdated(address indexed extension, bool enabled);
function getExtensions() external view returns (address[] memory);
function registerExtension(address extension, string calldata baseURI) external;
function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external;
function unregisterExtension(address extension) external;
function blacklistExtension(address extension) external;
function setBaseTokenURIExtension(string calldata uri) external;
function setBaseTokenURIExtension(string calldata uri, bool identical) external;
function setTokenURIPrefixExtension(string calldata prefix) external;
function setTokenURIExtension(uint256 tokenId, string calldata uri) external;
function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external;
function setBaseTokenURI(string calldata uri) external;
function setTokenURIPrefix(string calldata prefix) external;
function setTokenURI(uint256 tokenId, string calldata uri) external;
function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external;
function setMintPermissions(address extension, address permissions) external;
function setApproveTransferExtension(bool enabled) external;
function tokenExtension(uint256 tokenId) external view returns (address);
function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external;
function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external;
function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external;
function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);
function getFeeBps(uint256 tokenId) external view returns (uint[] memory);
function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
}
文件 12 的 19:ICreatorExtensionBasic.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface ICreatorExtensionBasic is IERC165 {
function setBaseTokenURI(address creator, string calldata uri) external;
function setBaseTokenURI(address creator, string calldata uri, bool identical) external;
function setTokenURI(address creator, uint256 tokenId, string calldata uri) external;
function setTokenURI(address creator, uint256[] calldata tokenId, string[] calldata uri) external;
function setTokenURIPrefix(address creator, string calldata prefix) external;
}
文件 13 的 19:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 14 的 19:IERC721CreatorCore.sol
pragma solidity ^0.8.0;
import "./ICreatorCore.sol";
interface IERC721CreatorCore is ICreatorCore {
function mintBase(address to) external returns (uint256);
function mintBase(address to, string calldata uri) external returns (uint256);
function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory);
function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory);
function mintExtension(address to) external returns (uint256);
function mintExtension(address to, string calldata uri) external returns (uint256);
function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory);
function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory);
function burn(uint256 tokenId) external;
}
文件 15 的 19:INFT.sol
pragma solidity ^0.8.0;
interface INFT {
function balanceOf(address _owner, uint256 _id)
external
view
returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address owner);
}
文件 16 的 19:MerkleProof.sol
pragma solidity ^0.8.0;
library MerkleProof {
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
computedHash = _efficientHash(computedHash, proofElement);
} else {
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
文件 17 的 19:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 18 的 19:PayableExtension.sol
pragma solidity ^0.8.0;
import {CreatorExtensionBasic} from "@manifoldxyz/creator-core-solidity/contracts/extensions/CreatorExtensionBasic.sol";
import {IERC721CreatorCore} from "@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol";
import {AdminControl} from "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol";
import {Counters} from "@openzeppelin/contracts/utils/Counters.sol";
import {TokenAllowlist} from "./TokenAllowlist.sol";
import {Allowlist} from "./Allowlist.sol";
contract PayableExtension is
AdminControl,
TokenAllowlist,
Allowlist,
CreatorExtensionBasic
{
using Counters for Counters.Counter;
event Withdraw(uint256 amount);
Counters.Counter private _tokenAmountTracker;
uint96 public maxSupply;
address public creator;
uint96 public mintPrice;
address private _payout;
uint256 public launchDate;
constructor(
uint96 maxSupply_,
address creator_,
uint96 mintPrice_,
address payout_,
uint256 launchDate_,
bool tokenAllowlistEnabled_,
bool allowlistEnabled_
) {
maxSupply = maxSupply_;
creator = creator_;
mintPrice = mintPrice_;
_payout = payout_;
launchDate = launchDate_;
setTokenAllowlistStatus(tokenAllowlistEnabled_);
setAllowlistStatus(allowlistEnabled_);
}
function mint(bytes32[] calldata merkleProof) external payable {
require(block.timestamp >= launchDate, "minting not enabled");
require(
_tokenAmountTracker.current() < maxSupply,
"Maximum supply reached"
);
require(msg.value >= mintPrice, "Insuficient funds");
require(
ifEnabledCheckTokenAllowlist(msg.sender),
"Not on tokenAllowlist"
);
require(
ifEnabledCheckAllowlist(merkleProof),
"Not on allowlist of addresses"
);
IERC721CreatorCore(creator).mintExtension(msg.sender);
_tokenAmountTracker.increment();
}
function getMintedTokensAmount() external view returns (uint256) {
return _tokenAmountTracker.current();
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(AdminControl, TokenAllowlist, Allowlist, CreatorExtensionBasic)
returns (bool)
{
return
AdminControl.supportsInterface(interfaceId) ||
TokenAllowlist.supportsInterface(interfaceId) ||
Allowlist.supportsInterface(interfaceId) ||
CreatorExtensionBasic.supportsInterface(interfaceId);
}
function withdraw() external adminRequired {
require(address(this).balance > 0, "No funds to withdraw");
uint256 balance = address(this).balance;
payable(_payout).transfer(balance);
emit Withdraw(balance);
}
function setPayout(address payout) external adminRequired {
require(payout != address(0), "can't be null address");
require(payout != address(this), "can't be this contract");
require(payout != _payout, "can't be the current Payout ");
_payout = payout;
}
}
文件 19 的 19:TokenAllowlist.sol
pragma solidity ^0.8.0;
import {AdminControl} from "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol";
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import {INFT} from "./INFT.sol";
abstract contract TokenAllowlist is AdminControl {
using ERC165Checker for address;
struct Token {
uint96 tokenId;
address contractAddress;
}
error ContractWithInvalidInterface();
Token[] public allowedTokens;
bool public tokenAllowlistEnabled;
function ifEnabledCheckTokenAllowlist(address sender)
internal
view
returns (bool)
{
return !tokenAllowlistEnabled || isOnTokenAllowlist(sender);
}
function isOnTokenAllowlist(address sender) internal view returns (bool) {
uint256 allowedTokensLength = allowedTokens.length;
for (uint256 i = 0; i < allowedTokensLength; ++i) {
Token memory allowedToken = allowedTokens[i];
if (
quantityOf(
INFT(allowedToken.contractAddress),
allowedToken.tokenId,
sender
) > 0
) {
return true;
}
}
return false;
}
function quantityOf(
INFT nft,
uint96 tokenID,
address potentialOwner
) internal view returns (uint256) {
bytes4[] memory interfaceIds = new bytes4[](2);
interfaceIds[0] = bytes4(0x80ac58cd);
interfaceIds[1] = bytes4(0xd9b67a26);
bool[] memory interfaceIdsSupported = address(nft)
.getSupportedInterfaces(interfaceIds);
if (interfaceIdsSupported[0]) {
address ownerOf = nft.ownerOf(tokenID);
if (ownerOf == potentialOwner) {
return 1;
} else {
return 0;
}
} else if (interfaceIdsSupported[1]) {
return nft.balanceOf(potentialOwner, tokenID);
}
return 0;
}
function supportsOneInterface(address account, bytes4[] memory interfaceIds)
internal
view
returns (bool)
{
bool[] memory interfaceIdsSupported = account.getSupportedInterfaces(
interfaceIds
);
for (uint256 i = 0; i < interfaceIdsSupported.length; i++) {
if (interfaceIdsSupported[i]) {
return true;
}
}
return false;
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(AdminControl)
returns (bool)
{
return AdminControl.supportsInterface(interfaceId);
}
function toggleTokenAllowlist() external adminRequired {
tokenAllowlistEnabled = !tokenAllowlistEnabled;
}
function setTokenAllowlist(Token[] calldata _allowedTokens)
external
adminRequired
{
delete allowedTokens;
bytes4[] memory interfaces = new bytes4[](2);
interfaces[0] = bytes4(0x80ac58cd);
interfaces[1] = bytes4(0xd9b67a26);
uint256 _allowedTokensLength = _allowedTokens.length;
for (uint256 i = 0; i < _allowedTokensLength; ++i) {
address contractAddress = _allowedTokens[i].contractAddress;
if (!supportsOneInterface(contractAddress, interfaces)) {
revert ContractWithInvalidInterface();
}
allowedTokens.push(_allowedTokens[i]);
}
}
function unsetTokenAllowlist() external adminRequired {
delete allowedTokens;
}
function setTokenAllowlistStatus(bool status) public adminRequired {
tokenAllowlistEnabled = status;
}
}
{
"compilationTarget": {
"contracts/PayableExtension.sol": "PayableExtension"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint96","name":"maxSupply_","type":"uint96"},{"internalType":"address","name":"creator_","type":"address"},{"internalType":"uint96","name":"mintPrice_","type":"uint96"},{"internalType":"address","name":"payout_","type":"address"},{"internalType":"uint256","name":"launchDate_","type":"uint256"},{"internalType":"bool","name":"tokenAllowlistEnabled_","type":"bool"},{"internalType":"bool","name":"allowlistEnabled_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractWithInvalidInterface","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowedTokens","outputs":[{"internalType":"uint96","name":"tokenId","type":"uint96"},{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setAllowlistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bool","name":"identical","type":"bool"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"setPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint96","name":"tokenId","type":"uint96"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct TokenAllowlist.Token[]","name":"_allowedTokens","type":"tuple[]"}],"name":"setTokenAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setTokenAllowlistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTokenAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAllowlistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsetTokenAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]