编译器
0.8.17+commit.8df45f5f
文件 1 的 49:AccessControl.sol
文件 2 的 49:AccessControlEnumerable.sol
文件 3 的 49:AccessControlPausable.sol
文件 5 的 49:BaseSellable.sol
文件 6 的 49:BaseTokenURI.sol
文件 7 的 49:BytecodeStorage.sol
文件 8 的 49:Bytes32Strings.sol
文件 11 的 49:DefaultOperatorFilterer.sol
文件 12 的 49:DiamondExhibition.sol
pragma solidity ^0.8.15;
import {Strings} from "openzeppelin-contracts/utils/Strings.sol";
import {GenArt721CoreV3_Engine_Flex_PROOF} from "artblocks-contracts/GenArt721CoreV3_Engine_Flex_PROOF.sol";
import {ERC721A, ERC721ACommon, BaseTokenURI, ERC721ACommonBaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {OperatorFilterOS} from "ethier/erc721/OperatorFilterOS.sol";
import {artblocksTokenID} from "proof/artblocks/TokenIDMapping.sol";
import {IGenArt721CoreContractV3_Mintable} from "proof/artblocks/IGenArt721CoreContractV3_Mintable.sol";
import {SellableERC721ACommon} from "proof/sellers/sellable/SellableERC721ACommon.sol";
import {ProjectsConfig} from "./ProjectsConfig.sol";
import {TokenInfoManager} from "./TokenInfoManager.sol";
library DiamondExhibitionLib {
function encodePurchaseData(uint8[] memory projectIds) internal pure returns (bytes memory) {
return abi.encode(projectIds);
}
function dencodePurchaseData(bytes memory data) internal pure returns (uint8[] memory) {
return abi.decode(data, (uint8[]));
}
}
contract DiamondExhibition is
ERC721ACommonBaseTokenURI,
OperatorFilterOS,
SellableERC721ACommon,
ProjectsConfig,
TokenInfoManager
{
error ExceedingMaxTotalSupply(uint256 num, uint256 numLeft);
error ProjectExhausted(uint8 projectId);
error InvalidProject(uint8 projectId);
GenArt721CoreV3_Engine_Flex_PROOF public immutable flex;
IGenArt721CoreContractV3_Mintable public immutable flexMintGateway;
uint256 public immutable maxTotalSupply;
uint16[NUM_PROJECTS] internal _numPurchasedPerProject;
struct ConstructorParams {
address admin;
address steerer;
address payable secondaryReceiver;
GenArt721CoreV3_Engine_Flex_PROOF flex;
IGenArt721CoreContractV3_Mintable flexMintGateway;
}
constructor(ConstructorParams memory params)
ERC721ACommon(params.admin, params.steerer, "Diamond Exhibition", "DIAMOND", params.secondaryReceiver, 500)
BaseTokenURI("https://metadata.proof.xyz/diamond-exhibition/")
{
uint256 total;
uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
for (uint256 i = 0; i < NUM_PROJECTS; i++) {
total += maxNumPerProject_[i];
}
maxTotalSupply = total;
flex = params.flex;
flexMintGateway = params.flexMintGateway;
}
function _assignProject(uint256 tokenId, uint8 projectId, uint256[NUM_PROJECTS] memory maxNumPerProject_)
internal
{
if (projectId >= NUM_PROJECTS) {
revert InvalidProject(projectId);
}
uint16 numPurchased = _numPurchasedPerProject[projectId];
if (numPurchased >= maxNumPerProject_[projectId]) {
revert ProjectExhausted(projectId);
}
_numPurchasedPerProject[projectId] = numPurchased + 1;
if (_isLongformProject(projectId)) {
flexMintGateway.mint_Ecf(address(this), _artblocksProjectId(projectId), address(this));
}
_setTokenInfo(tokenId, projectId, numPurchased );
}
function _handleSale(address to, uint64 num, bytes calldata data) internal virtual override {
if (num + _totalMinted() > maxTotalSupply) {
revert ExceedingMaxTotalSupply(num, maxTotalSupply - _totalMinted());
}
uint8[] memory projectIds = DiamondExhibitionLib.dencodePurchaseData(data);
assert(projectIds.length == num);
uint256 tokenId = _nextTokenId();
uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
for (uint256 i = 0; i < num; ++i) {
_assignProject(tokenId++, projectIds[i], maxNumPerProject_);
}
SellableERC721ACommon._handleSale(to, num, data);
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
TokenInfo memory info = _tokenInfo(tokenId);
if (projectType(info.projectId) == ProjectType.Curated) {
return string.concat(_baseURI(), Strings.toString(tokenId));
}
return flex.tokenURI(artblocksTokenID(_artblocksProjectId(info.projectId), info.edition));
}
function tokenIdsByProjectId(uint8 projectId) external view returns (uint256[] memory) {
uint256[] memory tokenIds = new uint256[](_numPurchasedPerProject[projectId]);
uint256 cursor;
uint256 supply = totalSupply();
for (uint256 tokenId = 0; tokenId < supply; ++tokenId) {
if (_tokenInfo(tokenId).projectId == projectId) {
tokenIds[cursor++] = tokenId;
}
}
return tokenIds;
}
function numPurchasedPerProject() external view returns (uint16[NUM_PROJECTS] memory) {
return _numPurchasedPerProject;
}
function _isLongformToken(uint256 tokenId) internal view virtual returns (bool) {
return _isLongformProject(_tokenInfo(tokenId).projectId);
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC721ACommon, ERC721ACommonBaseTokenURI, SellableERC721ACommon)
returns (bool)
{
return ERC721ACommonBaseTokenURI.supportsInterface(interfaceId);
}
function _baseURI() internal view virtual override(ERC721A, ERC721ACommonBaseTokenURI) returns (string memory) {
return ERC721ACommonBaseTokenURI._baseURI();
}
function setApprovalForAll(address operator, bool approved) public virtual override(ERC721A, OperatorFilterOS) {
ERC721A.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public payable virtual override(ERC721A, OperatorFilterOS) {
if (_isLongformToken(tokenId)) {
ERC721A.approve(operator, tokenId);
} else {
OperatorFilterOS.approve(operator, tokenId);
}
}
function transferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.transferFrom(from, to, tokenId);
} else {
OperatorFilterOS.transferFrom(from, to, tokenId);
}
}
function safeTransferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.safeTransferFrom(from, to, tokenId);
} else {
OperatorFilterOS.safeTransferFrom(from, to, tokenId);
}
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.safeTransferFrom(from, to, tokenId, data);
} else {
OperatorFilterOS.safeTransferFrom(from, to, tokenId, data);
}
}
}
文件 17 的 49:ERC721ACommon.sol
文件 18 的 49:ERC721_PackedHashSeed.sol
文件 19 的 49:EnumerableSet.sol
文件 20 的 49:GenArt721CoreV3_Engine_Flex_PROOF.sol
文件 21 的 49:IAccessControl.sol
文件 22 的 49:IAccessControlEnumerable.sol
文件 23 的 49:IAdminACLV0.sol
文件 24 的 49:IDependencyRegistryCompatibleV0.sol
文件 29 的 49:IERC721Metadata.sol
文件 30 的 49:IERC721Receiver.sol
文件 31 的 49:IEngineRegistryV0.sol
文件 32 的 49:IGenArt721CoreContractV3_Base.sol
文件 33 的 49:IGenArt721CoreContractV3_Engine.sol
文件 34 的 49:IGenArt721CoreContractV3_Engine_Flex.sol
文件 35 的 49:IGenArt721CoreContractV3_Mintable.sol
文件 37 的 49:IOperatorFilterRegistry.sol
文件 38 的 49:IRandomizerV2.sol
文件 41 的 49:OperatorFilterOS.sol
文件 42 的 49:OperatorFilterer.sol
文件 45 的 49:ProjectsConfig.sol
pragma solidity >=0.8.17;
contract ProjectsConfig {
uint8 internal constant _NUM_LONGFORM_PROJECTS = 11;
uint8 internal constant _NUM_CURATED_PROJECTS = 10;
uint8 public constant NUM_PROJECTS = _NUM_LONGFORM_PROJECTS + _NUM_CURATED_PROJECTS;
function _maxNumPerProject() internal pure virtual returns (uint256[NUM_PROJECTS] memory sizes) {
return [
uint256(600),
600,
600,
800,
1000,
600,
450,
1000,
256,
1000,
1000,
100,
100,
100,
1127,
77,
100,
100,
200,
100,
100
];
}
function maxNumPerProject() external pure returns (uint256[NUM_PROJECTS] memory) {
return _maxNumPerProject();
}
enum ProjectType {
Longform,
Curated
}
function projectType(uint8 projectId) public pure returns (ProjectType) {
return projectId < _NUM_LONGFORM_PROJECTS ? ProjectType.Longform : ProjectType.Curated;
}
function _isLongformProject(uint8 projectId) internal pure virtual returns (bool) {
return projectType(projectId) == ProjectType.Longform;
}
function _artblocksProjectIds() internal pure virtual returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
return [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
}
function artblocksProjectIds() external pure returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
return _artblocksProjectIds();
}
function _artblocksProjectId(uint8 projectId) internal pure returns (uint256) {
assert(_isLongformProject(projectId));
return _artblocksProjectIds()[projectId];
}
}
文件 46 的 49:SellableERC721ACommon.sol
文件 48 的 49:TokenIDMapping.sol
文件 49 的 49:TokenInfoManager.sol
pragma solidity >=0.8.17;
contract TokenInfoManager {
struct TokenInfo {
uint8 projectId;
uint16 edition;
}
uint256 internal constant _NUM_MAX_TOKEN_INFO = (1 << 32);
TokenInfo[_NUM_MAX_TOKEN_INFO] private _infos;
function tokenInfos(uint256[] calldata tokenIds) external view returns (TokenInfo[] memory) {
TokenInfo[] memory infos = new TokenInfo[](tokenIds.length);
for (uint256 i = 0; i < tokenIds.length; ++i) {
infos[i] = _tokenInfo(tokenIds[i]);
}
return infos;
}
function _tokenInfo(uint256 tokenId) internal view returns (TokenInfo memory) {
return _infos[tokenId];
}
function _setTokenInfo(uint256 tokenId, uint8 projectId, uint16 edition) internal {
_infos[tokenId] = TokenInfo({projectId: projectId, edition: edition});
}
}
{
"compilationTarget": {
"src/exhibition/DiamondExhibition.sol": "DiamondExhibition"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 9999
},
"remappings": [
":@divergencetech/ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
":@openzeppelin-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":@openzeppelin-4.7/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":@openzeppelin/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
":ERC721A/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/contracts/",
":ERC721A_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
":artblocks-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/contracts/",
":artblocks-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/",
":delegation-registry/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/src/",
":delegation-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/",
":ds-test/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/src/",
":ds-test_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/",
":erc721a/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
":ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/contracts/",
":ethier_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
":forge-std/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/forge-std_1-4-0/src/",
":openzeppelin-contracts-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/contracts/",
":openzeppelin-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
":openzeppelin-contracts/contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
":openzeppelin-contracts_root-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":openzeppelin-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
":operator-filter-registry/src/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/src/",
":operator-filter-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/",
":proof/artblocks/=/home/dave/proof/proof-seller/contracts/artblocks/src/",
":proof/constants/=/home/dave/proof/proof-seller/contracts/constants/src/",
":proof/redemption/=/home/dave/proof/proof-seller/contracts/redemption/src/",
":proof/sellers/=/home/dave/proof/proof-seller/contracts/sellers/src/"
]
}
[{"inputs":[{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"steerer","type":"address"},{"internalType":"address payable","name":"secondaryReceiver","type":"address"},{"internalType":"contract GenArt721CoreV3_Engine_Flex_PROOF","name":"flex","type":"address"},{"internalType":"contract IGenArt721CoreContractV3_Mintable","name":"flexMintGateway","type":"address"}],"internalType":"struct DiamondExhibition.ConstructorParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"numLeft","type":"uint256"}],"name":"ExceedingMaxTotalSupply","type":"error"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"InvalidProject","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"ProjectExhausted","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"AUTHORISED_SELLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_STEERING_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_PROJECTS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"artblocksProjectIds","outputs":[{"internalType":"uint8[11]","name":"","type":"uint8[11]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"cdata","type":"bytes"}],"name":"callOperatorFilterRegistry","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emitMetadataUpdateForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flex","outputs":[{"internalType":"contract GenArt721CoreV3_Engine_Flex_PROOF","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flexMintGateway","outputs":[{"internalType":"contract IGenArt721CoreContractV3_Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"num","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"handleSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockSellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxNumPerProject","outputs":[{"internalType":"uint256[21]","name":"","type":"uint256[21]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numPurchasedPerProject","outputs":[{"internalType":"uint16[21]","name":"","type":"uint16[21]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"projectType","outputs":[{"internalType":"enum ProjectsConfig.ProjectType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"basisPoints","type":"uint96"}],"name":"setDefaultRoyalty","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"tokenIdsByProjectId","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"tokenInfos","outputs":[{"components":[{"internalType":"uint8","name":"projectId","type":"uint8"},{"internalType":"uint16","name":"edition","type":"uint16"}],"internalType":"struct TokenInfoManager.TokenInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]