Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,562 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Specified | 21210920 | 4 days ago | IN | 0 ETH | 0.00136738 | ||||
Claim Specified | 21129562 | 16 days ago | IN | 0 ETH | 0.00384788 | ||||
Claim Specified | 21107984 | 19 days ago | IN | 0 ETH | 0.00142677 | ||||
Claim Specified | 21093798 | 21 days ago | IN | 0 ETH | 0.00262023 | ||||
Claim Specified | 21093086 | 21 days ago | IN | 0 ETH | 0.00118925 | ||||
Claim Specified | 21089176 | 21 days ago | IN | 0 ETH | 0.00084157 | ||||
Claim Specified | 21088114 | 21 days ago | IN | 0 ETH | 0.00112394 | ||||
Claim Specified | 21087628 | 21 days ago | IN | 0 ETH | 0.00158769 | ||||
Claim Specified | 21087307 | 22 days ago | IN | 0 ETH | 0.00200965 | ||||
Claim Specified | 21087117 | 22 days ago | IN | 0 ETH | 0.00223935 | ||||
Claim Specified | 21087059 | 22 days ago | IN | 0 ETH | 0.00258571 | ||||
Claim Specified | 21086844 | 22 days ago | IN | 0 ETH | 0.00187464 | ||||
Claim Specified | 21086829 | 22 days ago | IN | 0 ETH | 0.00212754 | ||||
Claim Specified | 21086480 | 22 days ago | IN | 0 ETH | 0.00216611 | ||||
Claim Specified | 21086479 | 22 days ago | IN | 0 ETH | 0.00205104 | ||||
Claim Specified | 21086472 | 22 days ago | IN | 0 ETH | 0.00209584 | ||||
Claim Specified | 21086379 | 22 days ago | IN | 0 ETH | 0.00290686 | ||||
Set Specified Pr... | 21086053 | 22 days ago | IN | 0 ETH | 0.00082632 | ||||
Set Specified Pr... | 21071869 | 24 days ago | IN | 0 ETH | 0.00338356 | ||||
Claim Specified ... | 20968273 | 38 days ago | IN | 0 ETH | 0.00167772 | ||||
Claim Specified ... | 20820509 | 59 days ago | IN | 0 ETH | 0.00318367 | ||||
Claim Specified ... | 20820505 | 59 days ago | IN | 0 ETH | 0.003 | ||||
Claim Specified ... | 20805133 | 61 days ago | IN | 0 ETH | 0.0012476 | ||||
Claim Specified | 20762928 | 67 days ago | IN | 0 ETH | 0.00072554 | ||||
Claim Specified | 20737147 | 70 days ago | IN | 0 ETH | 0.00054472 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MultiRelease
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 300 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity 0.8.17; pragma abicoder v2; /*----------------------------------------------------------\ | _ _ | | /\ | | /\ | | | | / \__ ____ _ _ __ | |_ / \ _ __| |_ ___ | | / /\ \ \ / / _` | '_ \| __| / /\ \ | '__| __/ _ \ | | / ____ \ V / (_| | | | | |_ / ____ \| | | || __/ | | /_/ \_\_/ \__,_|_| |_|\__/_/ \_\_| \__\___| | | | | https://avantarte.com/careers | | https://avantarte.com/support/contact | | | \----------------------------------------------------------*/ import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import {TimerLib} from "../libraries/Timer/TimerLib.sol"; import {IERC721CreatorMintPermissions} from "@manifoldxyz/creator-core-solidity/contracts/permissions/ERC721/IERC721CreatorMintPermissions.sol"; import {IERC721CreatorCore} from "@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {ISpecifiedMinter} from "./Erc721/ISpecifiedMinter.sol"; /// @notice Represents the settings for an auction struct NftAuctionSettings { // the time at which the auction would close (will be updating) uint256 initialAuctionSeconds; // the time at which the auction would close (will be updating) uint256 floor; // The minimum amount of time left in an auction after a new bid is created uint256 timeBufferSeconds; // the token id for this auction uint256 tokenId; // The minimum percentage difference between the last bid amount and the current bid. (1-100) uint256 minBidIncrementPercentage; } /// @notice Represents an auction project struct NftAuction { NftAuctionSettings settings; // the token id for this auction uint256 startTime; // the time at which the auction would close (will be updating) uint256 closeTime; // the highest bid, used specifically for auctions uint256 highBid; // the highest bidder, used specifically for auctions address highBidder; } /// @notice Represents a ranged project struct NftRangedProjectState { // used for ranged release to specify the start of the range uint256 rangeStart; // used for ranged release to specify the end of the range uint256 rangeEnd; // used specifically for ranged release uint256 pointer; } /// @notice Represents an input to create/update a project struct NftProjectInput { // the id of the project (should use product id from storyblok) uint256 id; // the wallet of the project address wallet; // the nft contract of the project address nftContract; // the time at which the contract would be closed uint256 closeTime; // allows us to pause the project if needed bool paused; // the custodial for the tokens in this project, if applicable address custodial; // we can limit items to be claimed from a release by specifying a limit. uint256 countLimit; } /// @notice Represents an NFT project struct NftProject { // the curator who created the project address curator; // the time the project was created uint256 timestamp; // the type of the project uint256 projectType; // the id of the project (should use product id from storyblok) uint256 id; // the wallet of the project address wallet; // the nft contract of the project address nftContract; // the time at which the contract would be closed uint256 closeTime; // allows us to pause the project if needed bool paused; // the custodial for the tokens in this project, if applicable address custodial; // counts the items claimed from this release. uint256 count; // we can limit items to be claimed from a release by specifying a limit. uint256 countLimit; } /// @notice Represents a voucher with definitions that allows the holder to claim an NFT struct NFTVoucher { /// @notice the id of the project, allows us to scope projects. uint256 projectId; /// @notice (optional) used to lock voucher usage to specific wallet address. address walletAddress; /// @notice the identifier of the voucher, used to prevent double usage. uint256 voucherId; /// @notice (optional) The minimum price (in wei) that the NFT creator is willing to accept for the initial sale of this NFT. uint256 price; /// @notice (optional) allows us to restrict voucher usage. uint256 validUntil; /// @notice (optional) allows us to restrict voucher usage. uint256 tokenId; /// @notice the EIP-712 signature of all other fields in the NFTVoucher struct. For a voucher to be valid, it must be signed by an account with the SIGNER_ROLE. bytes signature; } /// @notice Represents the state of a project struct ProjectStateOutput { uint256 time; NftProject project; NftAuction auction; NftRangedProjectState ranged; } /// @title a multi release contract supporting multiple release formats /// @author Liron Navon /// @notice this contract has a complicated access system, please contact owner for support /// @dev This contract heavily relies on vouchers with valid signatures. contract MultiRelease is Ownable, ReentrancyGuard, EIP712, AccessControl, IERC721CreatorMintPermissions { /// @dev roles for access control bytes32 private constant SIGNER_ROLE = keccak256("SIGNER_ROLE"); bytes32 private constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 private constant WITHDRAWER_ROLE = keccak256("WITHDRAWER_ROLE"); /// @dev release types for project types uint256 private constant AUCTION_PROJECT = 1; uint256 private constant SPECIFIED_PROJECT = 2; uint256 private constant RANGED_PROJECT = 3; uint256 private constant LAZY_MINT_PROJECT = 4; uint256 private constant SPECIFIED_LAZY_MINT_PROJECT = 5; /// @dev for domain separation (EIP712) string private constant SIGNING_DOMAIN = "AvantArte NFT Voucher"; string private constant SIGNATURE_VERSION = "1"; /// @notice vouchers which are already used mapping(uint256 => address) public usedVouchers; /// @notice mapping of projectId => project mapping(uint256 => NftProject) private projects; /// @notice mapping of projectId => auction info - used only for auctions mapping(uint256 => NftAuction) private auctions; /// @notice mapping of projectId => auction project - used only for auctions mapping(uint256 => NftRangedProjectState) private rangedProjects; /// @notice mapping of address => address - used to verify minting using manifold mapping(address => address) private pendingMints; /// @notice an event that represents when funds have been withdrawn from the contract event OnWithdraw( uint256 indexed projectId, address indexed account, uint256 value ); /// @notice an event that represents when a token is claimed event OnTokenClaim( uint256 indexed projectId, address indexed account, uint256 tokenId, uint256 value, bool minted ); /// @notice an event that represents when a bid happens event OnAuctionBid( uint256 indexed projectId, address indexed account, uint256 tokenId, uint256 value ); /// @notice an event that represents when an auction start event OnAuctionStart( uint256 indexed projectId, address indexed account, uint256 tokenId ); /// @notice an event to call when the auction is closed manually event OnAuctionClose(uint256 indexed projectId, address indexed account); /// @notice an event to call when a user dropped from the auction event OnAuctionOutBid( uint256 indexed projectId, address indexed account, uint256 tokenId, uint256 value ); /// @notice an event that happens when a project is created event OnProjectCreated( uint256 indexed projectId, address indexed account, uint256 indexed projectType ); /// @notice an event that happens when a voucher is used event OnVoucherUsed( uint256 indexed projectId, address indexed account, uint256 voucherId ); // solhint-disable-next-line no-empty-blocks constructor() ReentrancyGuard() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {} /// @notice creates a project in which we give a range of tokens /// @param project the input to create this project /// @param rangeStart the first token in the range /// @param rangeEnd the last token in the range /// @param pointer where we start counting from, in a new project it should be same as rangeStart function setRangedProject( NftProjectInput calldata project, uint256 rangeStart, uint256 rangeEnd, uint256 pointer ) external onlyRole(ADMIN_ROLE) { _setProject(project, RANGED_PROJECT); rangedProjects[project.id].rangeStart = rangeStart; rangedProjects[project.id].rangeEnd = rangeEnd; rangedProjects[project.id].pointer = pointer; } /// @notice creates a project in which we expect to be given a contract of type manifold creator /// @param project the input to create this project function setLazyMintProject(NftProjectInput calldata project) external onlyRole(ADMIN_ROLE) { _setProject(project, LAZY_MINT_PROJECT); } /// @notice creates a project in which we expect to be given a contract that implements the ISpecifiedMinter interface /// @param project the input to create this project function setSpecifiedLazyMintProject(NftProjectInput calldata project) external onlyRole(ADMIN_ROLE) { _setProject(project, SPECIFIED_LAZY_MINT_PROJECT); } /// @notice creates a project in which we expect to be given a tokenId from the voucher /// @param project the input to create this project function setSpecifiedProject(NftProjectInput calldata project) external onlyRole(ADMIN_ROLE) { _setProject(project, SPECIFIED_PROJECT); } /// @notice creates a project which is an auction /// @param project the input to create this project /// @param auctionSettings extra settings, releated to the auction function setAuctionProject( NftProjectInput calldata project, NftAuctionSettings memory auctionSettings ) external onlyRole(ADMIN_ROLE) { _setProject(project, AUCTION_PROJECT); // settings specific to auction project auctions[project.id].settings = auctionSettings; } /// @notice allows an admin to withdraw funds from the contract, be careful as this can break functionality /// @dev extra care was taken to make sure the contract has only the funds reqired to function /// @param to the address to get the funds /// @param value the amount of funds to withdraw /// @param projectId the project id this withdrawal is based off function withdraw( address to, uint256 value, uint256 projectId ) external onlyRole(WITHDRAWER_ROLE) { _withdraw(to, value, projectId); } /// @dev makes sure the project exists /// @param projectId the id of the project modifier onlyExistingProject(uint256 projectId) { require(projects[projectId].timestamp != 0, "Nonexisting project"); _; } /// @dev makes sure the project is of the right type /// @param projectId the id of the project /// @param projectType type id of the project modifier onlyProjectOfType(uint256 projectId, uint256 projectType) { require(projects[projectId].timestamp != 0, "Nonexisting project"); require( projects[projectId].projectType == projectType, "Wrong project type" ); _; } /// @dev makes sure the project is active /// @param projectId the id of the project modifier onlyActiveProjects(uint256 projectId) { // check if the project is paused require(!projects[projectId].paused, "Project is paused"); // check if the project has a closeTime, and if so check if it passed if (projects[projectId].closeTime > 0) { require( projects[projectId].closeTime >= TimerLib._now(), "Project is over" ); } // check if the project has a countLimit, and if it's reached if (projects[projectId].countLimit > 0) { require( projects[projectId].countLimit > projects[projectId].count, "Project at count limit" ); } _; } /// @dev makes sure voucher was never used /// @param voucherId the id of the voucher modifier onlyUnusedVouchers(uint256 voucherId) { require(usedVouchers[voucherId] == address(0), "Used voucher"); _; } /// @dev makes sure the voucher is verified /// @param voucher the voucher to validates modifier onlyVerifiedVouchers(NFTVoucher calldata voucher) { // check authorized signer require( hasRole(SIGNER_ROLE, _recoverVoucherSigner(voucher)), "Unauthorized signer" ); // check payment if (voucher.price > 0) { require(msg.value >= voucher.price, "Insufficient funds"); } if (voucher.validUntil > 0) { require(voucher.validUntil >= TimerLib._now(), "Voucher expired"); } // check wallet restriction if (voucher.walletAddress != address(0)) { require(voucher.walletAddress == msg.sender, "Unauthorized wallet"); } _; } /// @notice sets the project as paused /// @param projectId the id of the project /// @param paused is the project paused function setPaused(uint256 projectId, bool paused) external onlyExistingProject(projectId) onlyRole(ADMIN_ROLE) { projects[projectId].paused = paused; } /// @dev starts the auction /// @param projectId the id of the project function _startAuction(uint256 projectId) private { // set start time auctions[projectId].startTime = TimerLib._now(); // set end time auctions[projectId].closeTime = TimerLib._now() + auctions[projectId].settings.initialAuctionSeconds; emit OnAuctionStart( projectId, msg.sender, auctions[projectId].settings.tokenId ); } /// @notice starts the auction manualy /// @param projectId the id of the project function startAuction(uint256 projectId) external onlyProjectOfType(projectId, AUCTION_PROJECT) onlyRole(ADMIN_ROLE) { _startAuction(projectId); } /// @notice close the auction manually /// @param projectId the id of the project function closeAuction(uint256 projectId) external onlyProjectOfType(projectId, AUCTION_PROJECT) onlyRole(ADMIN_ROLE) { auctions[projectId].closeTime = TimerLib._now(); emit OnAuctionClose({projectId: projectId, account: msg.sender}); } /// @notice start the project with a given time /// @param projectId the id of the project /// @param timeSeconds the time, in seconds function startWithTime(uint256 projectId, uint256 timeSeconds) external onlyExistingProject(projectId) onlyRole(ADMIN_ROLE) { projects[projectId].paused = false; projects[projectId].closeTime = TimerLib._now() + timeSeconds; } function getProjectState(uint256 projectId) external view returns (ProjectStateOutput memory state) { return ProjectStateOutput({ time: TimerLib._now(), project: projects[projectId], auction: auctions[projectId], ranged: rangedProjects[projectId] }); } /// @dev in order to make a bid in an auction, a user must pass a certain threshhold, this function calculates it /// @param projectId the id of the auction project function _getAuctionThreshHold(uint256 projectId) private view returns (uint256) { return auctions[projectId].highBid + (auctions[projectId].highBid * auctions[projectId].settings.minBidIncrementPercentage) / 100; } /// @notice validates and marks voucher as used /// @param voucher the voucher to use function _useVoucher(NFTVoucher calldata voucher) private onlyUnusedVouchers(voucher.voucherId) onlyVerifiedVouchers(voucher) { usedVouchers[voucher.voucherId] = msg.sender; projects[voucher.projectId].count += 1; emit OnVoucherUsed(voucher.projectId, msg.sender, voucher.voucherId); } /// @dev take the funds if required, validate required payments before calling this /// @param to the wallet to get the funds /// @param amount the amount of funds to withdraw /// @param projectId the project id related to the funds function _withdraw( address to, uint256 amount, uint256 projectId ) private { emit OnWithdraw(projectId, to, amount); /// solhint-disable-next-line avoid-low-level-calls (bool success, ) = payable(to).call{value: amount}(""); require(success, "Failed to withdraw"); } /// @notice claim a token from a ranged project /// @param voucher the voucher to use function claimRanged(NFTVoucher calldata voucher) external payable nonReentrant onlyProjectOfType(voucher.projectId, RANGED_PROJECT) onlyActiveProjects(voucher.projectId) { require( rangedProjects[voucher.projectId].pointer <= rangedProjects[voucher.projectId].rangeEnd, "Project out of tokens" ); _useVoucher(voucher); // get token id and increase pointer uint256 tokenId = rangedProjects[voucher.projectId].pointer; rangedProjects[voucher.projectId].pointer += 1; // transfer the NFT _transferToken(voucher.projectId, tokenId, msg.sender); if (msg.value > 0) { _withdraw( projects[voucher.projectId].wallet, msg.value, voucher.projectId ); } } function claimSpecifiedLazyMint(NFTVoucher calldata voucher) external payable nonReentrant onlyProjectOfType(voucher.projectId, SPECIFIED_LAZY_MINT_PROJECT) onlyActiveProjects(voucher.projectId) { _useVoucher(voucher); ISpecifiedMinter minter = ISpecifiedMinter( projects[voucher.projectId].nftContract ); uint256 createdToken = minter.mint(msg.sender, voucher.tokenId); emit OnTokenClaim( voucher.projectId, msg.sender, createdToken, msg.value, true ); if (msg.value > 0) { _withdraw( projects[voucher.projectId].wallet, msg.value, voucher.projectId ); } } /// @notice claim a token from a lazy mint project /// @param voucher the voucher to use function claimLazyMint(NFTVoucher calldata voucher) external payable nonReentrant onlyProjectOfType(voucher.projectId, LAZY_MINT_PROJECT) onlyActiveProjects(voucher.projectId) { _useVoucher(voucher); pendingMints[msg.sender] = projects[voucher.projectId].nftContract; IERC721CreatorCore erc721 = IERC721CreatorCore( projects[voucher.projectId].nftContract ); uint256 createdToken = erc721.mintExtension(msg.sender); emit OnTokenClaim( voucher.projectId, msg.sender, createdToken, msg.value, true ); if (msg.value > 0) { _withdraw( projects[voucher.projectId].wallet, msg.value, voucher.projectId ); } } /// @notice claim a token from a specified project /// @param voucher the voucher to use function claimSpecified(NFTVoucher calldata voucher) external payable nonReentrant onlyProjectOfType(voucher.projectId, SPECIFIED_PROJECT) onlyActiveProjects(voucher.projectId) { _useVoucher(voucher); _transferToken(voucher.projectId, voucher.tokenId, msg.sender); if (msg.value > 0) { _withdraw( projects[voucher.projectId].wallet, msg.value, voucher.projectId ); } } /// @notice claim a token from an auction project /// @param projectId the id of the auction function claimAuction(uint256 projectId) external payable nonReentrant onlyProjectOfType(projectId, AUCTION_PROJECT) onlyActiveProjects(projectId) { require( TimerLib._now() >= auctions[projectId].closeTime, "Auction: still running" ); require( msg.sender == auctions[projectId].highBidder, "Auction: not winner" ); projects[projectId].count += 1; _transferToken( projectId, auctions[projectId].settings.tokenId, msg.sender ); _withdraw( projects[projectId].wallet, auctions[projectId].highBid, projectId ); } /// @notice make a bid for an auction /// @param projectId the id of the auction function bidAuction(uint256 projectId) external payable onlyProjectOfType(projectId, AUCTION_PROJECT) onlyActiveProjects(projectId) { // setup the auction if it's not started yet if (auctions[projectId].startTime == 0) { _startAuction(projectId); } else { // auction needs to be running require( TimerLib._now() < auctions[projectId].closeTime, "Auction: is over" ); } // check the bid value if (auctions[projectId].highBid == 0) { // needs to be above floor price require( msg.value >= auctions[projectId].settings.floor, "Auction: lower than floor" ); } else { require( msg.value >= _getAuctionThreshHold(projectId), "Auction: lower than threshold" ); // emit the event for outbid emit OnAuctionOutBid( projectId, auctions[projectId].highBidder, auctions[projectId].settings.tokenId, auctions[projectId].highBid ); } // emit the event for the bid emit OnAuctionBid( projectId, msg.sender, auctions[projectId].settings.tokenId, msg.value ); // increase the time if needed uint256 timeLeft = auctions[projectId].closeTime - TimerLib._now(); if (timeLeft < auctions[projectId].settings.timeBufferSeconds) { auctions[projectId].closeTime += auctions[projectId].settings.timeBufferSeconds - timeLeft; } // info to refund the last high bidder uint256 refundBid = auctions[projectId].highBid; address refundBidder = auctions[projectId].highBidder; // set the new high bidder auctions[projectId].highBid = msg.value; auctions[projectId].highBidder = msg.sender; // refund the last bidder if (refundBid > 0 && refundBidder != address(0)) { _withdraw(refundBidder, refundBid, projectId); } } /// @dev setup a project /// @param project the input for the project /// @param projectType the type of the project to create/update function _setProject(NftProjectInput calldata project, uint256 projectType) private { // check if exists, if so check if the same project type if (projects[project.id].timestamp != 0) { require( projects[project.id].projectType == projectType, "Wrong project type" ); } else { // setup for new project, these cannot be edited after creation projects[project.id].id = project.id; projects[project.id].timestamp = TimerLib._now(); projects[project.id].curator = msg.sender; projects[project.id].count = 0; projects[project.id].projectType = projectType; emit OnProjectCreated(project.id, msg.sender, projectType); } // general project settings projects[project.id].custodial = project.custodial; projects[project.id].wallet = project.wallet; projects[project.id].nftContract = project.nftContract; projects[project.id].paused = project.paused; projects[project.id].closeTime = project.closeTime; projects[project.id].countLimit = project.countLimit; } /// @notice Returns a hash of the given NFTVoucher, prepared using EIP712 typed data hashing rules. /// @param voucher An NFTVoucher to hash. function _hashVoucher(NFTVoucher calldata voucher) internal view returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( keccak256( "NFTVoucher(uint256 projectId,address walletAddress,uint256 voucherId,uint256 price,uint256 validUntil,uint256 tokenId)" ), voucher.projectId, voucher.walletAddress, voucher.voucherId, voucher.price, voucher.validUntil, voucher.tokenId ) ) ); } /// @notice Verifies the signature for a given NFTVoucher, returning the address of the signer. /// @dev Will revert if the signature is invalid. Does not verify that the signer is authorized to mint NFTs. /// @param voucher An NFTVoucher describing an unminted NFT. function _recoverVoucherSigner(NFTVoucher calldata voucher) internal view returns (address) { // take data, hash it bytes32 digest = _hashVoucher(voucher); // take hash + signature, and get public key return ECDSA.recover(digest, voucher.signature); } /// @notice Transfers a token from a custodial wallet to a user wallet /// @param projectId the id of the related project /// @param tokenId the id of the token to transfer /// @param to the wallet who would recieve the token function _transferToken( uint256 projectId, uint256 tokenId, address to ) private { emit OnTokenClaim(projectId, msg.sender, tokenId, msg.value, false); IERC721 nft = IERC721(projects[projectId].nftContract); nft.transferFrom(projects[projectId].custodial, to, tokenId); } /// @notice approve minting for manifold contract (ERC721) /// @dev it is verified by setting pendingMints for a wallet address and approving only the specified wallet /// @param to the wallet which is expected to recieve the token function approveMint( address, /* extension */ address to, uint256 /* tokenId */ ) external virtual override { require(msg.sender == pendingMints[to], "Not manifold creator"); delete pendingMints[to]; } /// @notice derived from ERC165, checks support for interfaces /// @param interfaceId the interface id to check function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { return // supports open zepplin's access control AccessControl.supportsInterface(interfaceId) || // supports maniford mint permissions (erc721) interfaceId == type(IERC721CreatorMintPermissions).interfaceId; } /// @notice overriding check role (from AccessControl) to treat the owner as a super user /// @param role the id of the role function _checkRole(bytes32 role) internal view virtual override { if (msg.sender != owner()) { _checkRole(role, msg.sender); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /*----------------------------------------------------------\ | _ _ | | /\ | | /\ | | | | / \__ ____ _ _ __ | |_ / \ _ __| |_ ___ | | / /\ \ \ / / _` | '_ \| __| / /\ \ | '__| __/ _ \ | | / ____ \ V / (_| | | | | |_ / ____ \| | | || __/ | | /_/ \_\_/ \__,_|_| |_|\__/_/ \_\_| \__\___| | | | | https://avantarte.com/careers | | https://avantarte.com/support/contact | | | \----------------------------------------------------------*/ /** * @title An interface for a contract that allows minting with a specified token id * @author Liron Navon * @dev This interface is used for connecting to the lazy minting contracts. */ interface ISpecifiedMinter { function mint(address to, uint256 tokenId) external returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "./ICreatorCore.sol"; /** * @dev Core ERC721 creator interface */ interface IERC721CreatorCore is ICreatorCore { /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to) external returns (uint256); /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenIds minted */ function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev burn a token. Can only be called by token owner or approved address. * On burn, calls back to the registered extension's onBurn method */ function burn(uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721Creator compliant extension contracts. */ interface IERC721CreatorMintPermissions is IERC165 { /** * @dev get approval to mint */ function approveMint(address extension, address to, uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; struct TimerData { /// @notice the time the contract started (seconds) uint256 startTime; /// @notice the time the contract is running from startTime (seconds) uint256 runningTime; } /// @title provides functionality to use time library TimerLib { using TimerLib for Timer; struct Timer { /// @notice the time the contract started uint256 startTime; /// @notice the time the contract is running from startTime uint256 runningTime; /// @notice is the timer paused bool paused; } /// @notice is the timer running - marked as running and has time remaining function _deadline(Timer storage self) internal view returns (uint256) { return self.startTime + self.runningTime; } function _now() internal view returns (uint256) { // solhint-disable-next-line not-rely-on-time return block.timestamp; } /// @notice is the timer running - marked as running and has time remaining function _isRunning(Timer storage self) internal view returns (bool) { return !self.paused && (self._deadline() > _now()); } /// @notice starts the timer, call again to restart function _start(Timer storage self, uint256 runningTime) internal { self.paused = false; self.startTime = _now(); self.runningTime = runningTime; } /// @notice updates the running time function _updateRunningTime(Timer storage self, uint256 runningTime) internal { self.runningTime = runningTime; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Core creator interface */ 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); /** * @dev gets address of all extensions */ function getExtensions() external view returns (address[] memory); /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI) external; /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external; /** * @dev add an extension. Can only be called by contract owner or admin. * Returns True if removed, False if already removed. */ function unregisterExtension(address extension) external; /** * @dev blacklist an extension. Can only be called by contract owner or admin. * This function will destroy all ability to reference the metadata of any tokens created * by the specified extension. It will also unregister the extension if needed. * Returns True if removed, False if already removed. */ function blacklistExtension(address extension) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. */ function setBaseTokenURIExtension(string calldata uri) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURIExtension(string calldata uri, bool identical) external; /** * @dev set the common prefix of an extension. Can only be called by extension. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefixExtension(string calldata prefix) external; /** * @dev set the tokenURI of a token extension. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external; /** * @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURI(string calldata uri) external; /** * @dev set the common prefix for tokens with no extension. Can only be called by owner/admin. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev set the tokenURI of a token with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external; /** * @dev set a permissions contract for an extension. Used to control minting. */ function setMintPermissions(address extension, address permissions) external; /** * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval * from the extension before transferring */ function setApproveTransferExtension(bool enabled) external; /** * @dev get the extension of a given token */ function tokenExtension(uint256 tokenId) external view returns (address); /** * @dev Set default royalties */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of a token */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of an extension */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Get royalites of a token. Returns list of receivers and basisPoints */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); // Royalty support for various other standards 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); }
{ "optimizer": { "enabled": true, "runs": 300 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"OnAuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OnAuctionClose","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"OnAuctionOutBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OnAuctionStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"projectType","type":"uint256"}],"name":"OnProjectCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"minted","type":"bool"}],"name":"OnTokenClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"voucherId","type":"uint256"}],"name":"OnVoucherUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"OnWithdraw","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":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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"bidAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"claimAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct NFTVoucher","name":"voucher","type":"tuple"}],"name":"claimLazyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct NFTVoucher","name":"voucher","type":"tuple"}],"name":"claimRanged","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct NFTVoucher","name":"voucher","type":"tuple"}],"name":"claimSpecified","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct NFTVoucher","name":"voucher","type":"tuple"}],"name":"claimSpecifiedLazyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"closeAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectState","outputs":[{"components":[{"internalType":"uint256","name":"time","type":"uint256"},{"components":[{"internalType":"address","name":"curator","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"projectType","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProject","name":"project","type":"tuple"},{"components":[{"components":[{"internalType":"uint256","name":"initialAuctionSeconds","type":"uint256"},{"internalType":"uint256","name":"floor","type":"uint256"},{"internalType":"uint256","name":"timeBufferSeconds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"internalType":"struct NftAuctionSettings","name":"settings","type":"tuple"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"uint256","name":"highBid","type":"uint256"},{"internalType":"address","name":"highBidder","type":"address"}],"internalType":"struct NftAuction","name":"auction","type":"tuple"},{"components":[{"internalType":"uint256","name":"rangeStart","type":"uint256"},{"internalType":"uint256","name":"rangeEnd","type":"uint256"},{"internalType":"uint256","name":"pointer","type":"uint256"}],"internalType":"struct NftRangedProjectState","name":"ranged","type":"tuple"}],"internalType":"struct ProjectStateOutput","name":"state","type":"tuple"}],"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":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProjectInput","name":"project","type":"tuple"},{"components":[{"internalType":"uint256","name":"initialAuctionSeconds","type":"uint256"},{"internalType":"uint256","name":"floor","type":"uint256"},{"internalType":"uint256","name":"timeBufferSeconds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"internalType":"struct NftAuctionSettings","name":"auctionSettings","type":"tuple"}],"name":"setAuctionProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProjectInput","name":"project","type":"tuple"}],"name":"setLazyMintProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProjectInput","name":"project","type":"tuple"},{"internalType":"uint256","name":"rangeStart","type":"uint256"},{"internalType":"uint256","name":"rangeEnd","type":"uint256"},{"internalType":"uint256","name":"pointer","type":"uint256"}],"name":"setRangedProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProjectInput","name":"project","type":"tuple"}],"name":"setSpecifiedLazyMintProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"closeTime","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"address","name":"custodial","type":"address"},{"internalType":"uint256","name":"countLimit","type":"uint256"}],"internalType":"struct NftProjectInput","name":"project","type":"tuple"}],"name":"setSpecifiedProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"startAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"timeSeconds","type":"uint256"}],"name":"startWithTime","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedVouchers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b506040518060400160405280601581526020017f4176616e7441727465204e465420566f75636865720000000000000000000000815250604051806040016040528060018152602001603160f81b8152506200007d620000776200011660201b60201c565b6200011a565b60018055815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c094850190915281519190950120905291909152610120526200016a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805160a05160c05160e0516101005161012051613872620001ba6000396000612eb501526000612f0401526000612edf01526000612e3801526000612e6201526000612e8c01526138726000f3fe6080604052600436106101c25760003560e01c806391d14854116100f7578063bf38c78411610095578063e015571411610064578063e015571414610513578063e84efe6614610540578063f029c2d814610553578063f2fde38b1461057357600080fd5b8063bf38c7841461047d578063d030824a1461049d578063d547741f146104d3578063daff97b5146104f357600080fd5b8063a217fddf116100d1578063a217fddf14610415578063ad5f2bd21461042a578063b1058e9f1461044a578063b5c5f6721461045d57600080fd5b806391d148541461039c5780639aafc6c9146103e2578063a074d568146103f557600080fd5b80633187bf2b116101645780635e2fff491161013e5780635e2fff491461032f57806364a7d7c714610342578063715018a6146103555780638da5cb5b1461036a57600080fd5b80633187bf2b146102dc57806336568abe146102fc5780635b43956e1461031c57600080fd5b8063236ed8f3116101a0578063236ed8f31461023e578063248a9ca31461025e57806324fd862a1461029c5780632f2ff15d146102bc57600080fd5b806301ffc9a7146101c7578063065de74c146101fc5780631b2994441461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004613177565b610593565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b5061021c6102173660046131a1565b6105bf565b005b34801561022a57600080fd5b5061021c6102393660046131d2565b610652565b34801561024a57600080fd5b5061021c6102593660046131a1565b610694565b34801561026a57600080fd5b5061028e6102793660046131a1565b60009081526002602052604090206001015490565b6040519081526020016101f3565b3480156102a857600080fd5b5061021c6102b736600461320f565b610754565b3480156102c857600080fd5b5061021c6102d7366004613247565b61077b565b3480156102e857600080fd5b5061021c6102f7366004613273565b6107a5565b34801561030857600080fd5b5061021c610317366004613247565b61082c565b61021c61032a366004613295565b6108a6565b61021c61033d366004613295565b610bd4565b61021c6103503660046131a1565b610e9f565b34801561036157600080fd5b5061021c611333565b34801561037657600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101f3565b3480156103a857600080fd5b506101e76103b7366004613247565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61021c6103f03660046131a1565b611347565b34801561040157600080fd5b5061021c61041036600461320f565b61166a565b34801561042157600080fd5b5061028e600081565b34801561043657600080fd5b5061021c61044536600461320f565b61168d565b61021c610458366004613295565b6116b0565b34801561046957600080fd5b5061021c6104783660046132d2565b6118de565b34801561048957600080fd5b5061021c61049836600461331b565b611913565b3480156104a957600080fd5b506103846104b83660046131a1565b6003602052600090815260409020546001600160a01b031681565b3480156104df57600080fd5b5061021c6104ee366004613247565b611979565b3480156104ff57600080fd5b5061021c61050e3660046133cf565b61199e565b34801561051f57600080fd5b5061053361052e3660046131a1565b611a0c565b6040516101f391906133f2565b61021c61054e366004613295565b611c5e565b34801561055f57600080fd5b5061021c61056e36600461354d565b611e9d565b34801561057f57600080fd5b5061021c61058e366004613589565b611f2f565b600061059e82611fa8565b806105b957506001600160e01b03198216631e05385b60e31b145b92915050565b60008181526004602052604081206001908101548392036105fb5760405162461bcd60e51b81526004016105f2906135a4565b60405180910390fd5b600082815260046020526040902060020154811461062b5760405162461bcd60e51b81526004016105f2906135d1565b60008051602061381d83398151915261064381611fdd565b61064c84611ff9565b50505050565b60008051602061381d83398151915261066a81611fdd565b610675856003612072565b5092356000908152600660205260409020918255600182015560020155565b60008181526004602052604081206001908101548392036106c75760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146106f75760405162461bcd60e51b81526004016105f2906135d1565b60008051602061381d83398151915261070f81611fdd565b6000848152600560205260408082204260069091015551339186917f7e71401fb234876dd20306a330c3ff45c24f7949f014361ed78256f46fa3b7e49190a350505050565b60008051602061381d83398151915261076c81611fdd565b610777826005612072565b5050565b60008281526002602052604090206001015461079681611fdd565b6107a08383612259565b505050565b6000828152600460205260408120600101548391036107d65760405162461bcd60e51b81526004016105f2906135a4565b60008051602061381d8339815191526107ee81611fdd565b6000848152600460205260409020600701805460ff191690556108118342613613565b60009485526004602052604090942060060193909355505050565b6001600160a01b038116331461089c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105f2565b61077782826122fb565b6002600154036108e65760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b600260019081558135600081815260046020819052604082209093015491929190036109245760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146109545760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff16156109ac5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610a1657426000828152600460205260409020600601541015610a165760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415610a8c576000818152600460205260409020600881015460099091015411610a8c5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b610a958461237e565b833560008181526004602081815260408084206005018054338087526007855283872080546001600160a01b0319166001600160a01b0393841617905596865292849052549051630525194b60e31b81529116938492632928ca5892610b0b9291016001600160a01b0391909116815260200190565b6020604051808303816000875af1158015610b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4e9190613626565b60408051828152346020820152600181830152905191925033918835917f83b5042494aa01cc66e2da9984a54e79ac016fa75611b5a5d96dd00e647d5c2f919081900360600190a33415610bc857853560008181526004602081905260409091200154610bc8916001600160a01b039091169034906125f2565b50506001805550505050565b600260015403610c145760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b60026001908155813560008181526004602052604081209092015490916003919003610c525760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114610c825760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff1615610cda5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610d4457426000828152600460205260409020600601541015610d445760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415610dba576000818152600460205260409020600881015460099091015411610dba5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b8335600090815260066020526040902060018101546002909101541115610e235760405162461bcd60e51b815260206004820152601560248201527f50726f6a656374206f7574206f6620746f6b656e73000000000000000000000060448201526064016105f2565b610e2c8461237e565b8335600090815260066020526040812060020180549160019190610e508385613613565b90915550610e629050853582336126ce565b3415610e9457843560008181526004602081905260409091200154610e94916001600160a01b039091169034906125f2565b505060018055505050565b6000818152600460205260408120600190810154839203610ed25760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114610f025760405162461bcd60e51b81526004016105f2906135d1565b600083815260046020526040902060070154839060ff1615610f5a5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610fc457426000828152600460205260409020600601541015610fc45760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b6000818152600460205260409020600901541561103a57600081815260046020526040902060088101546009909101541161103a5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b60008481526005602081905260408220015490036110605761105b84611ff9565b6110b3565b60008481526005602052604090206006015442106110b35760405162461bcd60e51b815260206004820152601060248201526f20bab1ba34b7b71d1034b99037bb32b960811b60448201526064016105f2565b60008481526005602052604081206007015490036111315760008481526005602052604090206001015434101561112c5760405162461bcd60e51b815260206004820152601960248201527f41756374696f6e3a206c6f776572207468616e20666c6f6f720000000000000060448201526064016105f2565b6111f7565b61113a846127a6565b3410156111895760405162461bcd60e51b815260206004820152601d60248201527f41756374696f6e3a206c6f776572207468616e207468726573686f6c6400000060448201526064016105f2565b600084815260056020526040908190206008810154600382015460079092015492516001600160a01b039091169287927f37d83bdf4fb2f45efa2c52ee5283121ebffbab5111da2135b6f6664788c4e044926111ee9290918252602082015260400190565b60405180910390a35b60008481526005602052604090819020600301549051339186917f90d8827c485ebbdd29ba122d9b103d633f81aed34c0d4286e0fa3f97c9b188c291611247913490918252602082015260400190565b60405180910390a360008481526005602052604081206006015461126c90429061363f565b6000868152600560205260409020600201549091508110156112cc576000858152600560205260409020600201546112a590829061363f565b600086815260056020526040812060060180549091906112c6908490613613565b90915550505b600085815260056020526040902060078101805460089092018054349092556001600160a01b03198216331790556001600160a01b0316811580159061131a57506001600160a01b03811615155b1561132a5761132a8183896125f2565b50505050505050565b61133b6127f1565b611345600061284b565b565b6002600154036113875760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b600260019081556000828152600460205260408120820154839291036113bf5760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146113ef5760405162461bcd60e51b81526004016105f2906135d1565b600083815260046020526040902060070154839060ff16156114475760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b600081815260046020526040902060060154156114b1574260008281526004602052604090206006015410156114b15760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b600081815260046020526040902060090154156115275760008181526004602052604090206008810154600990910154116115275760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b6000848152600560205260409020600601544210156115885760405162461bcd60e51b815260206004820152601660248201527f41756374696f6e3a207374696c6c2072756e6e696e670000000000000000000060448201526064016105f2565b6000848152600560205260409020600801546001600160a01b031633146115e75760405162461bcd60e51b815260206004820152601360248201527220bab1ba34b7b71d103737ba103bb4b73732b960691b60448201526064016105f2565b6000848152600460205260408120600801805460019290611609908490613613565b909155505060008481526005602052604090206003015461162c908590336126ce565b6000848152600460208181526040808420909201546005909152912060070154611660916001600160a01b031690866125f2565b5050600180555050565b60008051602061381d83398151915261168281611fdd565b610777826002612072565b60008051602061381d8339815191526116a581611fdd565b610777826004612072565b6002600154036116f05760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b6002600181815582356000818152600460205260408120909201549092910361172b5760405162461bcd60e51b81526004016105f2906135a4565b600082815260046020526040902060020154811461175b5760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff16156117b35760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b6000818152600460205260409020600601541561181d5742600082815260046020526040902060060154101561181d5760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b600081815260046020526040902060090154156118935760008181526004602052604090206008810154600990910154116118935760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b61189c8461237e565b6118ac843560a0860135336126ce565b341561166057833560008181526004602081905260409091200154611660916001600160a01b039091169034906125f2565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461190881611fdd565b61064c8484846125f2565b60008051602061381d83398151915261192b81611fdd565b611936836001612072565b5090356000908152600560209081526040918290208351815590830151600182015590820151600282015560608201516003820155608090910151600490910155565b60008281526002602052604090206001015461199481611fdd565b6107a083836122fb565b6000828152600460205260408120600101548391036119cf5760405162461bcd60e51b81526004016105f2906135a4565b60008051602061381d8339815191526119e781611fdd565b5050600091825260046020526040909120600701805460ff1916911515919091179055565b611a1461303f565b6040518060800160405280611a264290565b815260200160046000858152602001908152602001600020604051806101600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016005820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600682015481526020016007820160009054906101000a900460ff161515151581526020016007820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600882015481526020016009820154815250508152602001600560008581526020019081526020016000206040518060a0016040529081600082016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152505081526020016006600085815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508152509050919050565b600260015403611c9e5760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b60026001908155813560008181526004602052604081209092015490916005919003611cdc5760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114611d0c5760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff1615611d645760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415611dce57426000828152600460205260409020600601541015611dce5760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415611e44576000818152600460205260409020600881015460099091015411611e445760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b611e4d8461237e565b833560009081526004602081905260408083206005015490516340c10f1960e01b8152339281019290925260a087013560248301526001600160a01b0316919082906340c10f1990604401610b0b565b6001600160a01b03828116600090815260076020526040902054163314611f065760405162461bcd60e51b815260206004820152601460248201527f4e6f74206d616e69666f6c642063726561746f7200000000000000000000000060448201526064016105f2565b506001600160a01b0316600090815260076020526040902080546001600160a01b031916905550565b611f376127f1565b6001600160a01b038116611f9c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f2565b611fa58161284b565b50565b60006001600160e01b03198216637965db0b60e01b14806105b957506301ffc9a760e01b6001600160e01b03198316146105b9565b6000546001600160a01b03163314611fa557611fa5813361289b565b6000818152600560208190526040909120429181018290555461201b91613613565b60008281526005602090815260409182902060068101939093556003909201549051908152339183917f3717f5722c27bfa350d6acb590df111e807c4a37337526947bba6f41d50ed54a910160405180910390a350565b8135600090815260046020526040902060010154156120c257813560009081526004602052604090206002015481146120bd5760405162461bcd60e51b81526004016105f2906135d1565b61212b565b81356000818152600460205260408082206003810184905542600182015580546001600160a01b0319163390811782556008820184905560029091018590559051849391927f77691dc8941292708388ee9533f25aae4bf04f75255f8ebe74476ecf0fbb8a9891a45b61213b60c0830160a08401613589565b823560009081526004602090815260409182902060070180546001600160a01b03949094166101000274ffffffffffffffffffffffffffffffffffffffff00199094169390931790925561219491908401908401613589565b82356000908152600460208190526040918290200180546001600160a01b0319166001600160a01b0393909316929092179091556121d89060608401908401613589565b8235600090815260046020526040902060050180546001600160a01b0319166001600160a01b039290921691909117905561221960a0830160808401613652565b8235600090815260046020526040902060078101805460ff1916921515929092179091556060830135600682015560c09092013560099092019190915550565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff166107775760008281526002602090815260408083206001600160a01b03851684529091529020805460ff191660011790556122b73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16156107775760008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040808201356000818152600360205291909120546001600160a01b0316156123d85760405162461bcd60e51b815260206004820152600c60248201526b2ab9b2b2103b37bab1b432b960a11b60448201526064016105f2565b816124067fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706103b78361291b565b6124485760405162461bcd60e51b81526020600482015260136024820152722ab730baba3437b934bd32b21039b4b3b732b960691b60448201526064016105f2565b60608101351561249b57806060013534101561249b5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016105f2565b6080810135156124eb5742816080013510156124eb5760405162461bcd60e51b815260206004820152600f60248201526e159bdd58da195c88195e1c1a5c9959608a1b60448201526064016105f2565b60006124fd6040830160208401613589565b6001600160a01b031614612568573361251c6040830160208401613589565b6001600160a01b0316146125685760405162461bcd60e51b8152602060048201526013602482015272155b985d5d1a1bdc9a5e9959081dd85b1b195d606a1b60448201526064016105f2565b60408084013560009081526003602090815282822080546001600160a01b0319163317905585358252600490529081206008018054600192906125ac908490613613565b90915550506040805190840135815233908435907f7ff232bb2cd170318b140051c7a2895ddefb73bf1fd0ddc88e7374a82026a7cd9060200160405180910390a3505050565b826001600160a01b0316817fc950554de09952505cb4fdc174dd8ab70c4d7cce7f0681efe4d3436895c3e3478460405161262e91815260200190565b60405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612683576040519150601f19603f3d011682016040523d82523d6000602084013e612688565b606091505b505090508061064c5760405162461bcd60e51b81526020600482015260126024820152714661696c656420746f20776974686472617760701b60448201526064016105f2565b604080518381523460208201526000818301529051339185917f83b5042494aa01cc66e2da9984a54e79ac016fa75611b5a5d96dd00e647d5c2f9181900360600190a3600083815260046020819052604091829020600581015460079091015492516323b872dd60e01b81526101009093046001600160a01b0390811692840192909252838216602484015260448301859052169081906323b872dd90606401600060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b5050505050505050565b600081815260056020526040812060048101546007909101546064916127cb9161366d565b6127d59190613684565b6000838152600560205260409020600701546105b99190613613565b6000546001600160a01b031633146113455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610777576128d9816001600160a01b0316601461297b565b6128e483602061297b565b6040516020016128f59291906136ca565b60408051601f198184030181529082905262461bcd60e51b82526105f29160040161373f565b60008061292783612b17565b90506129748161293a60c0860186613772565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bbe92505050565b9392505050565b6060600061298a83600261366d565b612995906002613613565b67ffffffffffffffff8111156129ad576129ad613305565b6040519080825280601f01601f1916602001820160405280156129d7576020820181803683370190505b509050600360fc1b816000815181106129f2576129f26137b9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a2157612a216137b9565b60200101906001600160f81b031916908160001a9053506000612a4584600261366d565b612a50906001613613565b90505b6001811115612ac8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a8457612a846137b9565b1a60f81b828281518110612a9a57612a9a6137b9565b60200101906001600160f81b031916908160001a90535060049490941c93612ac1816137cf565b9050612a53565b5083156129745760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105f2565b60006105b97f49b16aab091ff96d413630f1c58682c749bd07a32e0b8d9c28ca4234ec75861d8335612b4f6040860160208701613589565b604080516020810194909452838101929092526001600160a01b0316606083810191909152908501356080838101919091529085013560a0838101919091529085013560c083015284013560e08201526101000160405160208183030381529060405280519060200120612be2565b6000806000612bcd8585612c30565b91509150612bda81612c75565b509392505050565b60006105b9612bef612e2b565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604103612c665760208301516040840151606085015160001a612c5a87828585612f52565b94509450505050612c6e565b506000905060025b9250929050565b6000816004811115612c8957612c896137e6565b03612c915750565b6001816004811115612ca557612ca56137e6565b03612cf25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f2565b6002816004811115612d0657612d066137e6565b03612d535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f2565b6003816004811115612d6757612d676137e6565b03612dbf5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105f2565b6004816004811115612dd357612dd36137e6565b03611fa55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105f2565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612e8457507f000000000000000000000000000000000000000000000000000000000000000046145b15612eae57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f895750600090506003613036565b8460ff16601b14158015612fa157508460ff16601c14155b15612fb25750600090506004613036565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613006573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661302f57600060019250925050613036565b9150600090505b94509492505050565b6040518060800160405280600081526020016130d460405180610160016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081525090565b81526020016130e161310f565b815260200161310a60405180606001604052806000815260200160008152602001600081525090565b905290565b6040518060a0016040528061314c6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b60006020828403121561318957600080fd5b81356001600160e01b03198116811461297457600080fd5b6000602082840312156131b357600080fd5b5035919050565b600060e082840312156131cc57600080fd5b50919050565b60008060008061014085870312156131e957600080fd5b6131f386866131ba565b9660e08601359650610100860135956101200135945092505050565b600060e0828403121561322157600080fd5b61297483836131ba565b80356001600160a01b038116811461324257600080fd5b919050565b6000806040838503121561325a57600080fd5b8235915061326a6020840161322b565b90509250929050565b6000806040838503121561328657600080fd5b50508035926020909101359150565b6000602082840312156132a757600080fd5b813567ffffffffffffffff8111156132be57600080fd5b6132ca848285016131ba565b949350505050565b6000806000606084860312156132e757600080fd5b6132f08461322b565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b60008082840361018081121561333057600080fd5b61333a85856131ba565b925060a060df198201121561334e57600080fd5b5060405160a0810181811067ffffffffffffffff8211171561338057634e487b7160e01b600052604160045260246000fd5b604090815260e0850135825261010085013560208301526101208501359082015261014084013560608201526101609093013560808401525092909150565b8035801515811461324257600080fd5b600080604083850312156133e257600080fd5b8235915061326a602084016133bf565b60006103008201905082518252602083015161341a6020840182516001600160a01b03169052565b602081015160408401526040810151606084015260608101516080840152608081015161345260a08501826001600160a01b03169052565b5060a08101516001600160a01b03811660c08501525060c081015160e084015260e08101516101006134878186018315159052565b82015190506101206134a3858201836001600160a01b03169052565b8201516101408581019190915290910151610160840152506040830151613524610180840182805180518352602080820151818501526040808301518186015260608084015181870152608093840151848701529184015160a086015283015160c085015282015160e084015201516001600160a01b031661010090910152565b506060929092015180516102a083015260208101516102c0830152604001516102e09091015290565b60008060006060848603121561356257600080fd5b61356b8461322b565b92506135796020850161322b565b9150604084013590509250925092565b60006020828403121561359b57600080fd5b6129748261322b565b602080825260139082015272139bdb995e1a5cdd1a5b99c81c1c9bda9958dd606a1b604082015260600190565b60208082526012908201527157726f6e672070726f6a656374207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156105b9576105b96135fd565b60006020828403121561363857600080fd5b5051919050565b818103818111156105b9576105b96135fd565b60006020828403121561366457600080fd5b612974826133bf565b80820281158282048414176105b9576105b96135fd565b6000826136a157634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156136c15781810151838201526020016136a9565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137028160178501602088016136a6565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516137338160288401602088016136a6565b01602801949350505050565b602081526000825180602084015261375e8160408501602087016136a6565b601f01601f19169190910160400192915050565b6000808335601e1984360301811261378957600080fd5b83018035915067ffffffffffffffff8211156137a457600080fd5b602001915036819003821315612c6e57600080fd5b634e487b7160e01b600052603260045260246000fd5b6000816137de576137de6135fd565b506000190190565b634e487b7160e01b600052602160045260246000fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220d1bb18a4b490a122334463c6acdc76e9f9cd014e6f05eac1a3143d8cef17c43264736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806391d14854116100f7578063bf38c78411610095578063e015571411610064578063e015571414610513578063e84efe6614610540578063f029c2d814610553578063f2fde38b1461057357600080fd5b8063bf38c7841461047d578063d030824a1461049d578063d547741f146104d3578063daff97b5146104f357600080fd5b8063a217fddf116100d1578063a217fddf14610415578063ad5f2bd21461042a578063b1058e9f1461044a578063b5c5f6721461045d57600080fd5b806391d148541461039c5780639aafc6c9146103e2578063a074d568146103f557600080fd5b80633187bf2b116101645780635e2fff491161013e5780635e2fff491461032f57806364a7d7c714610342578063715018a6146103555780638da5cb5b1461036a57600080fd5b80633187bf2b146102dc57806336568abe146102fc5780635b43956e1461031c57600080fd5b8063236ed8f3116101a0578063236ed8f31461023e578063248a9ca31461025e57806324fd862a1461029c5780632f2ff15d146102bc57600080fd5b806301ffc9a7146101c7578063065de74c146101fc5780631b2994441461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004613177565b610593565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b5061021c6102173660046131a1565b6105bf565b005b34801561022a57600080fd5b5061021c6102393660046131d2565b610652565b34801561024a57600080fd5b5061021c6102593660046131a1565b610694565b34801561026a57600080fd5b5061028e6102793660046131a1565b60009081526002602052604090206001015490565b6040519081526020016101f3565b3480156102a857600080fd5b5061021c6102b736600461320f565b610754565b3480156102c857600080fd5b5061021c6102d7366004613247565b61077b565b3480156102e857600080fd5b5061021c6102f7366004613273565b6107a5565b34801561030857600080fd5b5061021c610317366004613247565b61082c565b61021c61032a366004613295565b6108a6565b61021c61033d366004613295565b610bd4565b61021c6103503660046131a1565b610e9f565b34801561036157600080fd5b5061021c611333565b34801561037657600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101f3565b3480156103a857600080fd5b506101e76103b7366004613247565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61021c6103f03660046131a1565b611347565b34801561040157600080fd5b5061021c61041036600461320f565b61166a565b34801561042157600080fd5b5061028e600081565b34801561043657600080fd5b5061021c61044536600461320f565b61168d565b61021c610458366004613295565b6116b0565b34801561046957600080fd5b5061021c6104783660046132d2565b6118de565b34801561048957600080fd5b5061021c61049836600461331b565b611913565b3480156104a957600080fd5b506103846104b83660046131a1565b6003602052600090815260409020546001600160a01b031681565b3480156104df57600080fd5b5061021c6104ee366004613247565b611979565b3480156104ff57600080fd5b5061021c61050e3660046133cf565b61199e565b34801561051f57600080fd5b5061053361052e3660046131a1565b611a0c565b6040516101f391906133f2565b61021c61054e366004613295565b611c5e565b34801561055f57600080fd5b5061021c61056e36600461354d565b611e9d565b34801561057f57600080fd5b5061021c61058e366004613589565b611f2f565b600061059e82611fa8565b806105b957506001600160e01b03198216631e05385b60e31b145b92915050565b60008181526004602052604081206001908101548392036105fb5760405162461bcd60e51b81526004016105f2906135a4565b60405180910390fd5b600082815260046020526040902060020154811461062b5760405162461bcd60e51b81526004016105f2906135d1565b60008051602061381d83398151915261064381611fdd565b61064c84611ff9565b50505050565b60008051602061381d83398151915261066a81611fdd565b610675856003612072565b5092356000908152600660205260409020918255600182015560020155565b60008181526004602052604081206001908101548392036106c75760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146106f75760405162461bcd60e51b81526004016105f2906135d1565b60008051602061381d83398151915261070f81611fdd565b6000848152600560205260408082204260069091015551339186917f7e71401fb234876dd20306a330c3ff45c24f7949f014361ed78256f46fa3b7e49190a350505050565b60008051602061381d83398151915261076c81611fdd565b610777826005612072565b5050565b60008281526002602052604090206001015461079681611fdd565b6107a08383612259565b505050565b6000828152600460205260408120600101548391036107d65760405162461bcd60e51b81526004016105f2906135a4565b60008051602061381d8339815191526107ee81611fdd565b6000848152600460205260409020600701805460ff191690556108118342613613565b60009485526004602052604090942060060193909355505050565b6001600160a01b038116331461089c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105f2565b61077782826122fb565b6002600154036108e65760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b600260019081558135600081815260046020819052604082209093015491929190036109245760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146109545760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff16156109ac5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610a1657426000828152600460205260409020600601541015610a165760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415610a8c576000818152600460205260409020600881015460099091015411610a8c5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b610a958461237e565b833560008181526004602081815260408084206005018054338087526007855283872080546001600160a01b0319166001600160a01b0393841617905596865292849052549051630525194b60e31b81529116938492632928ca5892610b0b9291016001600160a01b0391909116815260200190565b6020604051808303816000875af1158015610b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4e9190613626565b60408051828152346020820152600181830152905191925033918835917f83b5042494aa01cc66e2da9984a54e79ac016fa75611b5a5d96dd00e647d5c2f919081900360600190a33415610bc857853560008181526004602081905260409091200154610bc8916001600160a01b039091169034906125f2565b50506001805550505050565b600260015403610c145760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b60026001908155813560008181526004602052604081209092015490916003919003610c525760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114610c825760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff1615610cda5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610d4457426000828152600460205260409020600601541015610d445760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415610dba576000818152600460205260409020600881015460099091015411610dba5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b8335600090815260066020526040902060018101546002909101541115610e235760405162461bcd60e51b815260206004820152601560248201527f50726f6a656374206f7574206f6620746f6b656e73000000000000000000000060448201526064016105f2565b610e2c8461237e565b8335600090815260066020526040812060020180549160019190610e508385613613565b90915550610e629050853582336126ce565b3415610e9457843560008181526004602081905260409091200154610e94916001600160a01b039091169034906125f2565b505060018055505050565b6000818152600460205260408120600190810154839203610ed25760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114610f025760405162461bcd60e51b81526004016105f2906135d1565b600083815260046020526040902060070154839060ff1615610f5a5760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415610fc457426000828152600460205260409020600601541015610fc45760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b6000818152600460205260409020600901541561103a57600081815260046020526040902060088101546009909101541161103a5760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b60008481526005602081905260408220015490036110605761105b84611ff9565b6110b3565b60008481526005602052604090206006015442106110b35760405162461bcd60e51b815260206004820152601060248201526f20bab1ba34b7b71d1034b99037bb32b960811b60448201526064016105f2565b60008481526005602052604081206007015490036111315760008481526005602052604090206001015434101561112c5760405162461bcd60e51b815260206004820152601960248201527f41756374696f6e3a206c6f776572207468616e20666c6f6f720000000000000060448201526064016105f2565b6111f7565b61113a846127a6565b3410156111895760405162461bcd60e51b815260206004820152601d60248201527f41756374696f6e3a206c6f776572207468616e207468726573686f6c6400000060448201526064016105f2565b600084815260056020526040908190206008810154600382015460079092015492516001600160a01b039091169287927f37d83bdf4fb2f45efa2c52ee5283121ebffbab5111da2135b6f6664788c4e044926111ee9290918252602082015260400190565b60405180910390a35b60008481526005602052604090819020600301549051339186917f90d8827c485ebbdd29ba122d9b103d633f81aed34c0d4286e0fa3f97c9b188c291611247913490918252602082015260400190565b60405180910390a360008481526005602052604081206006015461126c90429061363f565b6000868152600560205260409020600201549091508110156112cc576000858152600560205260409020600201546112a590829061363f565b600086815260056020526040812060060180549091906112c6908490613613565b90915550505b600085815260056020526040902060078101805460089092018054349092556001600160a01b03198216331790556001600160a01b0316811580159061131a57506001600160a01b03811615155b1561132a5761132a8183896125f2565b50505050505050565b61133b6127f1565b611345600061284b565b565b6002600154036113875760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b600260019081556000828152600460205260408120820154839291036113bf5760405162461bcd60e51b81526004016105f2906135a4565b60008281526004602052604090206002015481146113ef5760405162461bcd60e51b81526004016105f2906135d1565b600083815260046020526040902060070154839060ff16156114475760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b600081815260046020526040902060060154156114b1574260008281526004602052604090206006015410156114b15760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b600081815260046020526040902060090154156115275760008181526004602052604090206008810154600990910154116115275760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b6000848152600560205260409020600601544210156115885760405162461bcd60e51b815260206004820152601660248201527f41756374696f6e3a207374696c6c2072756e6e696e670000000000000000000060448201526064016105f2565b6000848152600560205260409020600801546001600160a01b031633146115e75760405162461bcd60e51b815260206004820152601360248201527220bab1ba34b7b71d103737ba103bb4b73732b960691b60448201526064016105f2565b6000848152600460205260408120600801805460019290611609908490613613565b909155505060008481526005602052604090206003015461162c908590336126ce565b6000848152600460208181526040808420909201546005909152912060070154611660916001600160a01b031690866125f2565b5050600180555050565b60008051602061381d83398151915261168281611fdd565b610777826002612072565b60008051602061381d8339815191526116a581611fdd565b610777826004612072565b6002600154036116f05760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b6002600181815582356000818152600460205260408120909201549092910361172b5760405162461bcd60e51b81526004016105f2906135a4565b600082815260046020526040902060020154811461175b5760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff16156117b35760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b6000818152600460205260409020600601541561181d5742600082815260046020526040902060060154101561181d5760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b600081815260046020526040902060090154156118935760008181526004602052604090206008810154600990910154116118935760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b61189c8461237e565b6118ac843560a0860135336126ce565b341561166057833560008181526004602081905260409091200154611660916001600160a01b039091169034906125f2565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461190881611fdd565b61064c8484846125f2565b60008051602061381d83398151915261192b81611fdd565b611936836001612072565b5090356000908152600560209081526040918290208351815590830151600182015590820151600282015560608201516003820155608090910151600490910155565b60008281526002602052604090206001015461199481611fdd565b6107a083836122fb565b6000828152600460205260408120600101548391036119cf5760405162461bcd60e51b81526004016105f2906135a4565b60008051602061381d8339815191526119e781611fdd565b5050600091825260046020526040909120600701805460ff1916911515919091179055565b611a1461303f565b6040518060800160405280611a264290565b815260200160046000858152602001908152602001600020604051806101600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016005820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600682015481526020016007820160009054906101000a900460ff161515151581526020016007820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600882015481526020016009820154815250508152602001600560008581526020019081526020016000206040518060a0016040529081600082016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152505081526020016006600085815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508152509050919050565b600260015403611c9e5760405162461bcd60e51b815260206004820152601f60248201526000805160206137fd83398151915260448201526064016105f2565b60026001908155813560008181526004602052604081209092015490916005919003611cdc5760405162461bcd60e51b81526004016105f2906135a4565b6000828152600460205260409020600201548114611d0c5760405162461bcd60e51b81526004016105f2906135d1565b823560008181526004602052604090206007015460ff1615611d645760405162461bcd60e51b8152602060048201526011602482015270141c9bda9958dd081a5cc81c185d5cd959607a1b60448201526064016105f2565b60008181526004602052604090206006015415611dce57426000828152600460205260409020600601541015611dce5760405162461bcd60e51b815260206004820152600f60248201526e283937b532b1ba1034b99037bb32b960891b60448201526064016105f2565b60008181526004602052604090206009015415611e44576000818152600460205260409020600881015460099091015411611e445760405162461bcd60e51b8152602060048201526016602482015275141c9bda9958dd08185d0818dbdd5b9d081b1a5b5a5d60521b60448201526064016105f2565b611e4d8461237e565b833560009081526004602081905260408083206005015490516340c10f1960e01b8152339281019290925260a087013560248301526001600160a01b0316919082906340c10f1990604401610b0b565b6001600160a01b03828116600090815260076020526040902054163314611f065760405162461bcd60e51b815260206004820152601460248201527f4e6f74206d616e69666f6c642063726561746f7200000000000000000000000060448201526064016105f2565b506001600160a01b0316600090815260076020526040902080546001600160a01b031916905550565b611f376127f1565b6001600160a01b038116611f9c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f2565b611fa58161284b565b50565b60006001600160e01b03198216637965db0b60e01b14806105b957506301ffc9a760e01b6001600160e01b03198316146105b9565b6000546001600160a01b03163314611fa557611fa5813361289b565b6000818152600560208190526040909120429181018290555461201b91613613565b60008281526005602090815260409182902060068101939093556003909201549051908152339183917f3717f5722c27bfa350d6acb590df111e807c4a37337526947bba6f41d50ed54a910160405180910390a350565b8135600090815260046020526040902060010154156120c257813560009081526004602052604090206002015481146120bd5760405162461bcd60e51b81526004016105f2906135d1565b61212b565b81356000818152600460205260408082206003810184905542600182015580546001600160a01b0319163390811782556008820184905560029091018590559051849391927f77691dc8941292708388ee9533f25aae4bf04f75255f8ebe74476ecf0fbb8a9891a45b61213b60c0830160a08401613589565b823560009081526004602090815260409182902060070180546001600160a01b03949094166101000274ffffffffffffffffffffffffffffffffffffffff00199094169390931790925561219491908401908401613589565b82356000908152600460208190526040918290200180546001600160a01b0319166001600160a01b0393909316929092179091556121d89060608401908401613589565b8235600090815260046020526040902060050180546001600160a01b0319166001600160a01b039290921691909117905561221960a0830160808401613652565b8235600090815260046020526040902060078101805460ff1916921515929092179091556060830135600682015560c09092013560099092019190915550565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff166107775760008281526002602090815260408083206001600160a01b03851684529091529020805460ff191660011790556122b73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16156107775760008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040808201356000818152600360205291909120546001600160a01b0316156123d85760405162461bcd60e51b815260206004820152600c60248201526b2ab9b2b2103b37bab1b432b960a11b60448201526064016105f2565b816124067fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706103b78361291b565b6124485760405162461bcd60e51b81526020600482015260136024820152722ab730baba3437b934bd32b21039b4b3b732b960691b60448201526064016105f2565b60608101351561249b57806060013534101561249b5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016105f2565b6080810135156124eb5742816080013510156124eb5760405162461bcd60e51b815260206004820152600f60248201526e159bdd58da195c88195e1c1a5c9959608a1b60448201526064016105f2565b60006124fd6040830160208401613589565b6001600160a01b031614612568573361251c6040830160208401613589565b6001600160a01b0316146125685760405162461bcd60e51b8152602060048201526013602482015272155b985d5d1a1bdc9a5e9959081dd85b1b195d606a1b60448201526064016105f2565b60408084013560009081526003602090815282822080546001600160a01b0319163317905585358252600490529081206008018054600192906125ac908490613613565b90915550506040805190840135815233908435907f7ff232bb2cd170318b140051c7a2895ddefb73bf1fd0ddc88e7374a82026a7cd9060200160405180910390a3505050565b826001600160a01b0316817fc950554de09952505cb4fdc174dd8ab70c4d7cce7f0681efe4d3436895c3e3478460405161262e91815260200190565b60405180910390a36000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612683576040519150601f19603f3d011682016040523d82523d6000602084013e612688565b606091505b505090508061064c5760405162461bcd60e51b81526020600482015260126024820152714661696c656420746f20776974686472617760701b60448201526064016105f2565b604080518381523460208201526000818301529051339185917f83b5042494aa01cc66e2da9984a54e79ac016fa75611b5a5d96dd00e647d5c2f9181900360600190a3600083815260046020819052604091829020600581015460079091015492516323b872dd60e01b81526101009093046001600160a01b0390811692840192909252838216602484015260448301859052169081906323b872dd90606401600060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b5050505050505050565b600081815260056020526040812060048101546007909101546064916127cb9161366d565b6127d59190613684565b6000838152600560205260409020600701546105b99190613613565b6000546001600160a01b031633146113455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610777576128d9816001600160a01b0316601461297b565b6128e483602061297b565b6040516020016128f59291906136ca565b60408051601f198184030181529082905262461bcd60e51b82526105f29160040161373f565b60008061292783612b17565b90506129748161293a60c0860186613772565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bbe92505050565b9392505050565b6060600061298a83600261366d565b612995906002613613565b67ffffffffffffffff8111156129ad576129ad613305565b6040519080825280601f01601f1916602001820160405280156129d7576020820181803683370190505b509050600360fc1b816000815181106129f2576129f26137b9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a2157612a216137b9565b60200101906001600160f81b031916908160001a9053506000612a4584600261366d565b612a50906001613613565b90505b6001811115612ac8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a8457612a846137b9565b1a60f81b828281518110612a9a57612a9a6137b9565b60200101906001600160f81b031916908160001a90535060049490941c93612ac1816137cf565b9050612a53565b5083156129745760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105f2565b60006105b97f49b16aab091ff96d413630f1c58682c749bd07a32e0b8d9c28ca4234ec75861d8335612b4f6040860160208701613589565b604080516020810194909452838101929092526001600160a01b0316606083810191909152908501356080838101919091529085013560a0838101919091529085013560c083015284013560e08201526101000160405160208183030381529060405280519060200120612be2565b6000806000612bcd8585612c30565b91509150612bda81612c75565b509392505050565b60006105b9612bef612e2b565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604103612c665760208301516040840151606085015160001a612c5a87828585612f52565b94509450505050612c6e565b506000905060025b9250929050565b6000816004811115612c8957612c896137e6565b03612c915750565b6001816004811115612ca557612ca56137e6565b03612cf25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f2565b6002816004811115612d0657612d066137e6565b03612d535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f2565b6003816004811115612d6757612d676137e6565b03612dbf5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105f2565b6004816004811115612dd357612dd36137e6565b03611fa55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105f2565b6000306001600160a01b037f000000000000000000000000cac5bc39ea6719bc005883e7d2836af25d94414616148015612e8457507f000000000000000000000000000000000000000000000000000000000000000146145b15612eae57507f2ada28274ec30d072ed4f2800a29b61dd3e3f0588d67bcb0e9a0c9f8b9555b0990565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f88d60cfbc1c43b939820eda924732813bc567d446577e2ffa6416e3c5310ab15828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f895750600090506003613036565b8460ff16601b14158015612fa157508460ff16601c14155b15612fb25750600090506004613036565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613006573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661302f57600060019250925050613036565b9150600090505b94509492505050565b6040518060800160405280600081526020016130d460405180610160016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081525090565b81526020016130e161310f565b815260200161310a60405180606001604052806000815260200160008152602001600081525090565b905290565b6040518060a0016040528061314c6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b60006020828403121561318957600080fd5b81356001600160e01b03198116811461297457600080fd5b6000602082840312156131b357600080fd5b5035919050565b600060e082840312156131cc57600080fd5b50919050565b60008060008061014085870312156131e957600080fd5b6131f386866131ba565b9660e08601359650610100860135956101200135945092505050565b600060e0828403121561322157600080fd5b61297483836131ba565b80356001600160a01b038116811461324257600080fd5b919050565b6000806040838503121561325a57600080fd5b8235915061326a6020840161322b565b90509250929050565b6000806040838503121561328657600080fd5b50508035926020909101359150565b6000602082840312156132a757600080fd5b813567ffffffffffffffff8111156132be57600080fd5b6132ca848285016131ba565b949350505050565b6000806000606084860312156132e757600080fd5b6132f08461322b565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b60008082840361018081121561333057600080fd5b61333a85856131ba565b925060a060df198201121561334e57600080fd5b5060405160a0810181811067ffffffffffffffff8211171561338057634e487b7160e01b600052604160045260246000fd5b604090815260e0850135825261010085013560208301526101208501359082015261014084013560608201526101609093013560808401525092909150565b8035801515811461324257600080fd5b600080604083850312156133e257600080fd5b8235915061326a602084016133bf565b60006103008201905082518252602083015161341a6020840182516001600160a01b03169052565b602081015160408401526040810151606084015260608101516080840152608081015161345260a08501826001600160a01b03169052565b5060a08101516001600160a01b03811660c08501525060c081015160e084015260e08101516101006134878186018315159052565b82015190506101206134a3858201836001600160a01b03169052565b8201516101408581019190915290910151610160840152506040830151613524610180840182805180518352602080820151818501526040808301518186015260608084015181870152608093840151848701529184015160a086015283015160c085015282015160e084015201516001600160a01b031661010090910152565b506060929092015180516102a083015260208101516102c0830152604001516102e09091015290565b60008060006060848603121561356257600080fd5b61356b8461322b565b92506135796020850161322b565b9150604084013590509250925092565b60006020828403121561359b57600080fd5b6129748261322b565b602080825260139082015272139bdb995e1a5cdd1a5b99c81c1c9bda9958dd606a1b604082015260600190565b60208082526012908201527157726f6e672070726f6a656374207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156105b9576105b96135fd565b60006020828403121561363857600080fd5b5051919050565b818103818111156105b9576105b96135fd565b60006020828403121561366457600080fd5b612974826133bf565b80820281158282048414176105b9576105b96135fd565b6000826136a157634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156136c15781810151838201526020016136a9565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137028160178501602088016136a6565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516137338160288401602088016136a6565b01602801949350505050565b602081526000825180602084015261375e8160408501602087016136a6565b601f01601f19169190910160400192915050565b6000808335601e1984360301811261378957600080fd5b83018035915067ffffffffffffffff8211156137a457600080fd5b602001915036819003821315612c6e57600080fd5b634e487b7160e01b600052603260045260246000fd5b6000816137de576137de6135fd565b506000190190565b634e487b7160e01b600052602160045260246000fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220d1bb18a4b490a122334463c6acdc76e9f9cd014e6f05eac1a3143d8cef17c43264736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.