Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
329 WHOANON
Holders
223
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WhoAnonByMetadrop
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; // %@@@@@ @@@@@ // %@@@@@ @@@@@ // @ %@@@@@ @ @@@@@ , // @@@@@@ %@@@@@ @@@@@@@@@ @@@@@ .@@@@@& // /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // #@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@ @@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@# // @@@@@ %@@@@@ @@@@@@@ @@@@@ .@@@@ // %@@@@@ @@@@@ // %@@@@@ @@@@@ // // // who*anon* // // // // @@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@ // p m @@@@@@&&&&&&/ %%&&&%* (&&&@@@@@ // o e @@@@@@&&&&&&&%. /%%* #&&&@@@@@ // w b t @@@@@@&&&&&&&%# ,%&&&@@@@@@ // e y a @@@@@@&&&&&&&&&%%, . (%&&@@@@@@ // r d @@@@@@&&&&&&&&&&&%% (/ #&&&@@@@@@ // e r @@@@@@&&&# &&&&&&&&%%%%* /%&&&@@@@@@ // d o @@@@@@&&&* (&&&&&&&&&%. (&&&@@@@@@@ // p @@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@ // import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; /** * @dev who*anon* ERC-1155 contract */ contract WhoAnonByMetadrop is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply { // ERC-2981: NFT Royalty Standard bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /** * @dev Add name and symbol for consistency with ERC-721 NFTs. Note that ERC-721 stores * these variables on-chain, but as they can only be set on the constructor we may as well * save the storage and have them as constants in the bytecode. You're welcome Ethereum! */ string private constant NAME = "who*anon*"; string private constant SYMBOL = "WHOANON"; /** * @dev Developer address: */ address public developer; address public beneficiary; /** * @dev Price buffer above and below the passed amount of ETH that will be accepted. This function * will be used to set the price for items in the UI, but there is always the possibility of price * fluctuations beween the display and the mint. These parameters determine as an amount per thousand * how high above or below the price the passed amount of ETH can be and still make a valid sale. The * stored values are in the following format: * - priceBufferUp: amount as a proportion of 1,000. For example, if you set this to 1005 you allow the * price to be up to 1005 / 1000 of the actual price, i.e. not exceeding 0.5% greater. * - priceBufferDown: amount as a proportion of 1,000. For example, if you set this to 995 you allow the * price to be up to 995 / 1000 of the actual price i.e. not exceeding 0.5% less. */ uint16 public priceBufferUp; uint16 public priceBufferDown; bool public pausableShutoffProtectionDisabled = false; bool public pausableDisabled = false; bool public publicationShutoffProtectionDisabled = false; bool public publicationDisabled = false; // while we initialize to 0, we will mint the first token at 1 uint256 public latestEdition; /** * @dev ERC-2981 configuration */ address public royaltyReceipientAddress; uint256 public royaltyPercentageBasisPoints; AggregatorV3Interface internal priceFeed; /** * @dev titles struct: */ struct PublishedTitle { // Slot 1 and 2 (at least) string titleURI; // Slot 3, 64 + 128 + 64 = 256 uint64 maxSupply; uint128 priceInUSD; uint64 startTime; // Slot 4, 64 + 64 + 8 + 8 = 144 uint64 endTime; uint64 developerAllocation; bool developerAllocationLocked; bool exists; } /** * @dev map token classes to parameters: */ mapping(uint256 => PublishedTitle) public publishedTitles; mapping(uint256 => uint256) public developerAllocationMinted; /** * @dev Contract events: */ event PriceBufferUpSet(uint256 priceBuffer); event PriceBufferDownSet(uint256 priceBuffer); event YouAreAnon( address account, uint256 tokenId, uint256 quantity, uint256 cost ); event YouAreRedeemedAnon( address account, uint256 tokenId, uint256 quantity, bytes32 hashData, bytes data ); event TitlePublished( uint256 tokenId, string titleURI, string redeemableURI_, uint64 maxSupply, uint128 priceInUSD, uint64 mintStartDate, uint64 mintEndDate, uint64 redeemStartDate, uint64 redeemEndDate, uint64 developerAllocation, bool developerAllocationLocked ); error SupplyExceeded(); error CannotMintRedeemTokens(); error CannotRedeemRedeemTokens(); error InvalidParameters(); error DeveloperAllocationExceeded(); error DeveloperAllocationLocked(); error PublicationIsDisabled(); error PausableIsDisabled(); error PublicationShutoffProtectionIsOn(); error PausableShutoffProtectionIsOn(); /** * @dev Constructor must be passed an array of shareholders for the payment splitter, the first * array holding addresses and the second the corresponding shares. For example, you could have the following: * - payees_ [beneficiaryAddress, developerAddress] * - shares_ [90,10] * In this example the beneficiary address passed in can claim 90% of total ETH, the developer 10% */ constructor( uint16[] memory priceBuffers_, address beneficiary_, address developer_, address priceFeedAddress_, PublishedTitle[] memory firstEditions_ ) ERC1155("") { setPriceBufferUp(priceBuffers_[0]); setPriceBufferDown(priceBuffers_[1]); beneficiary = beneficiary_; developer = developer_; // @dev Contract address for pricefeed data. // MAINNET: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 // GOERLI: 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e priceFeed = AggregatorV3Interface(priceFeedAddress_); _publishFirstEditions(firstEditions_); } modifier whenMintingOpen(uint256 tokenId_) { require(mintingIsOpen(tokenId_), "Minting is not open"); _; } modifier whenMintingClosed(uint256 tokenId_) { require(!mintingIsOpen(tokenId_), "Minting is open"); _; } modifier onlyOwnerOrDeveloper() { require( msg.sender == owner() || msg.sender == developer, "Only owner or developer" ); _; } /** * @dev whenDeveloperAllocationAvailable */ modifier whenDeveloperAllocationAvailable( uint256 tokenId_, uint256 quantity_ ) { if ( (developerAllocationMinted[tokenId_] + quantity_) > publishedTitles[tokenId_].developerAllocation ) { revert DeveloperAllocationExceeded(); } _; } /** * ======================================= * ADMIN FUNCTIONS * ======================================= */ /** * @dev owner can publish new titles: */ function publish( string memory mintableURI_, string memory redeemableURI_, uint64 maxSupply_, uint128 priceInUSD_, uint64 mintableStartTime_, uint64 mintableDurationInHours_, uint64 redeemableStartTime_, uint64 redeemableDurationInHours_, uint64 developerAllocation_, bool developerAllocationLocked_ ) external onlyOwner { if (publicationDisabled) { revert PublicationIsDisabled(); } uint256 mintableEditionTokenId = latestEdition + 1; uint256 redeemableEditionTokenId = mintableEditionTokenId + 1; // Publish the mintable edition: publishedTitles[mintableEditionTokenId].titleURI = mintableURI_; publishedTitles[mintableEditionTokenId].maxSupply = maxSupply_; publishedTitles[mintableEditionTokenId].priceInUSD = priceInUSD_; publishedTitles[mintableEditionTokenId].startTime = mintableStartTime_; publishedTitles[mintableEditionTokenId].endTime = mintableStartTime_ + (mintableDurationInHours_ * 1 hours); publishedTitles[mintableEditionTokenId] .developerAllocation = developerAllocation_; publishedTitles[mintableEditionTokenId] .developerAllocationLocked = developerAllocationLocked_; publishedTitles[mintableEditionTokenId].exists = true; // Publish the redeemable edition: publishedTitles[redeemableEditionTokenId].titleURI = redeemableURI_; publishedTitles[redeemableEditionTokenId].maxSupply = 0; publishedTitles[redeemableEditionTokenId].priceInUSD = 0; publishedTitles[redeemableEditionTokenId].startTime = redeemableStartTime_; publishedTitles[redeemableEditionTokenId].endTime = redeemableStartTime_ + (redeemableDurationInHours_ * 1 hours); publishedTitles[redeemableEditionTokenId].developerAllocation = 0; publishedTitles[redeemableEditionTokenId].developerAllocationLocked = true; publishedTitles[redeemableEditionTokenId].exists = true; latestEdition = redeemableEditionTokenId; emit TitlePublished( mintableEditionTokenId, mintableURI_, redeemableURI_, maxSupply_, priceInUSD_, mintableStartTime_, mintableStartTime_ + (mintableDurationInHours_ * 1 hours), redeemableStartTime_, redeemableStartTime_ + (redeemableDurationInHours_ * 1 hours), developerAllocation_, developerAllocationLocked_ ); } /** * @dev updatePriceFeedAddress */ function updatePriceFeedAddress(address priceFeedAddress_) external onlyOwner { priceFeed = AggregatorV3Interface(priceFeedAddress_); } /** * @dev updateLatestEdition */ function updateLatestEdition(uint32 latestEdition_) external onlyOwner { latestEdition = latestEdition_; } /** * @dev disablePausableShutoffProtection */ function disablePausableShutoffProtection() external onlyOwner { pausableShutoffProtectionDisabled = true; } /** * @dev disablePausable */ function disablePausable() external onlyOwner { if (pausableShutoffProtectionDisabled) { pausableDisabled = true; } else { revert PausableShutoffProtectionIsOn(); } } /** * @dev enablePausableShutoffProtection */ function enablePausableShutoffProtection() external onlyOwner { pausableShutoffProtectionDisabled = false; } /** * @dev disablePausableShutoffProtection */ function disablePublicationShutoffProtection() external onlyOwner { publicationShutoffProtectionDisabled = true; } /** * @dev disablePublication */ function disablePublication() external onlyOwner { if (publicationShutoffProtectionDisabled) { publicationDisabled = true; } else { revert PublicationShutoffProtectionIsOn(); } } /** * @dev enablePublicationShutoffProtection */ function enablePublicationShutoffProtection() external onlyOwner { publicationShutoffProtectionDisabled = false; } /** * @dev owner can reduce supply: */ function reduceSupply(uint256 tokenId_, uint64 maxSupply_) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); // A supply of 0 is unlimited, so under no circumstances can this be a valid update: require( maxSupply_ != 0, "Cannot set to unlimited after initial publication" ); // A supply of 0 is unlimited, so always allow a reduction from unlimited: if (publishedTitles[tokenId_].maxSupply > 0) { require( publishedTitles[tokenId_].maxSupply > maxSupply_, "Supply can only be decreased" ); } publishedTitles[tokenId_].maxSupply = maxSupply_; } /** * @dev updateTokenURI */ function updateTokenURI(uint256 tokenId_, string memory uri_) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); publishedTitles[tokenId_].titleURI = uri_; } /** * @dev updateTokenPriceInUSD */ function updateTokenPriceInUSD(uint256 tokenId_, uint128 tokenPrice_) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); // A supply of 0 is unlimited, so under no circumstances can this be a valid update: publishedTitles[tokenId_].priceInUSD = tokenPrice_; } /** * @dev updateStartTime */ function updateStartTime(uint256 tokenId_, uint64 startTime_) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); publishedTitles[tokenId_].startTime = startTime_; } /** * @dev updateEndTime */ function updateEndTime(uint256 tokenId_, uint64 endTime_) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); publishedTitles[tokenId_].endTime = endTime_; } /** * @dev updateDeveloperAllocation */ function updateDeveloperAllocation( uint256 tokenId_, uint64 developerAlloaction_ ) external onlyOwner { require(publishedTitles[tokenId_].exists, "Token ID does not exist"); if (publishedTitles[tokenId_].developerAllocationLocked) { revert DeveloperAllocationLocked(); } publishedTitles[tokenId_].developerAllocation = developerAlloaction_; } /** * @dev lockDeveloperAllocationForTokenId */ function lockDeveloperAllocationForTokenId(uint256 tokenId_) external onlyOwner { publishedTitles[tokenId_].developerAllocationLocked = true; } /** * @dev updateDeveloper */ function updateDeveloper(address developer_) external onlyOwner { developer = developer_; } /** * @dev updateBeneficiary */ function updateBeneficiary(address beneficiary_) external onlyOwner { beneficiary = beneficiary_; } /** * @dev setPriceBufferUp */ function setPriceBufferUp(uint16 priceBufferUpToSet_) public onlyOwner { priceBufferUp = priceBufferUpToSet_; emit PriceBufferUpSet(priceBufferUp); } /** * @dev setPriceBufferDown */ function setPriceBufferDown(uint16 priceBufferDownToSet_) public onlyOwner { priceBufferDown = priceBufferDownToSet_; emit PriceBufferDownSet(priceBufferDown); } /** * @dev pause */ function pause() public onlyOwner { if (pausableDisabled) { revert PausableIsDisabled(); } _pause(); } /** * @dev unpause */ function unpause() public onlyOwner { _unpause(); } /** * ======================================= * GETTERS * ======================================= */ /** * @dev get Title details */ function getTitleDetails(uint256 _tokenId) external view returns (PublishedTitle memory) { return (publishedTitles[_tokenId]); } function getPriceFeedAddress() external view returns (address) { return (address(priceFeed)); } function mintingIsOpen(uint256 tokenId_) public view returns (bool) { return (block.timestamp >= publishedTitles[tokenId_].startTime && block.timestamp <= publishedTitles[tokenId_].endTime); } function getCurrentRate() external view returns (uint256) { return (uint256(getLatestPrice())); } function getDollarValueInWei(uint256 _dollarValue) external view returns (uint256) { uint256 latestPrice = uint256(getLatestPrice()); return (_performConversion(latestPrice, _dollarValue)); } function getETHPriceForTokenId(uint256 tokenId_) public view returns (uint256 price_) { uint256 latestPrice = uint256(getLatestPrice()); return ( _performConversion(latestPrice, publishedTitles[tokenId_].priceInUSD) ); } function getBuffers() external view onlyOwner returns (uint256 bufferUp_, uint256 bufferDown_) { return (priceBufferUp, priceBufferDown); } /** * @dev Add name, symbol and total supply for consistency with ERC-721 NFTs. */ function name() public pure returns (string memory) { return NAME; } function symbol() public pure returns (string memory) { return SYMBOL; } function totalSupply() public view returns (uint256 totalSupplyForAllCollections_) { for (uint256 i = 1; i <= latestEdition; ) { totalSupplyForAllCollections_ += totalSupply(i); unchecked { i++; } } return totalSupplyForAllCollections_; } /** * Returns the latest USD price to 8DP of 1 ETH */ function getLatestPrice() public view returns (int256) { (, int256 price, , , ) = priceFeed.latestRoundData(); return price; } /** * @dev _publishFirstEditions */ function _publishFirstEditions(PublishedTitle[] memory firstEditions_) internal { for (uint256 i = 0; i < firstEditions_.length; ) { publishedTitles[i + 1] = firstEditions_[i]; unchecked { i++; } } for (uint256 i = 0; i < firstEditions_.length; ) { emit TitlePublished( i + 1, // unredeemed edition firstEditions_[i].titleURI, firstEditions_[i + 1].titleURI, firstEditions_[i].maxSupply, firstEditions_[i].priceInUSD, firstEditions_[i].startTime, firstEditions_[i].endTime, firstEditions_[i + 1].startTime, firstEditions_[i + 1].endTime, firstEditions_[i].developerAllocation, firstEditions_[i].developerAllocationLocked ); unchecked { i += 2; } } // Update the latest Edition number: latestEdition = firstEditions_.length; } /** * @dev perform price conversion USD to Wei at the prescribed number of significant figures (i.e. DP in ETH) */ function _performConversion(uint256 _price, uint256 _value) internal pure returns (uint256 convertedValue) { require(_price > 0 && _price < 9999999999999, "Pricing Error"); // The USD figure from the price feed is one eth in USD to 8 DP. We need the value of one dollar in wei/ // The price feed has 8DP so lets add that exponent to our wei figure to give us the value of $1 in wei uint256 oneUSDInWei = ((10**26) / _price); // 2) Mutiply our dollar value by that to get our value in wei: uint256 valueInWei = oneUSDInWei * _value; // 3) And then roundup that number to 4DP of eth by removing 10**14 digits, adding 1, then multiplying by 10**14: valueInWei = ((valueInWei / (10**14)) + 1) * (10**14); return (valueInWei); } /** * @dev This function is called from the UI to mint NFTs for the user. */ function iAmAnon(uint256 tokenId_, uint256 quantity_) external payable whenMintingOpen(tokenId_) whenNotPaused { require(quantity_ != 0, "Order must be for an item"); // Can only mint mintables, i.e. ODD numbered token IDs. The even equivalent (minted 1 = redeemed 2 etc) // must be obtained on redemption of the minted if (!_isMintableToken(tokenId_)) { revert CannotMintRedeemTokens(); } // Check that we aren't requesting more than is available: if (_orderExceedsSupply(tokenId_, quantity_)) { revert SupplyExceeded(); } // Calculate the required price for this order: uint256 orderPrice = _priceOrder(tokenId_, quantity_); // Check the payment is correct: _checkPaymentToPrice(msg.value, orderPrice); // To reach here the price and quantity check must have passed. Mint the items: _mint(msg.sender, tokenId_, quantity_, ""); emit YouAreAnon(msg.sender, tokenId_, quantity_, msg.value); } /** * @dev This function is called on redemption */ function redeemAnon( uint256 tokenId_, uint256 quantity_, bytes32 dataHash_, bytes memory data_ ) external whenMintingOpen(tokenId_ + 1) whenNotPaused { if (_isRedemptionToken(tokenId_)) { revert CannotRedeemRedeemTokens(); } require(quantity_ != 0, "Redemption must be for an item"); burn(msg.sender, tokenId_, quantity_); // All good so far? OK, mint their redeption equivalents _mint(msg.sender, (tokenId_ + 1), quantity_, ""); emit YouAreRedeemedAnon(msg.sender, tokenId_, quantity_, dataHash_, data_); } /** * @dev _orderExceedsSupply */ function _orderExceedsSupply(uint256 tokenId_, uint256 quantity_) internal view returns (bool) { // Note a supply set to 0 is unlimited: uint256 maxSupply = publishedTitles[tokenId_].maxSupply; if ((maxSupply != 0) && ((quantity_ + totalSupply(tokenId_)) > maxSupply)) { return true; } else { return false; } } /** * @dev _isMintableToken */ function _isMintableToken(uint256 tokenId_) internal pure returns (bool) { return (tokenId_ % 2 != 0); } /** * @dev _isRedepmtionToken */ function _isRedemptionToken(uint256 tokenId_) internal pure returns (bool) { return (tokenId_ % 2 == 0); } /** * @dev Get the current price of this order in the same way that it will have been assembled in the UI, * i.e. get the current price of each token type in ETH (including the rounding to 4DP of ETH) and then * multiply that by the total quantity ordered. */ function _priceOrder(uint256 tokenId_, uint256 quantity_) internal view returns (uint256 price) { uint256 orderCostInETH = 0; uint256 unitPrice = getETHPriceForTokenId(tokenId_); orderCostInETH = (unitPrice * quantity_); return (orderCostInETH); } /** * @dev mintDeveloperAllocation */ function mintDeveloperAllocation(uint256 tokenId_, uint256 quantity_) external payable onlyOwnerOrDeveloper whenDeveloperAllocationAvailable(tokenId_, quantity_) { _mint(developer, tokenId_, quantity_, ""); developerAllocationMinted[tokenId_] += quantity_; } /** * @dev Determine if the passed cost is within bounds of current price: */ function _checkPaymentToPrice(uint256 _passedETH, uint256 _orderPrice) internal view { // Establish upper and lower bands of price buffer and check uint256 orderPriceLower = (_orderPrice * priceBufferDown) / 1000; require(_passedETH >= orderPriceLower, "Insufficient ETH passed for order"); uint256 orderPriceUpper = (_orderPrice * priceBufferUp) / 1000; require(_passedETH <= orderPriceUpper, "Too much ETH passed for order"); } /** * @dev */ function setRoyaltyPercentageBasisPoints( uint256 royaltyPercentageBasisPoints_ ) external onlyOwner { royaltyPercentageBasisPoints = royaltyPercentageBasisPoints_; } /** * @dev */ function setRoyaltyReceipientAddress( address payable royaltyReceipientAddress_ ) external onlyOwner { royaltyReceipientAddress = royaltyReceipientAddress_; } /** * @dev */ function royaltyInfo(uint256, uint256 salePrice_) external view returns (address receiver, uint256 royaltyAmount) { uint256 royalty = (salePrice_ * royaltyPercentageBasisPoints) / 10000; return (royaltyReceipientAddress, royalty); } /** * @dev */ function supportsInterface(bytes4 interfaceId) public view override(ERC1155) returns (bool) { return interfaceId == _INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } /** * ======================================= * STANDARD FUNCTIONS * ======================================= */ function uri(uint256 _tokenId) public view virtual override returns (string memory) { return publishedTitles[_tokenId].titleURI; } /** * * @dev withdrawContractBalance: onlyOwner withdrawal to the beneficiary address * */ function withdrawContractBalance() external onlyOwner { (bool success, ) = beneficiary.call{value: address(this).balance}(""); require(success, "Transfer failed"); } /** * * @dev withdrawETH: onlyOwner withdrawal to the beneficiary address, sending * the amount to withdraw as an argument * */ function withdrawETH(uint256 amount_) external onlyOwner { (bool success, ) = beneficiary.call{value: amount_}(""); require(success, "Transfer failed"); } /** * @dev The fallback function is executed on a call to the contract if * none of the other functions match the given function signature. */ fallback() external payable { revert(); } /** * @dev revert any random ETH: */ receive() external payable { revert(); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) whenNotPaused { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// 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 (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// 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 (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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint16[]","name":"priceBuffers_","type":"uint16[]"},{"internalType":"address","name":"beneficiary_","type":"address"},{"internalType":"address","name":"developer_","type":"address"},{"internalType":"address","name":"priceFeedAddress_","type":"address"},{"components":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct WhoAnonByMetadrop.PublishedTitle[]","name":"firstEditions_","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotMintRedeemTokens","type":"error"},{"inputs":[],"name":"CannotRedeemRedeemTokens","type":"error"},{"inputs":[],"name":"DeveloperAllocationExceeded","type":"error"},{"inputs":[],"name":"DeveloperAllocationLocked","type":"error"},{"inputs":[],"name":"InvalidParameters","type":"error"},{"inputs":[],"name":"PausableIsDisabled","type":"error"},{"inputs":[],"name":"PausableShutoffProtectionIsOn","type":"error"},{"inputs":[],"name":"PublicationIsDisabled","type":"error"},{"inputs":[],"name":"PublicationShutoffProtectionIsOn","type":"error"},{"inputs":[],"name":"SupplyExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceBuffer","type":"uint256"}],"name":"PriceBufferDownSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceBuffer","type":"uint256"}],"name":"PriceBufferUpSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"titleURI","type":"string"},{"indexed":false,"internalType":"string","name":"redeemableURI_","type":"string"},{"indexed":false,"internalType":"uint64","name":"maxSupply","type":"uint64"},{"indexed":false,"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"mintStartDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"mintEndDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"redeemStartDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"redeemEndDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"indexed":false,"internalType":"bool","name":"developerAllocationLocked","type":"bool"}],"name":"TitlePublished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"YouAreAnon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hashData","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"YouAreRedeemedAnon","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"developerAllocationMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePausable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePausableShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicationShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePausableShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicationShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuffers","outputs":[{"internalType":"uint256","name":"bufferUp_","type":"uint256"},{"internalType":"uint256","name":"bufferDown_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dollarValue","type":"uint256"}],"name":"getDollarValueInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getETHPriceForTokenId","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTitleDetails","outputs":[{"components":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct WhoAnonByMetadrop.PublishedTitle","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"iAmAnon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestEdition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"lockDeveloperAllocationForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"mintDeveloperAllocation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"mintingIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableShutoffProtectionDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceBufferDown","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceBufferUp","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicationDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicationShutoffProtectionDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"mintableURI_","type":"string"},{"internalType":"string","name":"redeemableURI_","type":"string"},{"internalType":"uint64","name":"maxSupply_","type":"uint64"},{"internalType":"uint128","name":"priceInUSD_","type":"uint128"},{"internalType":"uint64","name":"mintableStartTime_","type":"uint64"},{"internalType":"uint64","name":"mintableDurationInHours_","type":"uint64"},{"internalType":"uint64","name":"redeemableStartTime_","type":"uint64"},{"internalType":"uint64","name":"redeemableDurationInHours_","type":"uint64"},{"internalType":"uint64","name":"developerAllocation_","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked_","type":"bool"}],"name":"publish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"publishedTitles","outputs":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"},{"internalType":"bytes32","name":"dataHash_","type":"bytes32"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"redeemAnon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"maxSupply_","type":"uint64"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentageBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"priceBufferDownToSet_","type":"uint16"}],"name":"setPriceBufferDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"priceBufferUpToSet_","type":"uint16"}],"name":"setPriceBufferUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyPercentageBasisPoints_","type":"uint256"}],"name":"setRoyaltyPercentageBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"royaltyReceipientAddress_","type":"address"}],"name":"setRoyaltyReceipientAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"totalSupplyForAllCollections_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary_","type":"address"}],"name":"updateBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"developer_","type":"address"}],"name":"updateDeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"developerAlloaction_","type":"uint64"}],"name":"updateDeveloperAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"endTime_","type":"uint64"}],"name":"updateEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"latestEdition_","type":"uint32"}],"name":"updateLatestEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"priceFeedAddress_","type":"address"}],"name":"updatePriceFeedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"startTime_","type":"uint64"}],"name":"updateStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint128","name":"tokenPrice_","type":"uint128"}],"name":"updateTokenPriceInUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526006805463ffffffff60c01b191690553480156200002157600080fd5b50604051620050cd380380620050cd8339810160408190526200004491620008b7565b6040805160208101909152600081526200005e8162000127565b506200006a3362000139565b6003805460ff60a01b191690558451620000a6908690600090620000925762000092620009c8565b60200260200101516200018b60201b60201c565b620000d485600181518110620000c057620000c0620009c8565b6020026020010151620001ef60201b60201c565b600680546001600160a01b038087166001600160a01b03199283161790925560058054868416908316179055600a8054928516929091169190911790556200011c816200024d565b505050505062000c21565b600262000135828262000a6d565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200019562000561565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b008251906020015b60405180910390a150565b620001f962000561565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a90602001620001e4565b60005b815181101562000380578181815181106200026f576200026f620009c8565b6020026020010151600b60008360016200028a919062000b39565b8152602081019190915260400160002081518190620002aa908262000a6d565b50602082015160018281018054604086015160608701516001600160401b039586166001600160c01b031990931692909217680100000000000000006001600160801b039092168202176001600160c01b0316600160c01b928616929092029190911790915560808501516002909401805460a087015160c088015160e0909801519686166001600160801b03199092169190911794169091029290921761ffff60801b1916600160801b9415159490940260ff60881b191693909317600160881b921515929092029190911790550162000250565b5060005b81518110156200055a577f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06620003bc82600162000b39565b838381518110620003d157620003d1620009c8565b60200260200101516000015184846001620003ed919062000b39565b81518110620004005762000400620009c8565b602002602001015160000151858581518110620004215762000421620009c8565b602002602001015160200151868681518110620004425762000442620009c8565b602002602001015160400151878781518110620004635762000463620009c8565b602002602001015160600151888881518110620004845762000484620009c8565b60200260200101516080015189896001620004a0919062000b39565b81518110620004b357620004b3620009c8565b6020026020010151606001518a8a6001620004cf919062000b39565b81518110620004e257620004e2620009c8565b6020026020010151608001518b8b81518110620005035762000503620009c8565b602002602001015160a001518c8c81518110620005245762000524620009c8565b602002602001015160c00151604051620005499b9a9998979695949392919062000b8f565b60405180910390a160020162000384565b5051600755565b6003546001600160a01b03163314620005c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715620005fe57620005fe620005c2565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200062f576200062f620005c2565b604052919050565b60006001600160401b03821115620006535762000653620005c2565b5060051b60200190565b80516001600160a01b03811681146200067557600080fd5b919050565b60005b83811015620006975781810151838201526020016200067d565b50506000910152565b600082601f830112620006b257600080fd5b81516001600160401b03811115620006ce57620006ce620005c2565b620006e3601f8201601f191660200162000604565b818152846020838601011115620006f957600080fd5b6200070c8260208301602087016200067a565b949350505050565b80516001600160401b03811681146200067557600080fd5b80516001600160801b03811681146200067557600080fd5b805180151581146200067557600080fd5b600082601f8301126200076757600080fd5b81516020620007806200077a8362000637565b62000604565b82815260059290921b84018101918181019086841115620007a057600080fd5b8286015b84811015620008ac5780516001600160401b0380821115620007c65760008081fd5b90880190610100828b03601f1901811315620007e25760008081fd5b620007ec620005d8565b8784015183811115620007ff5760008081fd5b6200080f8d8a83880101620006a0565b825250604092506200082383850162000714565b888201526060620008368186016200072c565b84830152608093506200084b84860162000714565b9082015260a06200085e85820162000714565b8483015260c093506200087384860162000714565b9082015260e06200088685820162000744565b848301526200089783860162000744565b908201528652505050918301918301620007a4565b509695505050505050565b600080600080600060a08688031215620008d057600080fd5b85516001600160401b0380821115620008e857600080fd5b818801915088601f830112620008fd57600080fd5b81516020620009106200077a8362000637565b82815260059290921b8401810191818101908c8411156200093057600080fd5b948201945b838610156200096257855161ffff81168114620009525760008081fd5b8252948201949082019062000935565b99506200097390508a82016200065d565b9750505062000985604089016200065d565b945062000995606089016200065d565b93506080880151915080821115620009ac57600080fd5b50620009bb8882890162000755565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009f357607f821691505b60208210810362000a1457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a6857600081815260208120601f850160051c8101602086101562000a435750805b601f850160051c820191505b8181101562000a645782815560010162000a4f565b5050505b505050565b81516001600160401b0381111562000a895762000a89620005c2565b62000aa18162000a9a8454620009de565b8462000a1a565b602080601f83116001811462000ad9576000841562000ac05750858301515b600019600386901b1c1916600185901b17855562000a64565b600085815260208120601f198616915b8281101562000b0a5788860151825594840194600190910190840162000ae9565b508582101562000b295787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000b5b57634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845262000b7b8160208601602086016200067a565b601f01601f19169290920160200192915050565b60006101608d835280602084015262000bab8184018e62000b61565b9050828103604084015262000bc1818d62000b61565b6001600160401b039b8c1660608501526001600160801b039a909a166080840152505095881660a087015293871660c086015291861660e08501528516610100840152909316610120820152911515610140909201919091529392505050565b61449c8062000c316000396000f3fe6080604052600436106104075760003560e01c80638da5cb5b11610213578063e6aefa1b11610123578063f242432a116100ab578063f7551ef11161007a578063f7551ef114610cb1578063f7fb07b014610cd1578063fb0f94a414610ce6578063fc2b2da414610cfb578063feb8012314610d1c57600080fd5b8063f242432a14610c3c578063f2fde38b14610c5c578063f40a19cf14610c7c578063f5298aca14610c9157600080fd5b8063ea075e9c116100f2578063ea075e9c14610b83578063ea6be86c14610ba5578063ec6cd1e214610bd2578063f088302e14610bf2578063f14210a614610c1c57600080fd5b8063e6aefa1b14610ac5578063e8648b0b14610ae5578063e985e9c514610b1a578063e9be474414610b6357600080fd5b8063b52ddfbc116101a6578063c9732bc811610175578063c9732bc814610a30578063ca4b208b14610a50578063d56a7cd614610a70578063e042e98c14610a90578063e19292e514610ab057600080fd5b8063b52ddfbc1461099a578063bd85b039146109ba578063bfab3db9146109e7578063c441443b146109fc57600080fd5b80639b3a069b116101e25780639b3a069b146109315780639dd3417c14610951578063a22cb46514610967578063ac2ba0891461098757600080fd5b80638da5cb5b146108a15780638e15f473146108bf578063939e136e146108d457806395d89b411461090157600080fd5b80632a58fe0e11610319578063543c6056116102a15780636b20c454116102705780636b20c454146108175780636f2b6828146108375780636fa19fee14610857578063715018a6146108775780638456cb591461088c57600080fd5b8063543c6056146107b85780635c975abb146107cd578063641e7e6e146107ec5780636586b2071461080257600080fd5b80633f4ba83a116102e85780633f4ba83a14610707578063453709811461071c5780634e1273f41461073c5780634f558e79146107695780634fd514981461079857600080fd5b80632a58fe0e146106915780632eb2c2d6146106a657806335941b9c146106c657806338af3eed146106e757600080fd5b80630f0f30b21161039c5780631a9c67861161036b5780631a9c6786146105de5780631b75e482146105ff578063282048cc1461061f57806329e11186146106325780632a55205a1461065257600080fd5b80630f0f30b21461055757806316f9f5b31461058957806318160ddd146105a957806318e97fd1146105be57600080fd5b806306358427116103d857806306358427146104bc57806306fdde03146104dc5780630aaffd2a146105175780630e89341c1461053757600080fd5b80629ee39c14610416578062fdd58e1461043857806301ffc9a71461046b57806302a1ec971461049b57600080fd5b3661041157600080fd5b600080fd5b34801561042257600080fd5b5061043661043136600461343c565b610d3c565b005b34801561044457600080fd5b50610458610453366004613459565b610d66565b6040519081526020015b60405180910390f35b34801561047757600080fd5b5061048b61048636600461349b565b610dff565b6040519015158152602001610462565b3480156104a757600080fd5b5060065461048b90600160d81b900460ff1681565b3480156104c857600080fd5b506104366104d73660046134b8565b610e24565b3480156104e857600080fd5b506040805180820190915260098152683bb4379530b737b71560b91b60208201525b6040516104629190613522565b34801561052357600080fd5b5061043661053236600461343c565b610e86565b34801561054357600080fd5b5061050a610552366004613535565b610eb0565b34801561056357600080fd5b50600a546001600160a01b03165b6040516001600160a01b039091168152602001610462565b34801561059557600080fd5b506104366105a4366004613603565b610f52565b3480156105b557600080fd5b5061045861109d565b3480156105ca57600080fd5b506104366105d936600461365c565b6110d2565b3480156105ea57600080fd5b5060065461048b90600160c01b900460ff1681565b34801561060b57600080fd5b5061043661061a3660046136be565b61112f565b61043661062d3660046136ea565b6111b9565b34801561063e57600080fd5b5061043661064d366004613723565b61132b565b34801561065e57600080fd5b5061067261066d3660046136ea565b6113a3565b604080516001600160a01b039093168352602083019190915201610462565b34801561069d57600080fd5b506104366113da565b3480156106b257600080fd5b506104366106c13660046137da565b6113f7565b3480156106d257600080fd5b5060065461048b90600160c81b900460ff1681565b3480156106f357600080fd5b50600654610571906001600160a01b031681565b34801561071357600080fd5b50610436611443565b34801561072857600080fd5b50600854610571906001600160a01b031681565b34801561074857600080fd5b5061075c610757366004613887565b611455565b6040516104629190613984565b34801561077557600080fd5b5061048b610784366004613535565b600090815260046020526040902054151590565b3480156107a457600080fd5b506104586107b3366004613535565b61157e565b3480156107c457600080fd5b506104366115c0565b3480156107d957600080fd5b50600354600160a01b900460ff1661048b565b3480156107f857600080fd5b5061045860075481565b34801561080e57600080fd5b506104366115d7565b34801561082357600080fd5b50610436610832366004613997565b6115ee565b34801561084357600080fd5b50610436610852366004613a0c565b611631565b34801561086357600080fd5b5061043661087236600461343c565b611644565b34801561088357600080fd5b5061043661166e565b34801561089857600080fd5b50610436611680565b3480156108ad57600080fd5b506003546001600160a01b0316610571565b3480156108cb57600080fd5b506104586116bb565b3480156108e057600080fd5b506104586108ef366004613535565b600c6020526000908152604090205481565b34801561090d57600080fd5b506040805180820190915260078152662ba427a0a727a760c91b602082015261050a565b34801561093d57600080fd5b5061043661094c366004613723565b611740565b34801561095d57600080fd5b5061045860095481565b34801561097357600080fd5b50610436610982366004613a42565b6117b2565b6104366109953660046136ea565b6117c1565b3480156109a657600080fd5b506104366109b536600461343c565b6118e0565b3480156109c657600080fd5b506104586109d5366004613535565b60009081526004602052604090205490565b3480156109f357600080fd5b5061043661190a565b348015610a0857600080fd5b50610a1c610a17366004613535565b6119aa565b604051610462989796959493929190613a6e565b348015610a3c57600080fd5b50610436610a4b366004613ad5565b611a9a565b348015610a5c57600080fd5b50600554610571906001600160a01b031681565b348015610a7c57600080fd5b50610458610a8b366004613535565b611d06565b348015610a9c57600080fd5b50610436610aab366004613535565b611d1d565b348015610abc57600080fd5b50610436611d2a565b348015610ad157600080fd5b5061048b610ae0366004613535565b611d72565b348015610af157600080fd5b50600654610b0790600160b01b900461ffff1681565b60405161ffff9091168152602001610462565b348015610b2657600080fd5b5061048b610b35366004613bbf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610436610b7e366004613723565b611dc0565b348015610b8f57600080fd5b50600654610b0790600160a01b900461ffff1681565b348015610bb157600080fd5b50610bc5610bc0366004613535565b611e7c565b6040516104629190613bf8565b348015610bde57600080fd5b50610436610bed3660046134b8565b611fe6565b348015610bfe57600080fd5b50610c07612041565b60408051928352602083019190915201610462565b348015610c2857600080fd5b50610436610c37366004613535565b61206a565b348015610c4857600080fd5b50610436610c57366004613ca8565b612107565b348015610c6857600080fd5b50610436610c7736600461343c565b61214c565b348015610c8857600080fd5b506104366121c2565b348015610c9d57600080fd5b50610436610cac366004613d10565b61220a565b348015610cbd57600080fd5b50610436610ccc366004613723565b61224d565b348015610cdd57600080fd5b506104586123be565b348015610cf257600080fd5b506104366123cd565b348015610d0757600080fd5b5060065461048b90600160d01b900460ff1681565b348015610d2857600080fd5b50610436610d37366004613535565b6123ea565b610d44612416565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038316610dd65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b0319821663152a902d60e11b1480610df95750610df982612470565b610e2c612416565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a906020015b60405180910390a150565b610e8e612416565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60205260409020805460609190610ecd90613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef990613d45565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b50505050509050919050565b610f5d846001613d95565b610f6681611d72565b610fa85760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b610fb06124c0565b610fb98561250d565b15610fd75760405163cc3ea67160e01b815260040160405180910390fd5b836000036110275760405162461bcd60e51b815260206004820152601e60248201527f526564656d7074696f6e206d75737420626520666f7220616e206974656d00006044820152606401610dcd565b61103233868661220a565b61105733611041876001613d95565b8660405180602001604052806000815250612521565b7fb939ee10986cac83ee56f03462ee8ebd7d5d664696db574c5f42eb730b31c90f338686868660405161108e959493929190613da8565b60405180910390a15050505050565b600060015b60075481116110ce576000818152600460205260409020546110c49083613d95565b91506001016110a2565b5090565b6110da612416565b6000828152600b6020526040902060020154600160881b900460ff166111125760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902061112a8282613e63565b505050565b611137612416565b6000828152600b6020526040902060020154600160881b900460ff1661116f5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160801b03909216600160401b0277ffffffffffffffffffffffffffffffff000000000000000019909216919091179055565b816111c381611d72565b6112055760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b61120d6124c0565b8160000361125d5760405162461bcd60e51b815260206004820152601960248201527f4f72646572206d75737420626520666f7220616e206974656d000000000000006044820152606401610dcd565b61126683612644565b61128357604051631afe061f60e21b815260040160405180910390fd5b61128d8383612659565b156112ab57604051637d3d824960e01b815260040160405180910390fd5b60006112b784846126bb565b90506112c334826126dd565b6112de33858560405180602001604052806000815250612521565b60408051338152602081018690529081018490523460608201527f14108c40853eafebc8d570ba3c24ab69eca575937c341a1bf4e6ab5c4f4e45b19060800160405180910390a150505050565b611333612416565b6000828152600b6020526040902060020154600160881b900460ff1661136b5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6000806000612710600954856113b99190613f22565b6113c39190613f4f565b6008546001600160a01b0316969095509350505050565b6113e2612416565b6006805460ff60c01b1916600160c01b179055565b6001600160a01b03851633148061141357506114138533610b35565b61142f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c85858585856127e3565b5050505050565b61144b612416565b61145361298d565b565b606081518351146114ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610dcd565b600083516001600160401b038111156114d5576114d561354e565b6040519080825280602002602001820160405280156114fe578160200160208202803683370190505b50905060005b84518110156115765761154985828151811061152257611522613fb1565b602002602001015185838151811061153c5761153c613fb1565b6020026020010151610d66565b82828151811061155b5761155b613fb1565b602090810291909101015261156f81613fc7565b9050611504565b509392505050565b6000806115896116bb565b6000848152600b60205260409020600101549091506115b9908290600160401b90046001600160801b03166129e2565b9392505050565b6115c8612416565b6006805460ff60c01b19169055565b6115df612416565b6006805460ff60d01b19169055565b6001600160a01b03831633148061160a575061160a8333610b35565b6116265760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612a86565b611639612416565b63ffffffff16600755565b61164c612416565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611676612416565b6114536000612c22565b611688612416565b600654600160c81b900460ff16156116b3576040516311f9636d60e21b815260040160405180910390fd5b611453612c74565b600080600a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117359190613ffa565b509195945050505050565b611748612416565b6000828152600b6020526040902060020154600160881b900460ff166117805760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b6020526040909120600201805467ffffffffffffffff19166001600160401b03909216919091179055565b6117bd338383612cb7565b5050565b6003546001600160a01b03163314806117e457506005546001600160a01b031633145b6118305760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e6572206f7220646576656c6f7065720000000000000000006044820152606401610dcd565b6000828152600b6020908152604080832060020154600c9092529091205483918391600160401b9091046001600160401b03169061186f908390613d95565b111561188e576040516308345b1d60e21b815260040160405180910390fd5b6005546040805160208101909152600081526118b7916001600160a01b03169086908690612521565b6000848152600c6020526040812080548592906118d5908490613d95565b909155505050505050565b6118e8612416565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611912612416565b6006546040516000916001600160a01b03169047908381818185875af1925050503d806000811461195f576040519150601f19603f3d011682016040523d82523d6000602084013e611964565b606091505b50509050806119a75760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b50565b600b602052600090815260409020805481906119c590613d45565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613d45565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b50505050600183015460029093015491926001600160401b0380821693600160401b8084046001600160801b03169450600160c01b909304821692828216929082041690600160801b810460ff90811691600160881b90041688565b611aa2612416565b600654600160d81b900460ff1615611acd576040516312c44b6d60e01b815260040160405180910390fd5b60006007546001611ade9190613d95565b90506000611aed826001613d95565b6000838152600b60205260409020909150611b088d82613e63565b506000828152600b6020526040902060010180546001600160401b038a8116600160c01b026001600160c01b036001600160801b038e16600160401b026001600160c01b0319909416928f16929092179290921716179055611b6c87610e1061404a565b611b769089614075565b6000838152600b6020526040808220600201805460ff60881b19881515600160801b021661ffff60801b196001600160401b038b8116600160401b026fffffffffffffffffffffffffffffffff19909416971696909617919091179490941693909317600160881b1790925582815220611bf08c82613e63565b506000818152600b602052604090206001600160401b038716600160c01b02600190910155611c2185610e1061404a565b611c2b9087614075565b6000828152600b60205260409020600201805460ff60881b1970ffffffffffffffffffffffffffffffffff199091166001600160401b039390931692909217600160801b1791909116600160881b17905560078190557f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06828d8d8d8d8d611cb48e610e1061404a565b8f611cbf9190614075565b8d611ccc8e610e1061404a565b8f611cd79190614075565b8d8d604051611cf09b9a99989796959493929190614095565b60405180910390a1505050505050505050505050565b600080611d116116bb565b90506115b981846129e2565b611d25612416565b600955565b611d32612416565b600654600160c01b900460ff1615611d59576006805460ff60c81b1916600160c81b179055565b604051636607e9a360e11b815260040160405180910390fd5b6000818152600b6020526040812060010154600160c01b90046001600160401b03164210801590610df95750506000908152600b60205260409020600201546001600160401b031642111590565b611dc8612416565b6000828152600b6020526040902060020154600160881b900460ff16611e005760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902060020154600160801b900460ff1615611e3a5760405163d701498160e01b815260040160405180910390fd5b6000918252600b602052604090912060020180546001600160401b03909216600160401b026fffffffffffffffff000000000000000019909216919091179055565b6040805161010081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c0810182905260e08101919091526000828152600b60205260409081902081516101008101909252805482908290611ee690613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1290613d45565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b505050918352505060018201546001600160401b038082166020840152600160401b8083046001600160801b03166040850152600160c01b90920481166060840152600290930154808416608084015290810490921660a0820152600160801b820460ff908116151560c0830152600160881b909204909116151560e09091015292915050565b611fee612416565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b00825190602001610e7b565b60008061204c612416565b505060065461ffff600160a01b8204811691600160b01b9004169091565b612072612416565b6006546040516000916001600160a01b03169083908381818185875af1925050503d80600081146120bf576040519150601f19603f3d011682016040523d82523d6000602084013e6120c4565b606091505b50509050806117bd5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b6001600160a01b03851633148061212357506121238533610b35565b61213f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c8585858585612d97565b612154612416565b6001600160a01b0381166121b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dcd565b6119a781612c22565b6121ca612416565b600654600160d01b900460ff16156121f1576006805460ff60d81b1916600160d81b179055565b6040516348ae092960e01b815260040160405180910390fd5b6001600160a01b03831633148061222657506122268333610b35565b6122425760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612ecf565b612255612416565b6000828152600b6020526040902060020154600160881b900460ff1661228d5760405162461bcd60e51b8152600401610dcd90613de6565b806001600160401b03166000036123005760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f742073657420746f20756e6c696d6974656420616674657220696e60448201527034ba34b0b610383ab13634b1b0ba34b7b760791b6064820152608401610dcd565b6000828152600b60205260409020600101546001600160401b03161561238c576000828152600b60205260409020600101546001600160401b0380831691161161238c5760405162461bcd60e51b815260206004820152601c60248201527f537570706c792063616e206f6e6c7920626520646563726561736564000000006044820152606401610dcd565b6000918252600b6020526040909120600101805467ffffffffffffffff19166001600160401b03909216919091179055565b60006123c86116bb565b905090565b6123d5612416565b6006805460ff60d01b1916600160d01b179055565b6123f2612416565b6000908152600b60205260409020600201805460ff60801b1916600160801b179055565b6003546001600160a01b031633146114535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dcd565b60006001600160e01b03198216636cdb3d1360e11b14806124a157506001600160e01b031982166303a24d0760e21b145b80610df957506301ffc9a760e01b6001600160e01b0319831614610df9565b600354600160a01b900460ff16156114535760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dcd565b600061251a60028361412d565b1592915050565b6001600160a01b0384166125815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610dcd565b33600061258d85612fe7565b9050600061259a85612fe7565b90506125ab83600089858589613032565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906125db908490613d95565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461263b83600089898989613048565b50505050505050565b600061265160028361412d565b151592915050565b6000828152600b60205260408120600101546001600160401b0316801580159061269b575060008481526004602052604090205481906126999085613d95565b115b156126aa576001915050610df9565b6000915050610df9565b5092915050565b600080806126c88561157e565b90506126d48482613f22565b95945050505050565b6006546000906103e8906126fc90600160b01b900461ffff1684613f22565b6127069190613f4f565b9050808310156127625760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e74204554482070617373656420666f72206f7264656044820152603960f91b6064820152608401610dcd565b6006546000906103e89061278190600160a01b900461ffff1685613f22565b61278b9190613f4f565b9050808411156127dd5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d756368204554482070617373656420666f72206f726465720000006044820152606401610dcd565b50505050565b81518351146128045760405162461bcd60e51b8152600401610dcd90614141565b6001600160a01b03841661282a5760405162461bcd60e51b8152600401610dcd90614189565b33612839818787878787613032565b60005b845181101561291f57600085828151811061285957612859613fb1565b60200260200101519050600085838151811061287757612877613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128c75760405162461bcd60e51b8152600401610dcd906141ce565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612904908490613d95565b925050819055505050508061291890613fc7565b905061283c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161296f929190614218565b60405180910390a46129858187878787876131a3565b505050505050565b61299561325e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080831180156129f857506509184e729fff83105b612a345760405162461bcd60e51b815260206004820152600d60248201526c283934b1b4b7339022b93937b960991b6044820152606401610dcd565b6000612a4b846a52b7d2dcc80cd2e4000000613f4f565b90506000612a598483613f22565b9050612a6b655af3107a400082613f4f565b612a76906001613d95565b6126d490655af3107a4000613f22565b6001600160a01b038316612aac5760405162461bcd60e51b8152600401610dcd9061423d565b8051825114612acd5760405162461bcd60e51b8152600401610dcd90614141565b6000339050612af081856000868660405180602001604052806000815250613032565b60005b8351811015612bb5576000848281518110612b1057612b10613fb1565b602002602001015190506000848381518110612b2e57612b2e613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612b7e5760405162461bcd60e51b8152600401610dcd90614280565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612bad81613fc7565b915050612af3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c06929190614218565b60405180910390a46040805160208101909152600090526127dd565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612c7c6124c0565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c53390565b816001600160a01b0316836001600160a01b031603612d2a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610dcd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416612dbd5760405162461bcd60e51b8152600401610dcd90614189565b336000612dc985612fe7565b90506000612dd685612fe7565b9050612de6838989858589613032565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612e275760405162461bcd60e51b8152600401610dcd906141ce565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612e64908490613d95565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612ec4848a8a8a8a8a613048565b505050505050505050565b6001600160a01b038316612ef55760405162461bcd60e51b8152600401610dcd9061423d565b336000612f0184612fe7565b90506000612f0e84612fe7565b9050612f2e83876000858560405180602001604052806000815250613032565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015612f6f5760405162461bcd60e51b8152600401610dcd90614280565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261263b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061302157613021613fb1565b602090810291909101015292915050565b61303a6124c0565b6129858686868686866132ae565b6001600160a01b0384163b156129855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061308c90899089908890889088906004016142c4565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c4918101906142fe565b60015b613173576130d361431b565b806308c379a00361310c57506130e7614337565b806130f2575061310e565b8060405162461bcd60e51b8152600401610dcd9190613522565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610dcd565b6001600160e01b0319811663f23a6e6160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b6001600160a01b0384163b156129855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906131e79089908990889088908890600401614408565b6020604051808303816000875af1925050508015613222575060408051601f3d908101601f1916820190925261321f918101906142fe565b60015b61322e576130d361431b565b6001600160e01b0319811663bc197c8160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b600354600160a01b900460ff166114535760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610dcd565b6001600160a01b0385166133355760005b8351811015613333578281815181106132da576132da613fb1565b6020026020010151600460008684815181106132f8576132f8613fb1565b60200260200101518152602001908152602001600020600082825461331d9190613d95565b9091555061332c905081613fc7565b90506132bf565b505b6001600160a01b0384166129855760005b835181101561263b57600084828151811061336357613363613fb1565b60200260200101519050600084838151811061338157613381613fb1565b60200260200101519050600060046000848152602001908152602001600020549050818110156134045760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610dcd565b6000928352600460205260409092209103905561342081613fc7565b9050613346565b6001600160a01b03811681146119a757600080fd5b60006020828403121561344e57600080fd5b81356115b981613427565b6000806040838503121561346c57600080fd5b823561347781613427565b946020939093013593505050565b6001600160e01b0319811681146119a757600080fd5b6000602082840312156134ad57600080fd5b81356115b981613485565b6000602082840312156134ca57600080fd5b813561ffff811681146115b957600080fd5b6000815180845260005b81811015613502576020818501810151868301820152016134e6565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006115b960208301846134dc565b60006020828403121561354757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156135895761358961354e565b6040525050565b600082601f8301126135a157600080fd5b81356001600160401b038111156135ba576135ba61354e565b6040516135d1601f8301601f191660200182613564565b8181528460208386010111156135e657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561361957600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561364457600080fd5b61365087828801613590565b91505092959194509250565b6000806040838503121561366f57600080fd5b8235915060208301356001600160401b0381111561368c57600080fd5b61369885828601613590565b9150509250929050565b80356001600160801b03811681146136b957600080fd5b919050565b600080604083850312156136d157600080fd5b823591506136e1602084016136a2565b90509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b80356001600160401b03811681146136b957600080fd5b6000806040838503121561373657600080fd5b823591506136e16020840161370c565b60006001600160401b0382111561375f5761375f61354e565b5060051b60200190565b600082601f83011261377a57600080fd5b8135602061378782613746565b6040516137948282613564565b83815260059390931b85018201928281019150868411156137b457600080fd5b8286015b848110156137cf57803583529183019183016137b8565b509695505050505050565b600080600080600060a086880312156137f257600080fd5b85356137fd81613427565b9450602086013561380d81613427565b935060408601356001600160401b038082111561382957600080fd5b61383589838a01613769565b9450606088013591508082111561384b57600080fd5b61385789838a01613769565b9350608088013591508082111561386d57600080fd5b5061387a88828901613590565b9150509295509295909350565b6000806040838503121561389a57600080fd5b82356001600160401b03808211156138b157600080fd5b818501915085601f8301126138c557600080fd5b813560206138d282613746565b6040516138df8282613564565b83815260059390931b85018201928281019150898411156138ff57600080fd5b948201945b8386101561392657853561391781613427565b82529482019490820190613904565b9650508601359250508082111561393c57600080fd5b5061369885828601613769565b600081518084526020808501945080840160005b838110156139795781518752958201959082019060010161395d565b509495945050505050565b6020815260006115b96020830184613949565b6000806000606084860312156139ac57600080fd5b83356139b781613427565b925060208401356001600160401b03808211156139d357600080fd5b6139df87838801613769565b935060408601359150808211156139f557600080fd5b50613a0286828701613769565b9150509250925092565b600060208284031215613a1e57600080fd5b813563ffffffff811681146115b957600080fd5b803580151581146136b957600080fd5b60008060408385031215613a5557600080fd5b8235613a6081613427565b91506136e160208401613a32565b6000610100808352613a828184018c6134dc565b6001600160401b039a8b1660208501526001600160801b03999099166040840152505094871660608601529286166080850152941660a083015292151560c082015291151560e090920191909152919050565b6000806000806000806000806000806101408b8d031215613af557600080fd5b8a356001600160401b0380821115613b0c57600080fd5b613b188e838f01613590565b9b5060208d0135915080821115613b2e57600080fd5b50613b3b8d828e01613590565b995050613b4a60408c0161370c565b9750613b5860608c016136a2565b9650613b6660808c0161370c565b9550613b7460a08c0161370c565b9450613b8260c08c0161370c565b9350613b9060e08c0161370c565b9250613b9f6101008c0161370c565b9150613bae6101208c01613a32565b90509295989b9194979a5092959850565b60008060408385031215613bd257600080fd5b8235613bdd81613427565b91506020830135613bed81613427565b809150509250929050565b6020815260008251610100806020850152613c176101208501836134dc565b91506001600160401b0360208601511660408501526001600160801b0360408601511660608501526060850151613c5960808601826001600160401b03169052565b5060808501516001600160401b03811660a08601525060a08501516001600160401b03811660c08601525060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600060a08688031215613cc057600080fd5b8535613ccb81613427565b94506020860135613cdb81613427565b9350604086013592506060860135915060808601356001600160401b03811115613d0457600080fd5b61387a88828901613590565b600080600060608486031215613d2557600080fd5b8335613d3081613427565b95602085013595506040909401359392505050565b600181811c90821680613d5957607f821691505b602082108103613d7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610df957610df9613d7f565b60018060a01b038616815284602082015283604082015282606082015260a060808201526000613ddb60a08301846134dc565b979650505050505050565b60208082526017908201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604082015260600190565b601f82111561112a57600081815260208120601f850160051c81016020861015613e445750805b601f850160051c820191505b8181101561298557828155600101613e50565b81516001600160401b03811115613e7c57613e7c61354e565b613e9081613e8a8454613d45565b84613e1d565b602080601f831160018114613ec55760008415613ead5750858301515b600019600386901b1c1916600185901b178555612985565b600085815260208120601f198616915b82811015613ef457888601518255948401946001909101908401613ed5565b5085821015613f125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610df957610df9613d7f565b634e487b7160e01b600052601260045260246000fd5b600082613f5e57613f5e613f39565b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201613fd957613fd9613d7f565b5060010190565b805169ffffffffffffffffffff811681146136b957600080fd5b600080600080600060a0868803121561401257600080fd5b61401b86613fe0565b945060208601519350604086015192506060860151915061403e60808701613fe0565b90509295509295909350565b6001600160401b0381811683821602808216919082811461406d5761406d613d7f565b505092915050565b6001600160401b038181168382160190808211156126b4576126b4613d7f565b60006101608d83528060208401526140af8184018e6134dc565b905082810360408401526140c3818d6134dc565b6001600160401b038c811660608601526001600160801b038c1660808601528a811660a086015289811660c086015288811660e0860152878116610100860152861661012085015291506141149050565b8215156101408301529c9b505050505050505050505050565b60008261413c5761413c613f39565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061422b6040830185613949565b82810360208401526126d48185613949565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ddb908301846134dc565b60006020828403121561431057600080fd5b81516115b981613485565b600060033d11156143345760046000803e5060005160e01c5b90565b600060443d10156143455790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561437457505050505090565b828501915081518181111561438c5750505050505090565b843d87010160208285010111156143a65750505050505090565b6143b560208286010187613564565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061443490830186613949565b82810360608401526144468186613949565b9050828103608084015261445a81856134dc565b9897505050505050505056fea2646970667358221220968b89e1b1d381b4330fc5fb8107f190c0651dee21b365a239ce594d522e317d64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003de0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000636eb7d00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000636ec5e00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106104075760003560e01c80638da5cb5b11610213578063e6aefa1b11610123578063f242432a116100ab578063f7551ef11161007a578063f7551ef114610cb1578063f7fb07b014610cd1578063fb0f94a414610ce6578063fc2b2da414610cfb578063feb8012314610d1c57600080fd5b8063f242432a14610c3c578063f2fde38b14610c5c578063f40a19cf14610c7c578063f5298aca14610c9157600080fd5b8063ea075e9c116100f2578063ea075e9c14610b83578063ea6be86c14610ba5578063ec6cd1e214610bd2578063f088302e14610bf2578063f14210a614610c1c57600080fd5b8063e6aefa1b14610ac5578063e8648b0b14610ae5578063e985e9c514610b1a578063e9be474414610b6357600080fd5b8063b52ddfbc116101a6578063c9732bc811610175578063c9732bc814610a30578063ca4b208b14610a50578063d56a7cd614610a70578063e042e98c14610a90578063e19292e514610ab057600080fd5b8063b52ddfbc1461099a578063bd85b039146109ba578063bfab3db9146109e7578063c441443b146109fc57600080fd5b80639b3a069b116101e25780639b3a069b146109315780639dd3417c14610951578063a22cb46514610967578063ac2ba0891461098757600080fd5b80638da5cb5b146108a15780638e15f473146108bf578063939e136e146108d457806395d89b411461090157600080fd5b80632a58fe0e11610319578063543c6056116102a15780636b20c454116102705780636b20c454146108175780636f2b6828146108375780636fa19fee14610857578063715018a6146108775780638456cb591461088c57600080fd5b8063543c6056146107b85780635c975abb146107cd578063641e7e6e146107ec5780636586b2071461080257600080fd5b80633f4ba83a116102e85780633f4ba83a14610707578063453709811461071c5780634e1273f41461073c5780634f558e79146107695780634fd514981461079857600080fd5b80632a58fe0e146106915780632eb2c2d6146106a657806335941b9c146106c657806338af3eed146106e757600080fd5b80630f0f30b21161039c5780631a9c67861161036b5780631a9c6786146105de5780631b75e482146105ff578063282048cc1461061f57806329e11186146106325780632a55205a1461065257600080fd5b80630f0f30b21461055757806316f9f5b31461058957806318160ddd146105a957806318e97fd1146105be57600080fd5b806306358427116103d857806306358427146104bc57806306fdde03146104dc5780630aaffd2a146105175780630e89341c1461053757600080fd5b80629ee39c14610416578062fdd58e1461043857806301ffc9a71461046b57806302a1ec971461049b57600080fd5b3661041157600080fd5b600080fd5b34801561042257600080fd5b5061043661043136600461343c565b610d3c565b005b34801561044457600080fd5b50610458610453366004613459565b610d66565b6040519081526020015b60405180910390f35b34801561047757600080fd5b5061048b61048636600461349b565b610dff565b6040519015158152602001610462565b3480156104a757600080fd5b5060065461048b90600160d81b900460ff1681565b3480156104c857600080fd5b506104366104d73660046134b8565b610e24565b3480156104e857600080fd5b506040805180820190915260098152683bb4379530b737b71560b91b60208201525b6040516104629190613522565b34801561052357600080fd5b5061043661053236600461343c565b610e86565b34801561054357600080fd5b5061050a610552366004613535565b610eb0565b34801561056357600080fd5b50600a546001600160a01b03165b6040516001600160a01b039091168152602001610462565b34801561059557600080fd5b506104366105a4366004613603565b610f52565b3480156105b557600080fd5b5061045861109d565b3480156105ca57600080fd5b506104366105d936600461365c565b6110d2565b3480156105ea57600080fd5b5060065461048b90600160c01b900460ff1681565b34801561060b57600080fd5b5061043661061a3660046136be565b61112f565b61043661062d3660046136ea565b6111b9565b34801561063e57600080fd5b5061043661064d366004613723565b61132b565b34801561065e57600080fd5b5061067261066d3660046136ea565b6113a3565b604080516001600160a01b039093168352602083019190915201610462565b34801561069d57600080fd5b506104366113da565b3480156106b257600080fd5b506104366106c13660046137da565b6113f7565b3480156106d257600080fd5b5060065461048b90600160c81b900460ff1681565b3480156106f357600080fd5b50600654610571906001600160a01b031681565b34801561071357600080fd5b50610436611443565b34801561072857600080fd5b50600854610571906001600160a01b031681565b34801561074857600080fd5b5061075c610757366004613887565b611455565b6040516104629190613984565b34801561077557600080fd5b5061048b610784366004613535565b600090815260046020526040902054151590565b3480156107a457600080fd5b506104586107b3366004613535565b61157e565b3480156107c457600080fd5b506104366115c0565b3480156107d957600080fd5b50600354600160a01b900460ff1661048b565b3480156107f857600080fd5b5061045860075481565b34801561080e57600080fd5b506104366115d7565b34801561082357600080fd5b50610436610832366004613997565b6115ee565b34801561084357600080fd5b50610436610852366004613a0c565b611631565b34801561086357600080fd5b5061043661087236600461343c565b611644565b34801561088357600080fd5b5061043661166e565b34801561089857600080fd5b50610436611680565b3480156108ad57600080fd5b506003546001600160a01b0316610571565b3480156108cb57600080fd5b506104586116bb565b3480156108e057600080fd5b506104586108ef366004613535565b600c6020526000908152604090205481565b34801561090d57600080fd5b506040805180820190915260078152662ba427a0a727a760c91b602082015261050a565b34801561093d57600080fd5b5061043661094c366004613723565b611740565b34801561095d57600080fd5b5061045860095481565b34801561097357600080fd5b50610436610982366004613a42565b6117b2565b6104366109953660046136ea565b6117c1565b3480156109a657600080fd5b506104366109b536600461343c565b6118e0565b3480156109c657600080fd5b506104586109d5366004613535565b60009081526004602052604090205490565b3480156109f357600080fd5b5061043661190a565b348015610a0857600080fd5b50610a1c610a17366004613535565b6119aa565b604051610462989796959493929190613a6e565b348015610a3c57600080fd5b50610436610a4b366004613ad5565b611a9a565b348015610a5c57600080fd5b50600554610571906001600160a01b031681565b348015610a7c57600080fd5b50610458610a8b366004613535565b611d06565b348015610a9c57600080fd5b50610436610aab366004613535565b611d1d565b348015610abc57600080fd5b50610436611d2a565b348015610ad157600080fd5b5061048b610ae0366004613535565b611d72565b348015610af157600080fd5b50600654610b0790600160b01b900461ffff1681565b60405161ffff9091168152602001610462565b348015610b2657600080fd5b5061048b610b35366004613bbf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610436610b7e366004613723565b611dc0565b348015610b8f57600080fd5b50600654610b0790600160a01b900461ffff1681565b348015610bb157600080fd5b50610bc5610bc0366004613535565b611e7c565b6040516104629190613bf8565b348015610bde57600080fd5b50610436610bed3660046134b8565b611fe6565b348015610bfe57600080fd5b50610c07612041565b60408051928352602083019190915201610462565b348015610c2857600080fd5b50610436610c37366004613535565b61206a565b348015610c4857600080fd5b50610436610c57366004613ca8565b612107565b348015610c6857600080fd5b50610436610c7736600461343c565b61214c565b348015610c8857600080fd5b506104366121c2565b348015610c9d57600080fd5b50610436610cac366004613d10565b61220a565b348015610cbd57600080fd5b50610436610ccc366004613723565b61224d565b348015610cdd57600080fd5b506104586123be565b348015610cf257600080fd5b506104366123cd565b348015610d0757600080fd5b5060065461048b90600160d01b900460ff1681565b348015610d2857600080fd5b50610436610d37366004613535565b6123ea565b610d44612416565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038316610dd65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b0319821663152a902d60e11b1480610df95750610df982612470565b610e2c612416565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a906020015b60405180910390a150565b610e8e612416565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60205260409020805460609190610ecd90613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef990613d45565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b50505050509050919050565b610f5d846001613d95565b610f6681611d72565b610fa85760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b610fb06124c0565b610fb98561250d565b15610fd75760405163cc3ea67160e01b815260040160405180910390fd5b836000036110275760405162461bcd60e51b815260206004820152601e60248201527f526564656d7074696f6e206d75737420626520666f7220616e206974656d00006044820152606401610dcd565b61103233868661220a565b61105733611041876001613d95565b8660405180602001604052806000815250612521565b7fb939ee10986cac83ee56f03462ee8ebd7d5d664696db574c5f42eb730b31c90f338686868660405161108e959493929190613da8565b60405180910390a15050505050565b600060015b60075481116110ce576000818152600460205260409020546110c49083613d95565b91506001016110a2565b5090565b6110da612416565b6000828152600b6020526040902060020154600160881b900460ff166111125760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902061112a8282613e63565b505050565b611137612416565b6000828152600b6020526040902060020154600160881b900460ff1661116f5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160801b03909216600160401b0277ffffffffffffffffffffffffffffffff000000000000000019909216919091179055565b816111c381611d72565b6112055760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b61120d6124c0565b8160000361125d5760405162461bcd60e51b815260206004820152601960248201527f4f72646572206d75737420626520666f7220616e206974656d000000000000006044820152606401610dcd565b61126683612644565b61128357604051631afe061f60e21b815260040160405180910390fd5b61128d8383612659565b156112ab57604051637d3d824960e01b815260040160405180910390fd5b60006112b784846126bb565b90506112c334826126dd565b6112de33858560405180602001604052806000815250612521565b60408051338152602081018690529081018490523460608201527f14108c40853eafebc8d570ba3c24ab69eca575937c341a1bf4e6ab5c4f4e45b19060800160405180910390a150505050565b611333612416565b6000828152600b6020526040902060020154600160881b900460ff1661136b5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6000806000612710600954856113b99190613f22565b6113c39190613f4f565b6008546001600160a01b0316969095509350505050565b6113e2612416565b6006805460ff60c01b1916600160c01b179055565b6001600160a01b03851633148061141357506114138533610b35565b61142f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c85858585856127e3565b5050505050565b61144b612416565b61145361298d565b565b606081518351146114ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610dcd565b600083516001600160401b038111156114d5576114d561354e565b6040519080825280602002602001820160405280156114fe578160200160208202803683370190505b50905060005b84518110156115765761154985828151811061152257611522613fb1565b602002602001015185838151811061153c5761153c613fb1565b6020026020010151610d66565b82828151811061155b5761155b613fb1565b602090810291909101015261156f81613fc7565b9050611504565b509392505050565b6000806115896116bb565b6000848152600b60205260409020600101549091506115b9908290600160401b90046001600160801b03166129e2565b9392505050565b6115c8612416565b6006805460ff60c01b19169055565b6115df612416565b6006805460ff60d01b19169055565b6001600160a01b03831633148061160a575061160a8333610b35565b6116265760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612a86565b611639612416565b63ffffffff16600755565b61164c612416565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611676612416565b6114536000612c22565b611688612416565b600654600160c81b900460ff16156116b3576040516311f9636d60e21b815260040160405180910390fd5b611453612c74565b600080600a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117359190613ffa565b509195945050505050565b611748612416565b6000828152600b6020526040902060020154600160881b900460ff166117805760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b6020526040909120600201805467ffffffffffffffff19166001600160401b03909216919091179055565b6117bd338383612cb7565b5050565b6003546001600160a01b03163314806117e457506005546001600160a01b031633145b6118305760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e6572206f7220646576656c6f7065720000000000000000006044820152606401610dcd565b6000828152600b6020908152604080832060020154600c9092529091205483918391600160401b9091046001600160401b03169061186f908390613d95565b111561188e576040516308345b1d60e21b815260040160405180910390fd5b6005546040805160208101909152600081526118b7916001600160a01b03169086908690612521565b6000848152600c6020526040812080548592906118d5908490613d95565b909155505050505050565b6118e8612416565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611912612416565b6006546040516000916001600160a01b03169047908381818185875af1925050503d806000811461195f576040519150601f19603f3d011682016040523d82523d6000602084013e611964565b606091505b50509050806119a75760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b50565b600b602052600090815260409020805481906119c590613d45565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613d45565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b50505050600183015460029093015491926001600160401b0380821693600160401b8084046001600160801b03169450600160c01b909304821692828216929082041690600160801b810460ff90811691600160881b90041688565b611aa2612416565b600654600160d81b900460ff1615611acd576040516312c44b6d60e01b815260040160405180910390fd5b60006007546001611ade9190613d95565b90506000611aed826001613d95565b6000838152600b60205260409020909150611b088d82613e63565b506000828152600b6020526040902060010180546001600160401b038a8116600160c01b026001600160c01b036001600160801b038e16600160401b026001600160c01b0319909416928f16929092179290921716179055611b6c87610e1061404a565b611b769089614075565b6000838152600b6020526040808220600201805460ff60881b19881515600160801b021661ffff60801b196001600160401b038b8116600160401b026fffffffffffffffffffffffffffffffff19909416971696909617919091179490941693909317600160881b1790925582815220611bf08c82613e63565b506000818152600b602052604090206001600160401b038716600160c01b02600190910155611c2185610e1061404a565b611c2b9087614075565b6000828152600b60205260409020600201805460ff60881b1970ffffffffffffffffffffffffffffffffff199091166001600160401b039390931692909217600160801b1791909116600160881b17905560078190557f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06828d8d8d8d8d611cb48e610e1061404a565b8f611cbf9190614075565b8d611ccc8e610e1061404a565b8f611cd79190614075565b8d8d604051611cf09b9a99989796959493929190614095565b60405180910390a1505050505050505050505050565b600080611d116116bb565b90506115b981846129e2565b611d25612416565b600955565b611d32612416565b600654600160c01b900460ff1615611d59576006805460ff60c81b1916600160c81b179055565b604051636607e9a360e11b815260040160405180910390fd5b6000818152600b6020526040812060010154600160c01b90046001600160401b03164210801590610df95750506000908152600b60205260409020600201546001600160401b031642111590565b611dc8612416565b6000828152600b6020526040902060020154600160881b900460ff16611e005760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902060020154600160801b900460ff1615611e3a5760405163d701498160e01b815260040160405180910390fd5b6000918252600b602052604090912060020180546001600160401b03909216600160401b026fffffffffffffffff000000000000000019909216919091179055565b6040805161010081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c0810182905260e08101919091526000828152600b60205260409081902081516101008101909252805482908290611ee690613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1290613d45565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b505050918352505060018201546001600160401b038082166020840152600160401b8083046001600160801b03166040850152600160c01b90920481166060840152600290930154808416608084015290810490921660a0820152600160801b820460ff908116151560c0830152600160881b909204909116151560e09091015292915050565b611fee612416565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b00825190602001610e7b565b60008061204c612416565b505060065461ffff600160a01b8204811691600160b01b9004169091565b612072612416565b6006546040516000916001600160a01b03169083908381818185875af1925050503d80600081146120bf576040519150601f19603f3d011682016040523d82523d6000602084013e6120c4565b606091505b50509050806117bd5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b6001600160a01b03851633148061212357506121238533610b35565b61213f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c8585858585612d97565b612154612416565b6001600160a01b0381166121b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dcd565b6119a781612c22565b6121ca612416565b600654600160d01b900460ff16156121f1576006805460ff60d81b1916600160d81b179055565b6040516348ae092960e01b815260040160405180910390fd5b6001600160a01b03831633148061222657506122268333610b35565b6122425760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612ecf565b612255612416565b6000828152600b6020526040902060020154600160881b900460ff1661228d5760405162461bcd60e51b8152600401610dcd90613de6565b806001600160401b03166000036123005760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f742073657420746f20756e6c696d6974656420616674657220696e60448201527034ba34b0b610383ab13634b1b0ba34b7b760791b6064820152608401610dcd565b6000828152600b60205260409020600101546001600160401b03161561238c576000828152600b60205260409020600101546001600160401b0380831691161161238c5760405162461bcd60e51b815260206004820152601c60248201527f537570706c792063616e206f6e6c7920626520646563726561736564000000006044820152606401610dcd565b6000918252600b6020526040909120600101805467ffffffffffffffff19166001600160401b03909216919091179055565b60006123c86116bb565b905090565b6123d5612416565b6006805460ff60d01b1916600160d01b179055565b6123f2612416565b6000908152600b60205260409020600201805460ff60801b1916600160801b179055565b6003546001600160a01b031633146114535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dcd565b60006001600160e01b03198216636cdb3d1360e11b14806124a157506001600160e01b031982166303a24d0760e21b145b80610df957506301ffc9a760e01b6001600160e01b0319831614610df9565b600354600160a01b900460ff16156114535760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dcd565b600061251a60028361412d565b1592915050565b6001600160a01b0384166125815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610dcd565b33600061258d85612fe7565b9050600061259a85612fe7565b90506125ab83600089858589613032565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906125db908490613d95565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461263b83600089898989613048565b50505050505050565b600061265160028361412d565b151592915050565b6000828152600b60205260408120600101546001600160401b0316801580159061269b575060008481526004602052604090205481906126999085613d95565b115b156126aa576001915050610df9565b6000915050610df9565b5092915050565b600080806126c88561157e565b90506126d48482613f22565b95945050505050565b6006546000906103e8906126fc90600160b01b900461ffff1684613f22565b6127069190613f4f565b9050808310156127625760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e74204554482070617373656420666f72206f7264656044820152603960f91b6064820152608401610dcd565b6006546000906103e89061278190600160a01b900461ffff1685613f22565b61278b9190613f4f565b9050808411156127dd5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d756368204554482070617373656420666f72206f726465720000006044820152606401610dcd565b50505050565b81518351146128045760405162461bcd60e51b8152600401610dcd90614141565b6001600160a01b03841661282a5760405162461bcd60e51b8152600401610dcd90614189565b33612839818787878787613032565b60005b845181101561291f57600085828151811061285957612859613fb1565b60200260200101519050600085838151811061287757612877613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128c75760405162461bcd60e51b8152600401610dcd906141ce565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612904908490613d95565b925050819055505050508061291890613fc7565b905061283c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161296f929190614218565b60405180910390a46129858187878787876131a3565b505050505050565b61299561325e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080831180156129f857506509184e729fff83105b612a345760405162461bcd60e51b815260206004820152600d60248201526c283934b1b4b7339022b93937b960991b6044820152606401610dcd565b6000612a4b846a52b7d2dcc80cd2e4000000613f4f565b90506000612a598483613f22565b9050612a6b655af3107a400082613f4f565b612a76906001613d95565b6126d490655af3107a4000613f22565b6001600160a01b038316612aac5760405162461bcd60e51b8152600401610dcd9061423d565b8051825114612acd5760405162461bcd60e51b8152600401610dcd90614141565b6000339050612af081856000868660405180602001604052806000815250613032565b60005b8351811015612bb5576000848281518110612b1057612b10613fb1565b602002602001015190506000848381518110612b2e57612b2e613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612b7e5760405162461bcd60e51b8152600401610dcd90614280565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612bad81613fc7565b915050612af3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c06929190614218565b60405180910390a46040805160208101909152600090526127dd565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612c7c6124c0565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c53390565b816001600160a01b0316836001600160a01b031603612d2a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610dcd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416612dbd5760405162461bcd60e51b8152600401610dcd90614189565b336000612dc985612fe7565b90506000612dd685612fe7565b9050612de6838989858589613032565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612e275760405162461bcd60e51b8152600401610dcd906141ce565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612e64908490613d95565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612ec4848a8a8a8a8a613048565b505050505050505050565b6001600160a01b038316612ef55760405162461bcd60e51b8152600401610dcd9061423d565b336000612f0184612fe7565b90506000612f0e84612fe7565b9050612f2e83876000858560405180602001604052806000815250613032565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015612f6f5760405162461bcd60e51b8152600401610dcd90614280565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261263b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061302157613021613fb1565b602090810291909101015292915050565b61303a6124c0565b6129858686868686866132ae565b6001600160a01b0384163b156129855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061308c90899089908890889088906004016142c4565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c4918101906142fe565b60015b613173576130d361431b565b806308c379a00361310c57506130e7614337565b806130f2575061310e565b8060405162461bcd60e51b8152600401610dcd9190613522565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610dcd565b6001600160e01b0319811663f23a6e6160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b6001600160a01b0384163b156129855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906131e79089908990889088908890600401614408565b6020604051808303816000875af1925050508015613222575060408051601f3d908101601f1916820190925261321f918101906142fe565b60015b61322e576130d361431b565b6001600160e01b0319811663bc197c8160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b600354600160a01b900460ff166114535760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610dcd565b6001600160a01b0385166133355760005b8351811015613333578281815181106132da576132da613fb1565b6020026020010151600460008684815181106132f8576132f8613fb1565b60200260200101518152602001908152602001600020600082825461331d9190613d95565b9091555061332c905081613fc7565b90506132bf565b505b6001600160a01b0384166129855760005b835181101561263b57600084828151811061336357613363613fb1565b60200260200101519050600084838151811061338157613381613fb1565b60200260200101519050600060046000848152602001908152602001600020549050818110156134045760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610dcd565b6000928352600460205260409092209103905561342081613fc7565b9050613346565b6001600160a01b03811681146119a757600080fd5b60006020828403121561344e57600080fd5b81356115b981613427565b6000806040838503121561346c57600080fd5b823561347781613427565b946020939093013593505050565b6001600160e01b0319811681146119a757600080fd5b6000602082840312156134ad57600080fd5b81356115b981613485565b6000602082840312156134ca57600080fd5b813561ffff811681146115b957600080fd5b6000815180845260005b81811015613502576020818501810151868301820152016134e6565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006115b960208301846134dc565b60006020828403121561354757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156135895761358961354e565b6040525050565b600082601f8301126135a157600080fd5b81356001600160401b038111156135ba576135ba61354e565b6040516135d1601f8301601f191660200182613564565b8181528460208386010111156135e657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561361957600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561364457600080fd5b61365087828801613590565b91505092959194509250565b6000806040838503121561366f57600080fd5b8235915060208301356001600160401b0381111561368c57600080fd5b61369885828601613590565b9150509250929050565b80356001600160801b03811681146136b957600080fd5b919050565b600080604083850312156136d157600080fd5b823591506136e1602084016136a2565b90509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b80356001600160401b03811681146136b957600080fd5b6000806040838503121561373657600080fd5b823591506136e16020840161370c565b60006001600160401b0382111561375f5761375f61354e565b5060051b60200190565b600082601f83011261377a57600080fd5b8135602061378782613746565b6040516137948282613564565b83815260059390931b85018201928281019150868411156137b457600080fd5b8286015b848110156137cf57803583529183019183016137b8565b509695505050505050565b600080600080600060a086880312156137f257600080fd5b85356137fd81613427565b9450602086013561380d81613427565b935060408601356001600160401b038082111561382957600080fd5b61383589838a01613769565b9450606088013591508082111561384b57600080fd5b61385789838a01613769565b9350608088013591508082111561386d57600080fd5b5061387a88828901613590565b9150509295509295909350565b6000806040838503121561389a57600080fd5b82356001600160401b03808211156138b157600080fd5b818501915085601f8301126138c557600080fd5b813560206138d282613746565b6040516138df8282613564565b83815260059390931b85018201928281019150898411156138ff57600080fd5b948201945b8386101561392657853561391781613427565b82529482019490820190613904565b9650508601359250508082111561393c57600080fd5b5061369885828601613769565b600081518084526020808501945080840160005b838110156139795781518752958201959082019060010161395d565b509495945050505050565b6020815260006115b96020830184613949565b6000806000606084860312156139ac57600080fd5b83356139b781613427565b925060208401356001600160401b03808211156139d357600080fd5b6139df87838801613769565b935060408601359150808211156139f557600080fd5b50613a0286828701613769565b9150509250925092565b600060208284031215613a1e57600080fd5b813563ffffffff811681146115b957600080fd5b803580151581146136b957600080fd5b60008060408385031215613a5557600080fd5b8235613a6081613427565b91506136e160208401613a32565b6000610100808352613a828184018c6134dc565b6001600160401b039a8b1660208501526001600160801b03999099166040840152505094871660608601529286166080850152941660a083015292151560c082015291151560e090920191909152919050565b6000806000806000806000806000806101408b8d031215613af557600080fd5b8a356001600160401b0380821115613b0c57600080fd5b613b188e838f01613590565b9b5060208d0135915080821115613b2e57600080fd5b50613b3b8d828e01613590565b995050613b4a60408c0161370c565b9750613b5860608c016136a2565b9650613b6660808c0161370c565b9550613b7460a08c0161370c565b9450613b8260c08c0161370c565b9350613b9060e08c0161370c565b9250613b9f6101008c0161370c565b9150613bae6101208c01613a32565b90509295989b9194979a5092959850565b60008060408385031215613bd257600080fd5b8235613bdd81613427565b91506020830135613bed81613427565b809150509250929050565b6020815260008251610100806020850152613c176101208501836134dc565b91506001600160401b0360208601511660408501526001600160801b0360408601511660608501526060850151613c5960808601826001600160401b03169052565b5060808501516001600160401b03811660a08601525060a08501516001600160401b03811660c08601525060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600060a08688031215613cc057600080fd5b8535613ccb81613427565b94506020860135613cdb81613427565b9350604086013592506060860135915060808601356001600160401b03811115613d0457600080fd5b61387a88828901613590565b600080600060608486031215613d2557600080fd5b8335613d3081613427565b95602085013595506040909401359392505050565b600181811c90821680613d5957607f821691505b602082108103613d7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610df957610df9613d7f565b60018060a01b038616815284602082015283604082015282606082015260a060808201526000613ddb60a08301846134dc565b979650505050505050565b60208082526017908201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604082015260600190565b601f82111561112a57600081815260208120601f850160051c81016020861015613e445750805b601f850160051c820191505b8181101561298557828155600101613e50565b81516001600160401b03811115613e7c57613e7c61354e565b613e9081613e8a8454613d45565b84613e1d565b602080601f831160018114613ec55760008415613ead5750858301515b600019600386901b1c1916600185901b178555612985565b600085815260208120601f198616915b82811015613ef457888601518255948401946001909101908401613ed5565b5085821015613f125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610df957610df9613d7f565b634e487b7160e01b600052601260045260246000fd5b600082613f5e57613f5e613f39565b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201613fd957613fd9613d7f565b5060010190565b805169ffffffffffffffffffff811681146136b957600080fd5b600080600080600060a0868803121561401257600080fd5b61401b86613fe0565b945060208601519350604086015192506060860151915061403e60808701613fe0565b90509295509295909350565b6001600160401b0381811683821602808216919082811461406d5761406d613d7f565b505092915050565b6001600160401b038181168382160190808211156126b4576126b4613d7f565b60006101608d83528060208401526140af8184018e6134dc565b905082810360408401526140c3818d6134dc565b6001600160401b038c811660608601526001600160801b038c1660808601528a811660a086015289811660c086015288811660e0860152878116610100860152861661012085015291506141149050565b8215156101408301529c9b505050505050505050505050565b60008261413c5761413c613f39565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061422b6040830185613949565b82810360208401526126d48185613949565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ddb908301846134dc565b60006020828403121561431057600080fd5b81516115b981613485565b600060033d11156143345760046000803e5060005160e01c5b90565b600060443d10156143455790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561437457505050505090565b828501915081518181111561438c5750505050505090565b843d87010160208285010111156143a65750505050505090565b6143b560208286010187613564565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061443490830186613949565b82810360608401526144468186613949565b9050828103608084015261445a81856134dc565b9897505050505050505056fea2646970667358221220968b89e1b1d381b4330fc5fb8107f190c0651dee21b365a239ce594d522e317d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003de0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000636eb7d00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000636ec5e00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : priceBuffers_ (uint16[]): 1010,990
Arg [1] : beneficiary_ (address): 0xb21F2a5c2478B255DCA85CB0D4B178Db7AE42071
Arg [2] : developer_ (address): 0xDE3FF2A50bd1BA1bd6a608EA0138946Dddf595bc
Arg [3] : priceFeedAddress_ (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [4] : firstEditions_ (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
53 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071
Arg [2] : 000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc
Arg [3] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003f2
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003de
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000460
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000082
Arg [16] : 00000000000000000000000000000000000000000000000000000000636eb7d0
Arg [17] : 0000000000000000000000000000000000000000000000000000000063780060
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [21] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [22] : 697066733a2f2f516d504c464748483431437358644d4d46563374555976774a
Arg [23] : 4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [34] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [35] : 00000000000000000000000000000000000000000000000000000000000003e7
Arg [36] : 00000000000000000000000000000000000000000000000000000000636ec5e0
Arg [37] : 0000000000000000000000000000000000000000000000000000000063780060
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [41] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [42] : 697066733a2f2f516d504c464748483431437358644d4d46563374555976774a
Arg [43] : 4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [46] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [49] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.