Feature Tip: Add private address tag to any address under My Name Tag !
NFT
Overview
TokenID
11895
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EZU
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 5000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /*************************************** * @author: 🍖 & Lambdalf the White * * @team: Asteria * ****************************************/ import "./libraries/Reg_ERC721Batch.sol"; import "./libraries/ERC2981Base.sol"; import "./libraries/IOwnable.sol"; import "./libraries/IPausable.sol"; import "./libraries/IWhitelistable.sol"; contract EZU is Reg_ERC721Batch, ERC2981Base, IOwnable, IPausable, IWhitelistable { // Errors error EZU_NOT_CROSSMINT(); error EZU_INCORRECT_PRICE(); error EZU_EXTERNAL_CONTRACT(); error EZU_MAX_PER_TXN(); error EZU_MAX_SUPPLY(); error EZU_MAX_PRESALE_SUPPLY(); error EZU_NO_ETHER_BALANCE(); error EZU_TRANSFER_FAIL(); // Presale mint price uint public PRESALE_MINT_PRICE = 0.2 ether; // Public mint price uint public PUBLIC_MINT_PRICE = 0.2 ether; // Max supply uint public immutable MAX_SUPPLY = 15_000; // Max presale supply uint public immutable MAX_SALE_SUPPLY = 10_420; // Max per txn uint public immutable MAX_PER_TXN = 2; // Max allowance uint public immutable MAX_ALLOWANCE = 1; // Crossmint contract address address public immutable CROSSMINT_ADDRESS = 0xdAb1a1854214684acE522439684a145E62505233; // Psychedelics Anonymous treasury address address public paTreasuryAddress = 0x218B622bbe4404c01f972F243952E3a1D2132Dec; // Magic Eden treasury address address public meTreasuryAddress = 0xA55c2F8Af10d603976dEcA0B61Cd87ba2F9C6492; // Switch between revealed or unrevealed baseURI bool public isRevealed = false; // Suffix to add to the end of tokenURI string public uriSuffix = ""; constructor( uint256 royaltyRate_, address royaltyRecipient_, string memory name_, string memory symbol_, string memory uri_ ) { _initIOwnable( _msgSender() ); _initERC2981Base( royaltyRecipient_, royaltyRate_ ); _initERC721Metadata( name_, symbol_, uri_ ); } // ************************************** // ***** INTERNAL ***** // ************************************** /** * @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 { if ( address( this ).balance < amount_ ) { revert EZU_INCORRECT_PRICE(); } ( bool _success_, ) = recipient_.call{ value: amount_ }( "" ); if ( ! _success_ ) { revert EZU_TRANSFER_FAIL(); } } // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /** * @dev Mints a token and transfers it to the caller. * * Requirements: * * - Sale state must be {SaleState.PRESALE}. * - There must be enough tokens left to mint outside of the reserve. * - Caller must send enough ether to pay for `qty_` tokens at presale price. * - Caller must be whitelisted. */ function mintPreSale( uint256 qty_, bytes32[] memory proof_ ) external payable presaleOpen isWhitelisted( _msgSender(), proof_, MAX_ALLOWANCE, qty_ ) { if ( _totalSupply() + qty_ > MAX_SALE_SUPPLY ) { revert EZU_MAX_PRESALE_SUPPLY(); } if ( PRESALE_MINT_PRICE * qty_ != msg.value ) { revert EZU_INCORRECT_PRICE(); } address _account_ = _msgSender(); _consumeWhitelist( _account_, qty_ ); _mint( _account_, qty_ ); } /** * @dev Mints `qty_` tokens and transfers them to the caller. * * Requirements: * * - Sale state must be {SaleState.SALE}. * - There must be enough tokens left to mint outside of the reserve. * - Caller must send enough ether to pay for `qty_` tokens at public sale price. */ function mint( uint256 qty_ ) external payable saleOpen { if ( qty_ > MAX_PER_TXN ) { revert EZU_MAX_PER_TXN(); } uint256 _endSupply_ = _totalSupply() + qty_; if ( _endSupply_ > MAX_SALE_SUPPLY ) { revert EZU_MAX_SUPPLY(); } if ( qty_ * PUBLIC_MINT_PRICE != msg.value ) { revert EZU_INCORRECT_PRICE(); } if ( _msgSender() != tx.origin ) { revert EZU_EXTERNAL_CONTRACT(); } address _account_ = _msgSender(); _mint( _account_, qty_ ); } /** * @dev Mints a token and transfers it to the caller. * * Requirements: * * - Sale state must be {SaleState.PRESALE}. * - There must be enough tokens left to mint outside of the reserve. * - Caller must send enough ether to pay for `qty_` tokens at presale price. * - Caller must be whitelisted. */ function crossmintPreSale( address to_, uint256 qty_, bytes32[] memory proof_ ) external payable presaleOpen isWhitelisted( to_, proof_, MAX_ALLOWANCE, qty_ ) { if ( _msgSender() != CROSSMINT_ADDRESS) { revert EZU_NOT_CROSSMINT(); } if ( _totalSupply() + qty_ > MAX_SALE_SUPPLY ) { revert EZU_MAX_PRESALE_SUPPLY(); } if ( PRESALE_MINT_PRICE * qty_ != msg.value ) { revert EZU_INCORRECT_PRICE(); } _consumeWhitelist( to_, qty_ ); _mint( to_, qty_ ); } /** * @dev Mint 'qty_' tokens and transfer them to 'addr'. * * Requirements: * * - Caller must be crossmint.eth * - Sale state must be {SaleState.SALE}. * - There must be enough tokens left to mint outside of the reserve. * - Caller must send enough ether to pay for `qty_` tokens at public sale price. */ function crossmint( address to_, uint256 qty_ ) external payable saleOpen { if ( _msgSender() != CROSSMINT_ADDRESS) { revert EZU_NOT_CROSSMINT(); } if ( qty_ > MAX_PER_TXN ) { revert EZU_MAX_PER_TXN(); } uint256 _endSupply_ = _totalSupply() + qty_; if ( _endSupply_ > MAX_SALE_SUPPLY ) { revert EZU_MAX_SUPPLY(); } if ( qty_ * PUBLIC_MINT_PRICE != msg.value ) { revert EZU_INCORRECT_PRICE(); } _mint( to_, qty_ ); } // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /** * @dev Allows owner to mint 'qty_' tokens for future airdrops * * Requirements: * * - Caller must be the contract owner. * - Sale state must be {SaleState.SALE}. * - There must be enough tokens left to mint outside of the reserve. */ function ownerMint( address _a, uint256 qty_ ) external onlyOwner { uint256 _endSupply_ = _totalSupply() + qty_; if ( _endSupply_ > MAX_SUPPLY ) { revert EZU_MAX_SUPPLY(); } _mint( _a, qty_ ); } /** * @dev Updates the royalty recipient and rate. * * Requirements: * * - Caller must be the contract owner. */ function setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) external onlyOwner { _setRoyaltyInfo( royaltyRecipient_, royaltyRate_ ); } /** * @dev See {IPausable-setSaleState}. * * Requirements: * * - Caller must be the contract owner. */ function setSaleState( SaleState newState_ ) external onlyOwner { _setSaleState( newState_ ); } /** * @dev Updates both 'PRESALE_MINT_PRICE' and 'PUBLIC_MINT_PRICE' to a new price * * Requirements: * * - Caller must be the contract owner. */ function setSalePrices( uint256 newPresalePrice_, uint256 newPublicPrice_ ) external onlyOwner { PRESALE_MINT_PRICE = newPresalePrice_; PUBLIC_MINT_PRICE = newPublicPrice_; } /** * @dev Updates the baseURI * * Requirements: * * - Caller must be the contract owner. */ function setBaseURI( string calldata uri_ ) external onlyOwner { _setBaseURI( uri_ ); } /** * @dev Switchs 'isRevealed' to 'isRevealed_' * * Requirements: * * - Caller must be the contract owner. */ function revealMetadata( string calldata uri_ ) external onlyOwner { _setBaseURI( uri_ ); uriSuffix = ".json"; isRevealed = true; } /** * @dev Switchs 'uriSuffix' to 'suffix_' * * Requirements: * * - Caller must be the contract owner. */ function setUriSuffix( string calldata suffix_ ) external onlyOwner { uriSuffix = suffix_; } /** * @dev Updates the ME and PA treasuries * * Requirements: * * - Caller must be the contract owner. */ function setTreasuries( address meTreasury_, address paTreasury_ ) external onlyOwner { paTreasuryAddress = paTreasury_; meTreasuryAddress = meTreasury_; } /** * @dev See {IWhitelistable-setWhitelist}. * * Requirements: * * - Caller must be the contract owner. * - Sale state must be {SaleState.CLOSED}. */ function setWhitelist( bytes32 root_ ) external onlyOwner saleClosed { _setWhitelist( root_ ); } /** * @dev Withdraws '_amount' of ETH stored in the contract and sends 2.75% to ME treasury and the remainder to the PA treasury. * * Requirements: * * - Caller must be the contract owner. * - '_amount' must be */ function withdraw(uint256 _amount) external onlyOwner { if (address(this).balance == 0) { revert EZU_NO_ETHER_BALANCE(); } uint256 me_percentage = 275; // 2.75% uint256 me_cut = (_amount * me_percentage) / 1e4; uint256 pa_cut = _amount - me_cut; _sendValue( payable( paTreasuryAddress ), pa_cut ); _sendValue( payable( meTreasuryAddress ), me_cut ); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /** * @dev See {IERC2981-royaltyInfo}. * * Requirements: * * - `tokenId_` must exist. */ function royaltyInfo( uint256 tokenId_, uint256 salePrice_ ) public view virtual override exists( tokenId_ ) returns ( address, uint256 ) { return super.royaltyInfo( tokenId_, salePrice_ ); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId_ ) public view virtual override(Reg_ERC721Batch, ERC2981Base) returns ( bool ) { return ERC2981Base.supportsInterface( interfaceId_ ) || Reg_ERC721Batch.supportsInterface( interfaceId_ ); } /** * @dev returns an array of token ids owned by `_owner` */ function tokensOfWalletOwner( address _owner ) public view returns ( uint256[] memory ) { uint256 tokenCount = _balanceOf(_owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } /** * @dev returns either: * 'baseURI` * OR * 'baseURI' + 'tokenId' + 'uriSuffix' */ function tokenURI( uint256 tokenId ) public view virtual override returns ( string memory ) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (bytes( _baseURI ).length == 0) return ""; if ( isRevealed ) return string(abi.encodePacked( _baseURI, _toString( tokenId ), uriSuffix)); return string(abi.encodePacked( _baseURI )); } // ************************************** }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * Author: Lambdalf the White */ import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ abstract contract Reg_ERC721Batch is Context, IERC721Metadata, IERC721Enumerable { // Errors error IERC721_CALLER_NOT_APPROVED( address tokenOwner, address operator, uint256 tokenId ); error IERC721_NONEXISTANT_TOKEN( uint256 tokenId ); error IERC721_NON_ERC721_RECEIVER( address receiver ); error IERC721_INVALID_APPROVAL( address operator ); error IERC721_INVALID_TRANSFER( address recipient ); error IERC721Enumerable_INDEX_OUT_OF_BOUNDS( uint256 index ); error IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS( address tokenOwner, uint256 index ); error IERC721_INVALID_TRANSFER_FROM(); error IERC721_NFT_INVALID_QTY(); uint256 private _nextId = 1; string public name; string public symbol; // Mapping from token ID to approved address mapping( uint256 => address ) public getApproved; // Mapping from owner to operator approvals mapping( address => mapping( address => bool ) ) private _operatorApprovals; // List of owner addresses mapping( uint256 => address ) private _owners; // Token Base URI string internal _baseURI; /** * @dev Ensures the token exist. * A token exists if it has been minted and is not owned by the null address. * * @param tokenId_ uint256 ID of the token to verify */ modifier exists( uint256 tokenId_ ) { if ( ! _exists( tokenId_ ) ) { revert IERC721_NONEXISTANT_TOKEN( tokenId_ ); } _; } /** * @dev Ensures that 'qty_' is greater than 0. * * @param qty_ uint256 ID of the token to verify */ modifier validateAmount( uint256 qty_ ) { if ( qty_ == 0 ) { revert IERC721_NFT_INVALID_QTY(); } _; } // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Internal function returning the number of tokens in `tokenOwner_`'s account. */ function _balanceOf( address tokenOwner_ ) internal view virtual returns ( uint256 ) { if ( tokenOwner_ == address( 0 ) ) { return 0; } uint256 _count_ = 0; address _currentTokenOwner_; for ( uint256 i = 1; i < _nextId; ++ i ) { if ( _exists( i ) ) { if ( _owners[ i ] != address( 0 ) ) { _currentTokenOwner_ = _owners[ i ]; } if ( tokenOwner_ == _currentTokenOwner_ ) { _count_++; } } } return _count_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from_ address representing the previous owner of the given token ID * @param to_ target address that will receive the tokens * @param tokenId_ uint256 ID of the token to be transferred * @param data_ bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from_, address to_, uint256 tokenId_, bytes memory data_ ) internal virtual returns ( bool ) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // // IMPORTANT // It is unsafe to assume that an address not flagged by this method // is an externally-owned account (EOA) and not a contract. // // Among others, the following types of addresses will not be flagged: // // - 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 uint256 _size_; assembly { _size_ := extcodesize( to_ ) } // If address is a contract, check that it is aware of how to handle ERC721 tokens if ( _size_ > 0 ) { try IERC721Receiver( to_ ).onERC721Received( _msgSender(), from_, tokenId_, data_ ) returns ( bytes4 retval ) { return retval == IERC721Receiver.onERC721Received.selector; } catch ( bytes memory reason ) { if ( reason.length == 0 ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } else { assembly { revert( add( 32, reason ), mload( reason ) ) } } } } else { return true; } } /** * @dev Internal function returning whether a token exists. * A token exists if it has been minted and is not owned by the null address. * * @param tokenId_ uint256 ID of the token to verify * * @return bool whether the token exists */ function _exists( uint256 tokenId_ ) internal view virtual returns ( bool ) { if ( tokenId_ == 0 ) { return false; } return tokenId_ < _nextId; } /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function _initERC721Metadata( string memory name_, string memory symbol_, string memory baseURI_ ) internal { name = name_; symbol = symbol_; _baseURI = baseURI_; } /** * @dev Internal function returning whether `operator_` is allowed * to manage tokens on behalf of `tokenOwner_`. * * @param tokenOwner_ address that owns tokens * @param operator_ address that tries to manage tokens * * @return bool whether `operator_` is allowed to handle the token */ function _isApprovedForAll( address tokenOwner_, address operator_ ) internal view virtual returns ( bool ) { return _operatorApprovals[ tokenOwner_ ][ operator_ ]; } /** * @dev Internal function returning whether `operator_` is allowed to handle `tokenId_` * * Note: To avoid multiple checks for the same data, it is assumed that existence of `tokeId_` * has been verified prior via {_exists} * If it hasn't been verified, this function might panic * * @param operator_ address that tries to handle the token * @param tokenId_ uint256 ID of the token to be handled * * @return bool whether `operator_` is allowed to handle the token */ function _isApprovedOrOwner( address tokenOwner_, address operator_, uint256 tokenId_ ) internal view virtual returns ( bool ) { bool _isApproved_ = operator_ == tokenOwner_ || operator_ == getApproved[ tokenId_ ] || _isApprovedForAll( tokenOwner_, operator_ ); return _isApproved_; } /** * @dev Mints `qty_` tokens and transfers them to `to_`. * * This internal function can be used to perform token minting. * * Emits one or more {Transfer} event. */ function _mint( address to_, uint256 qty_ ) internal virtual validateAmount( qty_ ) { uint256 _firstToken_ = _nextId; uint256 _nextStart_ = _firstToken_ + qty_; uint256 _lastToken_ = _nextStart_ - 1; _owners[ _firstToken_ ] = to_; if ( _lastToken_ > _firstToken_ ) { _owners[ _lastToken_ ] = to_; } _nextId = _nextStart_; if ( ! _checkOnERC721Received( address( 0 ), to_, _firstToken_, "" ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } for ( uint256 i = _firstToken_; i < _nextStart_; ++i ) { emit Transfer( address( 0 ), to_, i ); } } /** * @dev Internal function returning the owner of the `tokenId_` token. * * @param tokenId_ uint256 ID of the token to verify * * @return address the address of the token owner */ function _ownerOf( uint256 tokenId_ ) internal view virtual returns ( address ) { uint256 _tokenId_ = tokenId_; address _tokenOwner_ = _owners[ _tokenId_ ]; while ( _tokenOwner_ == address( 0 ) ) { _tokenId_ --; _tokenOwner_ = _owners[ _tokenId_ ]; } return _tokenOwner_; } /** * @dev Internal function used to set the base URI of the collection. */ function _setBaseURI( string memory baseURI_ ) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function returning the total supply. */ function _totalSupply() internal view virtual returns ( uint256 ) { return supplyMinted(); } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString( uint256 value ) internal pure returns ( string memory ) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if ( value == 0 ) { return "0"; } uint256 temp = value; uint256 digits; while ( temp != 0 ) { digits ++; temp /= 10; } bytes memory buffer = new bytes( digits ); while ( value != 0 ) { digits -= 1; buffer[ digits ] = bytes1( uint8( 48 + uint256( value % 10 ) ) ); value /= 10; } return string( buffer ); } /** * @dev Transfers `tokenId_` from `from_` to `to_`. * * This internal function can be used to implement alternative mechanisms to perform * token transfer, such as signature-based, or token burning. * * Emits a {Transfer} event. */ function _transfer( address from_, address to_, uint256 tokenId_ ) internal virtual { getApproved[ tokenId_ ] = address( 0 ); uint256 _previousId_ = tokenId_ > 1 ? tokenId_ - 1 : 1; uint256 _nextId_ = tokenId_ + 1; bool _previousShouldUpdate_ = _previousId_ < tokenId_ && _exists( _previousId_ ) && _owners[ _previousId_ ] == address( 0 ); bool _nextShouldUpdate_ = _exists( _nextId_ ) && _owners[ _nextId_ ] == address( 0 ); if ( _previousShouldUpdate_ ) { _owners[ _previousId_ ] = from_; } if ( _nextShouldUpdate_ ) { _owners[ _nextId_ ] = from_; } _owners[ tokenId_ ] = to_; emit Transfer( from_, to_, tokenId_ ); } // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /** * @dev See {IERC721-approve}. */ function approve( address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == _tokenOwner_ ) { revert IERC721_INVALID_APPROVAL( to_ ); } getApproved[ tokenId_ ] = to_; emit Approval( _tokenOwner_, to_, tokenId_ ); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from_, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); if ( from_ != _tokenOwner_ ) { revert IERC721_INVALID_TRANSFER_FROM(); } bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, "" ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from_, address to_, uint256 tokenId_, bytes calldata data_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); if ( from_ != _tokenOwner_ ) { revert IERC721_INVALID_TRANSFER_FROM(); } bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, data_ ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll( address operator_, bool approved_ ) public virtual override { address _account_ = _msgSender(); if ( operator_ == _account_ ) { revert IERC721_INVALID_APPROVAL( operator_ ); } _operatorApprovals[ _account_ ][ operator_ ] = approved_; emit ApprovalForAll( _account_, operator_, approved_ ); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from_, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); if ( from_ != _tokenOwner_ ) { revert IERC721_INVALID_TRANSFER_FROM(); } bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /** * @dev Returns the number of tokens in `tokenOwner_`'s account. */ function balanceOf( address tokenOwner_ ) public view virtual returns ( uint256 ) { return _balanceOf( tokenOwner_ ); } /** * @dev Returns if the `operator_` is allowed to manage all of the assets of `tokenOwner_`. * * See {setApprovalForAll} */ function isApprovedForAll( address tokenOwner_, address operator_ ) public view virtual returns ( bool ) { return _isApprovedForAll( tokenOwner_, operator_ ); } /** * @dev Returns the owner of the `tokenId_` token. * * Requirements: * * - `tokenId_` must exist. */ function ownerOf( uint256 tokenId_ ) public view virtual exists( tokenId_ ) returns ( address ) { return _ownerOf( tokenId_ ); } /** * @dev Returns the total number of tokens minted * * @return uint256 the number of tokens that have been minted so far */ function supplyMinted() public view virtual returns ( uint256 ) { return _nextId - 1; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId_ ) public view virtual override returns ( bool ) { return interfaceId_ == type( IERC721Enumerable ).interfaceId || interfaceId_ == type( IERC721Metadata ).interfaceId || interfaceId_ == type( IERC721 ).interfaceId || interfaceId_ == type( IERC165 ).interfaceId; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex( uint256 index_ ) public view virtual override returns ( uint256 ) { if ( index_ >= supplyMinted() ) { revert IERC721Enumerable_INDEX_OUT_OF_BOUNDS( index_ ); } return index_; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex( address tokenOwner_, uint256 index_ ) public view virtual override returns ( uint256 tokenId ) { if ( index_ >= _balanceOf( tokenOwner_ ) ) { revert IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS( tokenOwner_, index_ ); } uint256 _count_ = 0; for ( uint256 i = 1; i < _nextId; i++ ) { if ( _exists( i ) && tokenOwner_ == _ownerOf( i ) ) { if ( index_ == _count_ ) { return i; } _count_++; } } } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI( uint256 tokenId_ ) public view virtual override exists( tokenId_ ) returns ( string memory ) { return bytes( _baseURI ).length > 0 ? string( abi.encodePacked( _baseURI, _toString( tokenId_ ) ) ) : _toString( tokenId_ ); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns ( uint256 ) { return _totalSupply(); } // ************************************** }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * Author: Lambdalf the White */ import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; abstract contract ERC2981Base is IERC165, IERC2981 { // Errors error IERC2981_INVALID_ROYALTIES(); // Royalty rate is stored out of 10,000 instead of a percentage to allow for // up to two digits below the unit such as 2.5% or 1.25%. uint private constant ROYALTY_BASE = 10000; // Represents the percentage of royalties on each sale on secondary markets. // Set to 0 to have no royalties. uint256 private _royaltyRate; // Address of the recipient of the royalties. address private _royaltyRecipient; function _initERC2981Base( address royaltyRecipient_, uint256 royaltyRate_ ) internal { _setRoyaltyInfo( royaltyRecipient_, royaltyRate_ ); } /** * @dev See {IERC2981-royaltyInfo}. * * Note: This function should be overriden to revert on a query for non existent token. */ function royaltyInfo( uint256, uint256 salePrice_ ) public view virtual override returns ( address, uint256 ) { if ( salePrice_ == 0 || _royaltyRate == 0 ) { return ( _royaltyRecipient, 0 ); } uint256 _royaltyAmount_ = _royaltyRate * salePrice_ / ROYALTY_BASE; return ( _royaltyRecipient, _royaltyAmount_ ); } /** * @dev Sets the royalty rate to `royaltyRate_` and the royalty recipient to `royaltyRecipient_`. * * Requirements: * * - `royaltyRate_` cannot be higher than `ROYALTY_BASE`; */ function _setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) internal virtual { if ( royaltyRate_ > ROYALTY_BASE ) { revert IERC2981_INVALID_ROYALTIES(); } _royaltyRate = royaltyRate_; _royaltyRecipient = royaltyRecipient_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId_ ) public view virtual override returns ( bool ) { return interfaceId_ == type( IERC2981 ).interfaceId || interfaceId_ == type( IERC165 ).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * Author: Lambdalf the White */ /** * @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 IOwnable { // Errors error IOwnable_NOT_OWNER(); // The owner of the contract address private _owner; /** * @dev Emitted when contract ownership changes. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function _initIOwnable( address owner_ ) internal { _owner = owner_; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns ( address ) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { if ( owner() != msg.sender ) { revert IOwnable_NOT_OWNER(); } _; } /** * @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 { address _oldOwner_ = _owner; _owner = newOwner_; emit OwnershipTransferred( _oldOwner_, newOwner_ ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * Author: Lambdalf the White */ abstract contract IPausable { // Errors error IPausable_SALE_NOT_CLOSED(); error IPausable_SALE_NOT_OPEN(); error IPausable_PRESALE_NOT_OPEN(); // Enum to represent the sale state, defaults to ``CLOSED``. enum SaleState { CLOSED, PRESALE, SALE } // The current state of the contract SaleState public saleState; /** * @dev Emitted when the sale state changes */ event SaleStateChanged( SaleState indexed previousState, SaleState indexed newState ); /** * @dev Sale state can have one of 3 values, ``CLOSED``, ``PRESALE``, or ``SALE``. */ function _setSaleState( SaleState newState_ ) internal virtual { SaleState _previousState_ = saleState; saleState = newState_; emit SaleStateChanged( _previousState_, newState_ ); } /** * @dev Throws if sale state is not ``CLOSED``. */ modifier saleClosed { if ( saleState != SaleState.CLOSED ) { revert IPausable_SALE_NOT_CLOSED(); } _; } /** * @dev Throws if sale state is not ``SALE``. */ modifier saleOpen { if ( saleState != SaleState.SALE ) { revert IPausable_SALE_NOT_OPEN(); } _; } /** * @dev Throws if sale state is not ``PRESALE``. */ modifier presaleOpen { if ( saleState != SaleState.PRESALE ) { revert IPausable_PRESALE_NOT_OPEN(); } _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * Author: Lambdalf the White * Edit : Squeebo */ // import "./MerkleProof.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "hardhat/console.sol"; abstract contract IWhitelistable { // Errors error IWhitelistable_NOT_SET(); error IWhitelistable_CONSUMED(); error IWhitelistable_FORBIDDEN(); error IWhitelistable_NO_ALLOWANCE(); bytes32 private _root; mapping( address => uint256 ) private _consumed; modifier isWhitelisted( address account_, bytes32[] memory proof_, uint256 passMax_, uint256 qty_ ) { if ( qty_ > passMax_ ) { revert IWhitelistable_FORBIDDEN(); } uint256 _allowed_ = _checkWhitelistAllowance( account_, proof_, passMax_ ); if ( _allowed_ < qty_ ) { revert IWhitelistable_FORBIDDEN(); } _; } /** * @dev Sets the pass to protect the whitelist. */ function _setWhitelist( bytes32 root_ ) internal virtual { _root = root_; } /** * @dev Returns the amount that `account_` is allowed to access from the whitelist. * * Requirements: * * - `_root` must be set. * * See {IWhitelistable-_consumeWhitelist}. */ function _checkWhitelistAllowance( address account_, bytes32[] memory proof_, uint256 passMax_ ) internal view returns ( uint256 ) { if ( _root == 0 ) { revert IWhitelistable_NOT_SET(); } if ( _consumed[ account_ ] >= passMax_ ) { revert IWhitelistable_CONSUMED(); } if ( ! _computeProof( account_, proof_ ) ) { revert IWhitelistable_FORBIDDEN(); } uint256 _res_; unchecked { _res_ = passMax_ - _consumed[ account_ ]; } return _res_; } function _computeProof( address account_, bytes32[] memory proof_ ) private view returns ( bool ) { bytes32 leaf = keccak256(abi.encodePacked(account_)); return MerkleProof.processProof( proof_, leaf ) == _root; } /** * @dev Consumes `amount_` pass passes from `account_`. * * Note: Before calling this function, eligibility should be checked through {IWhitelistable-checkWhitelistAllowance}. */ function _consumeWhitelist( address account_, uint256 qty_ ) internal { unchecked { _consumed[ account_ ] += qty_; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// 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 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 5000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"royaltyRate_","type":"uint256"},{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EZU_EXTERNAL_CONTRACT","type":"error"},{"inputs":[],"name":"EZU_INCORRECT_PRICE","type":"error"},{"inputs":[],"name":"EZU_MAX_PER_TXN","type":"error"},{"inputs":[],"name":"EZU_MAX_PRESALE_SUPPLY","type":"error"},{"inputs":[],"name":"EZU_MAX_SUPPLY","type":"error"},{"inputs":[],"name":"EZU_NOT_CROSSMINT","type":"error"},{"inputs":[],"name":"EZU_NO_ETHER_BALANCE","type":"error"},{"inputs":[],"name":"EZU_TRANSFER_FAIL","type":"error"},{"inputs":[],"name":"IERC2981_INVALID_ROYALTIES","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_CALLER_NOT_APPROVED","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IERC721_INVALID_APPROVAL","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"IERC721_INVALID_TRANSFER","type":"error"},{"inputs":[],"name":"IERC721_INVALID_TRANSFER_FROM","type":"error"},{"inputs":[],"name":"IERC721_NFT_INVALID_QTY","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_NONEXISTANT_TOKEN","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"IERC721_NON_ERC721_RECEIVER","type":"error"},{"inputs":[],"name":"IOwnable_NOT_OWNER","type":"error"},{"inputs":[],"name":"IPausable_PRESALE_NOT_OPEN","type":"error"},{"inputs":[],"name":"IPausable_SALE_NOT_CLOSED","type":"error"},{"inputs":[],"name":"IPausable_SALE_NOT_OPEN","type":"error"},{"inputs":[],"name":"IWhitelistable_CONSUMED","type":"error"},{"inputs":[],"name":"IWhitelistable_FORBIDDEN","type":"error"},{"inputs":[],"name":"IWhitelistable_NOT_SET","type":"error"},{"inputs":[],"name":"IWhitelistable_NO_ALLOWANCE","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum IPausable.SaleState","name":"previousState","type":"uint8"},{"indexed":true,"internalType":"enum IPausable.SaleState","name":"newState","type":"uint8"}],"name":"SaleStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CROSSMINT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ALLOWANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"crossmintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"},{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"revealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum IPausable.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"uint256","name":"royaltyRate_","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPresalePrice_","type":"uint256"},{"internalType":"uint256","name":"newPublicPrice_","type":"uint256"}],"name":"setSalePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPausable.SaleState","name":"newState_","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"meTreasury_","type":"address"},{"internalType":"address","name":"paTreasury_","type":"address"}],"name":"setTreasuries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"suffix_","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfWalletOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600160008181556702c68af0bb140000600c819055600d55613a986080526128b460a052600260c05260e09190915273dab1a1854214684ace522439684a145e6250523361010052600e80546001600160a01b03191673218b622bbe4404c01f972f243952e3a1d2132dec179055600f80546001600160a81b03191673a55c2f8af10d603976deca0b61cd87ba2f9c6492179055610140604052610120908152601090620000ae908262000245565b50348015620000bc57600080fd5b5060405162003de838038062003de8833981016040819052620000df91620003c0565b600980546001600160a01b03191633179055620000fd848662000115565b6200010a83838362000125565b50505050506200047d565b62000121828262000157565b5050565b600162000133848262000245565b50600262000142838262000245565b50600662000151828262000245565b50505050565b6127108111156200017b57604051635b75946560e11b815260040160405180910390fd5b600755600880546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001cb57607f821691505b602082108103620001ec57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024057600081815260208120601f850160051c810160208610156200021b5750805b601f850160051c820191505b818110156200023c5782815560010162000227565b5050505b505050565b81516001600160401b03811115620002615762000261620001a0565b6200027981620002728454620001b6565b84620001f2565b602080601f831160018114620002b15760008415620002985750858301515b600019600386901b1c1916600185901b1785556200023c565b600085815260208120601f198616915b82811015620002e257888601518255948401946001909101908401620002c1565b5085821015620003015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200032357600080fd5b81516001600160401b0380821115620003405762000340620001a0565b604051601f8301601f19908116603f011681019082821181831017156200036b576200036b620001a0565b816040528381526020925086838588010111156200038857600080fd5b600091505b83821015620003ac57858201830151818301840152908201906200038d565b600093810190920192909252949350505050565b600080600080600060a08688031215620003d957600080fd5b855160208701519095506001600160a01b0381168114620003f957600080fd5b60408701519094506001600160401b03808211156200041757600080fd5b6200042589838a0162000311565b945060608801519150808211156200043c57600080fd5b6200044a89838a0162000311565b935060808801519150808211156200046157600080fd5b50620004708882890162000311565b9150509295509295909350565b60805160a05160c05160e051610100516138d96200050f60003960008181610592015281816114d70152611f310152600081816108560152818161184c0152611e8b015260008181610606015281816115380152611a23015260008181610690015281816115a9015281816118f101528181611a940152611f920152600081816104fe01526112d001526138d96000f3fe6080604052600436106103085760003560e01c8063571fe0161161019a5780639e6b2c5b116100e1578063c87b56dd1161008a578063e2e784d511610064578063e2e784d51461090b578063e985e9c51461092b578063f2fde38b1461094b57600080fd5b8063c87b56dd146108ab578063cd158e92146108cb578063d5dc2439146108eb57600080fd5b8063addfb0d4116100bb578063addfb0d414610844578063b88d4fde14610878578063c2e4f26b1461089857600080fd5b80639e6b2c5b146107fe578063a0712d6814610811578063a22cb4651461082457600080fd5b80636bde262711610143578063859b584c1161011d578063859b584c1461079e5780638da5cb5b146107cb57806395d89b41146107e957600080fd5b80636bde26271461075357806370a08231146107695780637e9845f51461078957600080fd5b80635abe7dff116101745780635abe7dff146106e5578063603f4d52146107055780636352211e1461073357600080fd5b8063571fe0161461067e57806358891a37146106b25780635a67de07146106c557600080fd5b80632f745c591161025e5780634d158c641161020757806354214f69116101e157806354214f69146106285780635503a0e81461064957806355f804b31461065e57600080fd5b80634d158c64146105b45780634f6ccce7146105d457806351b96d92146105f457600080fd5b8063440bc7f311610238578063440bc7f314610540578063484b973c146105605780634cdc873e1461058057600080fd5b80632f745c59146104cc57806332cb6b0c146104ec57806342842e0e1461052057600080fd5b806316ba10e0116102c05780632a234e571161029a5780632a234e57146104575780632a55205a1461046d5780632e1a7d4d146104ac57600080fd5b806316ba10e0146103f457806318160ddd1461041457806323b872dd1461043757600080fd5b8063081812fc116102f1578063081812fc14610364578063095ea7b3146103b25780630cb71584146103d457600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612ff6565b61096b565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5061035761098b565b6040516103399190613063565b34801561037057600080fd5b5061039a61037f366004613076565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610339565b3480156103be57600080fd5b506103d26103cd3660046130ab565b610a19565b005b3480156103e057600080fd5b506103d26103ef366004613117565b610b91565b34801561040057600080fd5b506103d261040f366004613117565b610c7e565b34801561042057600080fd5b50610429610cca565b604051908152602001610339565b34801561044357600080fd5b506103d2610452366004613159565b610cd9565b34801561046357600080fd5b50610429600c5481565b34801561047957600080fd5b5061048d610488366004613195565b610e34565b604080516001600160a01b039093168352602083019190915201610339565b3480156104b857600080fd5b506103d26104c7366004613076565b610e90565b3480156104d857600080fd5b506104296104e73660046130ab565b610f63565b3480156104f857600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000081565b34801561052c57600080fd5b506103d261053b366004613159565b611032565b34801561054c57600080fd5b506103d261055b366004613076565b6111e0565b34801561056c57600080fd5b506103d261057b3660046130ab565b61127d565b34801561058c57600080fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c057600080fd5b506103d26105cf3660046131b7565b611332565b3480156105e057600080fd5b506104296105ef366004613076565b6113aa565b34801561060057600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000081565b34801561063457600080fd5b50600f5461032d90600160a01b900460ff1681565b34801561065557600080fd5b506103576113f3565b34801561066a57600080fd5b506103d2610679366004613117565b611400565b34801561068a57600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000081565b6103d26106c03660046130ab565b61147d565b3480156106d157600080fd5b506103d26106e03660046131ea565b611647565b3480156106f157600080fd5b506103d2610700366004613195565b61168a565b34801561071157600080fd5b5060095461072690600160a01b900460ff1681565b6040516103399190613221565b34801561073f57600080fd5b5061039a61074e366004613076565b6116cf565b34801561075f57600080fd5b50610429600d5481565b34801561077557600080fd5b50610429610784366004613249565b611726565b34801561079557600080fd5b50610429611731565b3480156107aa57600080fd5b506107be6107b9366004613249565b611742565b6040516103399190613264565b3480156107d757600080fd5b506009546001600160a01b031661039a565b3480156107f557600080fd5b506103576117e4565b6103d261080c366004613359565b6117f1565b6103d261081f366004613076565b6119ca565b34801561083057600080fd5b506103d261083f3660046133a0565b611b76565b34801561085057600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000081565b34801561088457600080fd5b506103d26108933660046133dc565b611c50565b6103d26108a636600461344b565b611e30565b3480156108b757600080fd5b506103576108c6366004613076565b61206a565b3480156108d757600080fd5b50600f5461039a906001600160a01b031681565b3480156108f757600080fd5b50600e5461039a906001600160a01b031681565b34801561091757600080fd5b506103d26109263660046130ab565b612184565b34801561093757600080fd5b5061032d6109463660046131b7565b6121c8565b34801561095757600080fd5b506103d2610966366004613249565b6121fb565b600061097682612294565b8061098557506109858261232c565b92915050565b60018054610998906134a2565b80601f01602080910402602001604051908101604052809291908181526020018280546109c4906134a2565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b505050505081565b80610a238161245c565b610a61576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b336000610a6d84612476565b90506000610a7c8284876124cd565b905080610acf576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b816001600160a01b0316866001600160a01b031603610b25576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b600085815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b33610ba46009546001600160a01b031690565b6001600160a01b031614610bcb576040516301b09f9f60e01b815260040160405180910390fd5b610c0a82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254292505050565b60408051808201909152600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020820152601090610c4b9082613524565b5050600f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b17905550565b33610c916009546001600160a01b031690565b6001600160a01b031614610cb8576040516301b09f9f60e01b815260040160405180910390fd5b6010610cc58284836135e4565b505050565b6000610cd461254e565b905090565b80610ce38161245c565b610d1c576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b336000610d2884612476565b9050806001600160a01b0316866001600160a01b031614610d75576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d828284876124cd565b905080610dd5576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b6001600160a01b038616610e20576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b610e2b828787612558565b50505050505050565b60008083610e418161245c565b610e7a576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b610e8485856126f5565b92509250509250929050565b33610ea36009546001600160a01b031690565b6001600160a01b031614610eca576040516301b09f9f60e01b815260040160405180910390fd5b47600003610f04576040517fd90a9c3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101136000612710610f1683856136bb565b610f2091906136f0565b90506000610f2e8285613704565b600e54909150610f47906001600160a01b031682612755565b600f54610f5d906001600160a01b031683612755565b50505050565b6000610f6e8361281c565b8210610fb8576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610a58565b600060015b60005481101561102a57610fd08161245c565b8015610ff55750610fe081612476565b6001600160a01b0316856001600160a01b0316145b156110185781840361100a5791506109859050565b8161101481613717565b9250505b8061102281613717565b915050610fbd565b505092915050565b8061103c8161245c565b611075576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b33600061108184612476565b9050806001600160a01b0316866001600160a01b0316146110ce576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110db8284876124cd565b90508061112e576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b6001600160a01b038616611179576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b611184828787612558565b61119f828787604051806020016040528060008152506128ca565b610e2b576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b336111f36009546001600160a01b031690565b6001600160a01b03161461121a576040516301b09f9f60e01b815260040160405180910390fd5b6000600954600160a01b900460ff16600281111561123a5761123a61320b565b14611271576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127a81600a55565b50565b336112906009546001600160a01b031690565b6001600160a01b0316146112b7576040516301b09f9f60e01b815260040160405180910390fd5b6000816112c261254e565b6112cc9190613731565b90507f0000000000000000000000000000000000000000000000000000000000000000811115611328576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc58383612a37565b336113456009546001600160a01b031690565b6001600160a01b03161461136c576040516301b09f9f60e01b815260040160405180910390fd5b600e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f8054939092169216919091179055565b60006113b4611731565b82106113ef576040517f125c19b000000000000000000000000000000000000000000000000000000000815260048101839052602401610a58565b5090565b60108054610998906134a2565b336114136009546001600160a01b031690565b6001600160a01b03161461143a576040516301b09f9f60e01b815260040160405180910390fd5b61147982828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254292505050565b5050565b6002600954600160a01b900460ff16600281111561149d5761149d61320b565b146114d4576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611536576040517f8bae333500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611590576040517fbb8a689a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008161159b61254e565b6115a59190613731565b90507f0000000000000000000000000000000000000000000000000000000000000000811115611601576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34600d548361161091906136bb565b14611328576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361165a6009546001600160a01b031690565b6001600160a01b031614611681576040516301b09f9f60e01b815260040160405180910390fd5b61127a81612bb9565b3361169d6009546001600160a01b031690565b6001600160a01b0316146116c4576040516301b09f9f60e01b815260040160405180910390fd5b600c91909155600d55565b6000816116db8161245c565b611714576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b61171d83612476565b91505b50919050565b60006109858261281c565b60006001600054610cd49190613704565b6060600061174f8361281c565b905060008167ffffffffffffffff81111561176c5761176c6132a8565b604051908082528060200260200182016040528015611795578160200160208202803683370190505b50905060005b828110156117dc576117ad8582610f63565b8282815181106117bf576117bf613744565b6020908102919091010152806117d481613717565b91505061179b565b509392505050565b60028054610998906134a2565b6001600954600160a01b900460ff1660028111156118115761181161320b565b14611848576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33817f000000000000000000000000000000000000000000000000000000000000000084818111156118a6576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118b3858585612c5a565b9050818110156118ef576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008761191961254e565b6119239190613731565b111561195b576040517f28fdd54500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3487600c5461196a91906136bb565b146119a1576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600b602052604090208054890190556119c08189612a37565b5050505050505050565b6002600954600160a01b900460ff1660028111156119ea576119ea61320b565b14611a21576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611a7b576040517fbb8a689a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081611a8661254e565b611a909190613731565b90507f0000000000000000000000000000000000000000000000000000000000000000811115611aec576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34600d5483611afb91906136bb565b14611b32576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611b6b576040517fc6223c5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610cc58184612a37565b336001600160a01b038316819003611bc5576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610a58565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b82611c5a8161245c565b611c93576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b336000611c9f86612476565b9050806001600160a01b0316886001600160a01b031614611cec576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cf98284896124cd565b905080611d4c576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101889052606401610a58565b6001600160a01b038816611d97576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610a58565b611da2828989612558565b611de482898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128ca92505050565b611e25576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610a58565b505050505050505050565b6001600954600160a01b900460ff166002811115611e5057611e5061320b565b14611e87576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82817f00000000000000000000000000000000000000000000000000000000000000008481811115611ee5576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ef2858585612c5a565b905081811015611f2e576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611f90576040517f8bae333500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000087611fba61254e565b611fc49190613731565b1115611ffc576040517f28fdd54500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3487600c5461200b91906136bb565b14612042576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0388166000908152600b602052604090208054880190556119c08888612a37565b60606120758261245c565b612101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a58565b6006805461210e906134a2565b905060000361212b57505060408051602081019091526000815290565b600f54600160a01b900460ff161561217257600661214883612d4c565b601060405160200161215c939291906137eb565b6040516020818303038152906040529050919050565b600660405160200161215c9190613813565b336121976009546001600160a01b031690565b6001600160a01b0316146121be576040516301b09f9f60e01b815260040160405180910390fd5b6114798282612e81565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff165b9392505050565b3361220e6009546001600160a01b031690565b6001600160a01b031614612235576040516301b09f9f60e01b815260040160405180910390fd5b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061098557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806123bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061240b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061098557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60008160000361246e57506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b0381166121f457816124a98161381f565b6000818152600560205260409020549093506001600160a01b031691506124919050565b600080846001600160a01b0316846001600160a01b0316148061250957506000838152600360205260409020546001600160a01b038581169116145b8061253957506001600160a01b0380861660009081526004602090815260408083209388168352929052205460ff165b95945050505050565b60066114798282613524565b6000610cd4611731565b6000818152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff191690556001821161259057600161259b565b61259b600183613704565b905060006125aa836001613731565b9050600083831080156125c157506125c18361245c565b80156125e257506000838152600560205260409020546001600160a01b0316155b905060006125ef8361245c565b801561261057506000838152600560205260409020546001600160a01b0316155b9050811561264d576000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b8015612688576000838152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b600085815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b6000808215806127055750600754155b1561271f5750506008546001600160a01b0316600061274e565b60006127108460075461273291906136bb565b61273c91906136f0565b6008546001600160a01b031693509150505b9250929050565b8047101561278f576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127dc576040519150601f19603f3d011682016040523d82523d6000602084013e6127e1565b606091505b5050905080610cc5576040517f3102f6f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b03821661283457506000919050565b60008060015b6000548110156128c15761284d8161245c565b156128b1576000818152600560205260409020546001600160a01b03161561288a576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b0316036128b157826128ad81613717565b9350505b6128ba81613717565b905061283a565b50909392505050565b6000833b8015612a29576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a029061291f9033908a9089908990600401613836565b6020604051808303816000875af192505050801561295a575060408051601f3d908101601f1916820190925261295791810190613872565b60015b6129dc573d808015612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b5080516000036129d4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150612a2f9050565b60019150505b949350505050565b8080600003612a72576040517fda1a0e9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490612a818483613731565b90506000612a90600183613704565b6000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038916179055905082811115612b03576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0388161790555b81600081905550612b2660008785604051806020016040528060008152506128ca565b612b67576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b825b82811015610e2b5760405181906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612bb281613717565b9050612b69565b60098054600160a01b80820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911690836002811115612c0457612c0461320b565b0217905550816002811115612c1b57612c1b61320b565b816002811115612c2d57612c2d61320b565b6040517fe2034a7bf30bb7c637ee4fd008478210b21708c5c7177151827a49a6877a020d90600090a35050565b600a546000908103612c98576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b60205260409020548211612ce9576040517fde33971400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cf38484612eef565b612d29576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0383166000908152600b602052604090205481039392505050565b606081600003612d8f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612db95780612da381613717565b9150612db29050600a836136f0565b9150612d93565b60008167ffffffffffffffff811115612dd457612dd46132a8565b6040519080825280601f01601f191660200182016040528015612dfe576020820181803683370190505b5090505b8415612a2f57612e13600183613704565b9150612e20600a8661388f565b612e2b906030613731565b60f81b818381518110612e4057612e40613744565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e7a600a866136f0565b9450612e02565b612710811115612ebd576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007556008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600a54612f4b8483612f54565b14949350505050565b600081815b84518110156117dc57612f8582868381518110612f7857612f78613744565b6020026020010151612f99565b915080612f9181613717565b915050612f59565b6000818310612fb55760008281526020849052604090206121f4565b60008381526020839052604090206121f4565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461127a57600080fd5b60006020828403121561300857600080fd5b81356121f481612fc8565b60005b8381101561302e578181015183820152602001613016565b50506000910152565b6000815180845261304f816020860160208601613013565b601f01601f19169290920160200192915050565b6020815260006121f46020830184613037565b60006020828403121561308857600080fd5b5035919050565b80356001600160a01b03811681146130a657600080fd5b919050565b600080604083850312156130be57600080fd5b6130c78361308f565b946020939093013593505050565b60008083601f8401126130e757600080fd5b50813567ffffffffffffffff8111156130ff57600080fd5b60208301915083602082850101111561274e57600080fd5b6000806020838503121561312a57600080fd5b823567ffffffffffffffff81111561314157600080fd5b61314d858286016130d5565b90969095509350505050565b60008060006060848603121561316e57600080fd5b6131778461308f565b92506131856020850161308f565b9150604084013590509250925092565b600080604083850312156131a857600080fd5b50508035926020909101359150565b600080604083850312156131ca57600080fd5b6131d38361308f565b91506131e16020840161308f565b90509250929050565b6000602082840312156131fc57600080fd5b8135600381106121f457600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324357634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325b57600080fd5b6121f48261308f565b6020808252825182820181905260009190848201906040850190845b8181101561329c57835183529284019291840191600101613280565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126132cf57600080fd5b8135602067ffffffffffffffff808311156132ec576132ec6132a8565b8260051b604051601f19603f83011681018181108482111715613311576133116132a8565b60405293845285810183019383810192508785111561332f57600080fd5b83870191505b8482101561334e57813583529183019190830190613335565b979650505050505050565b6000806040838503121561336c57600080fd5b82359150602083013567ffffffffffffffff81111561338a57600080fd5b613396858286016132be565b9150509250929050565b600080604083850312156133b357600080fd5b6133bc8361308f565b9150602083013580151581146133d157600080fd5b809150509250929050565b6000806000806000608086880312156133f457600080fd5b6133fd8661308f565b945061340b6020870161308f565b935060408601359250606086013567ffffffffffffffff81111561342e57600080fd5b61343a888289016130d5565b969995985093965092949392505050565b60008060006060848603121561346057600080fd5b6134698461308f565b925060208401359150604084013567ffffffffffffffff81111561348c57600080fd5b613498868287016132be565b9150509250925092565b600181811c908216806134b657607f821691505b60208210810361172057634e487b7160e01b600052602260045260246000fd5b601f821115610cc557600081815260208120601f850160051c810160208610156134fd5750805b601f850160051c820191505b8181101561351c57828155600101613509565b505050505050565b815167ffffffffffffffff81111561353e5761353e6132a8565b6135528161354c84546134a2565b846134d6565b602080601f831160018114613587576000841561356f5750858301515b600019600386901b1c1916600185901b17855561351c565b600085815260208120601f198616915b828110156135b657888601518255948401946001909101908401613597565b50858210156135d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff8311156135fc576135fc6132a8565b6136108361360a83546134a2565b836134d6565b6000601f841160018114613644576000851561362c5750838201355b600019600387901b1c1916600186901b17835561369e565b600083815260209020601f19861690835b828110156136755786850135825560209485019460019092019101613655565b50868210156136925760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156136d5576136d56136a5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826136ff576136ff6136da565b500490565b81810381811115610985576109856136a5565b6000600019820361372a5761372a6136a5565b5060010190565b80820180821115610985576109856136a5565b634e487b7160e01b600052603260045260246000fd5b60008154613767816134a2565b6001828116801561377f57600181146137b2576137e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528215158302870194506137e1565b8560005260208060002060005b858110156137d85781548a8201529084019082016137bf565b50505082870194505b5050505092915050565b60006137f7828661375a565b8451613807818360208901613013565b61334e8183018661375a565b60006121f4828461375a565b60008161382e5761382e6136a5565b506000190190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526138686080830184613037565b9695505050505050565b60006020828403121561388457600080fd5b81516121f481612fc8565b60008261389e5761389e6136da565b50069056fea264697066735822122085350301b55793a5b35a8dc819e783bbbb6d765da1dfad83891a71e71e83ea5064736f6c6343000810003300000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000218b622bbe4404c01f972f243952e3a1d2132dec00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000003455a5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003455a5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d58706e3632767743346d6851754e527a3975374d77376e427357455a4b64334a4d4c676365335835354175660000000000000000000000
Deployed Bytecode
0x6080604052600436106103085760003560e01c8063571fe0161161019a5780639e6b2c5b116100e1578063c87b56dd1161008a578063e2e784d511610064578063e2e784d51461090b578063e985e9c51461092b578063f2fde38b1461094b57600080fd5b8063c87b56dd146108ab578063cd158e92146108cb578063d5dc2439146108eb57600080fd5b8063addfb0d4116100bb578063addfb0d414610844578063b88d4fde14610878578063c2e4f26b1461089857600080fd5b80639e6b2c5b146107fe578063a0712d6814610811578063a22cb4651461082457600080fd5b80636bde262711610143578063859b584c1161011d578063859b584c1461079e5780638da5cb5b146107cb57806395d89b41146107e957600080fd5b80636bde26271461075357806370a08231146107695780637e9845f51461078957600080fd5b80635abe7dff116101745780635abe7dff146106e5578063603f4d52146107055780636352211e1461073357600080fd5b8063571fe0161461067e57806358891a37146106b25780635a67de07146106c557600080fd5b80632f745c591161025e5780634d158c641161020757806354214f69116101e157806354214f69146106285780635503a0e81461064957806355f804b31461065e57600080fd5b80634d158c64146105b45780634f6ccce7146105d457806351b96d92146105f457600080fd5b8063440bc7f311610238578063440bc7f314610540578063484b973c146105605780634cdc873e1461058057600080fd5b80632f745c59146104cc57806332cb6b0c146104ec57806342842e0e1461052057600080fd5b806316ba10e0116102c05780632a234e571161029a5780632a234e57146104575780632a55205a1461046d5780632e1a7d4d146104ac57600080fd5b806316ba10e0146103f457806318160ddd1461041457806323b872dd1461043757600080fd5b8063081812fc116102f1578063081812fc14610364578063095ea7b3146103b25780630cb71584146103d457600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612ff6565b61096b565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5061035761098b565b6040516103399190613063565b34801561037057600080fd5b5061039a61037f366004613076565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610339565b3480156103be57600080fd5b506103d26103cd3660046130ab565b610a19565b005b3480156103e057600080fd5b506103d26103ef366004613117565b610b91565b34801561040057600080fd5b506103d261040f366004613117565b610c7e565b34801561042057600080fd5b50610429610cca565b604051908152602001610339565b34801561044357600080fd5b506103d2610452366004613159565b610cd9565b34801561046357600080fd5b50610429600c5481565b34801561047957600080fd5b5061048d610488366004613195565b610e34565b604080516001600160a01b039093168352602083019190915201610339565b3480156104b857600080fd5b506103d26104c7366004613076565b610e90565b3480156104d857600080fd5b506104296104e73660046130ab565b610f63565b3480156104f857600080fd5b506104297f0000000000000000000000000000000000000000000000000000000000003a9881565b34801561052c57600080fd5b506103d261053b366004613159565b611032565b34801561054c57600080fd5b506103d261055b366004613076565b6111e0565b34801561056c57600080fd5b506103d261057b3660046130ab565b61127d565b34801561058c57600080fd5b5061039a7f000000000000000000000000dab1a1854214684ace522439684a145e6250523381565b3480156105c057600080fd5b506103d26105cf3660046131b7565b611332565b3480156105e057600080fd5b506104296105ef366004613076565b6113aa565b34801561060057600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000281565b34801561063457600080fd5b50600f5461032d90600160a01b900460ff1681565b34801561065557600080fd5b506103576113f3565b34801561066a57600080fd5b506103d2610679366004613117565b611400565b34801561068a57600080fd5b506104297f00000000000000000000000000000000000000000000000000000000000028b481565b6103d26106c03660046130ab565b61147d565b3480156106d157600080fd5b506103d26106e03660046131ea565b611647565b3480156106f157600080fd5b506103d2610700366004613195565b61168a565b34801561071157600080fd5b5060095461072690600160a01b900460ff1681565b6040516103399190613221565b34801561073f57600080fd5b5061039a61074e366004613076565b6116cf565b34801561075f57600080fd5b50610429600d5481565b34801561077557600080fd5b50610429610784366004613249565b611726565b34801561079557600080fd5b50610429611731565b3480156107aa57600080fd5b506107be6107b9366004613249565b611742565b6040516103399190613264565b3480156107d757600080fd5b506009546001600160a01b031661039a565b3480156107f557600080fd5b506103576117e4565b6103d261080c366004613359565b6117f1565b6103d261081f366004613076565b6119ca565b34801561083057600080fd5b506103d261083f3660046133a0565b611b76565b34801561085057600080fd5b506104297f000000000000000000000000000000000000000000000000000000000000000181565b34801561088457600080fd5b506103d26108933660046133dc565b611c50565b6103d26108a636600461344b565b611e30565b3480156108b757600080fd5b506103576108c6366004613076565b61206a565b3480156108d757600080fd5b50600f5461039a906001600160a01b031681565b3480156108f757600080fd5b50600e5461039a906001600160a01b031681565b34801561091757600080fd5b506103d26109263660046130ab565b612184565b34801561093757600080fd5b5061032d6109463660046131b7565b6121c8565b34801561095757600080fd5b506103d2610966366004613249565b6121fb565b600061097682612294565b8061098557506109858261232c565b92915050565b60018054610998906134a2565b80601f01602080910402602001604051908101604052809291908181526020018280546109c4906134a2565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b505050505081565b80610a238161245c565b610a61576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b336000610a6d84612476565b90506000610a7c8284876124cd565b905080610acf576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b816001600160a01b0316866001600160a01b031603610b25576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b600085815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b33610ba46009546001600160a01b031690565b6001600160a01b031614610bcb576040516301b09f9f60e01b815260040160405180910390fd5b610c0a82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254292505050565b60408051808201909152600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020820152601090610c4b9082613524565b5050600f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b17905550565b33610c916009546001600160a01b031690565b6001600160a01b031614610cb8576040516301b09f9f60e01b815260040160405180910390fd5b6010610cc58284836135e4565b505050565b6000610cd461254e565b905090565b80610ce38161245c565b610d1c576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b336000610d2884612476565b9050806001600160a01b0316866001600160a01b031614610d75576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d828284876124cd565b905080610dd5576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b6001600160a01b038616610e20576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b610e2b828787612558565b50505050505050565b60008083610e418161245c565b610e7a576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b610e8485856126f5565b92509250509250929050565b33610ea36009546001600160a01b031690565b6001600160a01b031614610eca576040516301b09f9f60e01b815260040160405180910390fd5b47600003610f04576040517fd90a9c3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101136000612710610f1683856136bb565b610f2091906136f0565b90506000610f2e8285613704565b600e54909150610f47906001600160a01b031682612755565b600f54610f5d906001600160a01b031683612755565b50505050565b6000610f6e8361281c565b8210610fb8576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610a58565b600060015b60005481101561102a57610fd08161245c565b8015610ff55750610fe081612476565b6001600160a01b0316856001600160a01b0316145b156110185781840361100a5791506109859050565b8161101481613717565b9250505b8061102281613717565b915050610fbd565b505092915050565b8061103c8161245c565b611075576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b33600061108184612476565b9050806001600160a01b0316866001600160a01b0316146110ce576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110db8284876124cd565b90508061112e576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610a58565b6001600160a01b038616611179576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b611184828787612558565b61119f828787604051806020016040528060008152506128ca565b610e2b576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b336111f36009546001600160a01b031690565b6001600160a01b03161461121a576040516301b09f9f60e01b815260040160405180910390fd5b6000600954600160a01b900460ff16600281111561123a5761123a61320b565b14611271576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127a81600a55565b50565b336112906009546001600160a01b031690565b6001600160a01b0316146112b7576040516301b09f9f60e01b815260040160405180910390fd5b6000816112c261254e565b6112cc9190613731565b90507f0000000000000000000000000000000000000000000000000000000000003a98811115611328576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc58383612a37565b336113456009546001600160a01b031690565b6001600160a01b03161461136c576040516301b09f9f60e01b815260040160405180910390fd5b600e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f8054939092169216919091179055565b60006113b4611731565b82106113ef576040517f125c19b000000000000000000000000000000000000000000000000000000000815260048101839052602401610a58565b5090565b60108054610998906134a2565b336114136009546001600160a01b031690565b6001600160a01b03161461143a576040516301b09f9f60e01b815260040160405180910390fd5b61147982828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254292505050565b5050565b6002600954600160a01b900460ff16600281111561149d5761149d61320b565b146114d4576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337f000000000000000000000000dab1a1854214684ace522439684a145e625052336001600160a01b031614611536576040517f8bae333500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000002811115611590576040517fbb8a689a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008161159b61254e565b6115a59190613731565b90507f00000000000000000000000000000000000000000000000000000000000028b4811115611601576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34600d548361161091906136bb565b14611328576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361165a6009546001600160a01b031690565b6001600160a01b031614611681576040516301b09f9f60e01b815260040160405180910390fd5b61127a81612bb9565b3361169d6009546001600160a01b031690565b6001600160a01b0316146116c4576040516301b09f9f60e01b815260040160405180910390fd5b600c91909155600d55565b6000816116db8161245c565b611714576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b61171d83612476565b91505b50919050565b60006109858261281c565b60006001600054610cd49190613704565b6060600061174f8361281c565b905060008167ffffffffffffffff81111561176c5761176c6132a8565b604051908082528060200260200182016040528015611795578160200160208202803683370190505b50905060005b828110156117dc576117ad8582610f63565b8282815181106117bf576117bf613744565b6020908102919091010152806117d481613717565b91505061179b565b509392505050565b60028054610998906134a2565b6001600954600160a01b900460ff1660028111156118115761181161320b565b14611848576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33817f000000000000000000000000000000000000000000000000000000000000000184818111156118a6576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118b3858585612c5a565b9050818110156118ef576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000028b48761191961254e565b6119239190613731565b111561195b576040517f28fdd54500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3487600c5461196a91906136bb565b146119a1576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600b602052604090208054890190556119c08189612a37565b5050505050505050565b6002600954600160a01b900460ff1660028111156119ea576119ea61320b565b14611a21576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000002811115611a7b576040517fbb8a689a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081611a8661254e565b611a909190613731565b90507f00000000000000000000000000000000000000000000000000000000000028b4811115611aec576040517fc95e341600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34600d5483611afb91906136bb565b14611b32576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611b6b576040517fc6223c5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610cc58184612a37565b336001600160a01b038316819003611bc5576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610a58565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b82611c5a8161245c565b611c93576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a58565b336000611c9f86612476565b9050806001600160a01b0316886001600160a01b031614611cec576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cf98284896124cd565b905080611d4c576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101889052606401610a58565b6001600160a01b038816611d97576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610a58565b611da2828989612558565b611de482898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128ca92505050565b611e25576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610a58565b505050505050505050565b6001600954600160a01b900460ff166002811115611e5057611e5061320b565b14611e87576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82817f00000000000000000000000000000000000000000000000000000000000000018481811115611ee5576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ef2858585612c5a565b905081811015611f2e576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337f000000000000000000000000dab1a1854214684ace522439684a145e625052336001600160a01b031614611f90576040517f8bae333500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000028b487611fba61254e565b611fc49190613731565b1115611ffc576040517f28fdd54500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3487600c5461200b91906136bb565b14612042576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0388166000908152600b602052604090208054880190556119c08888612a37565b60606120758261245c565b612101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a58565b6006805461210e906134a2565b905060000361212b57505060408051602081019091526000815290565b600f54600160a01b900460ff161561217257600661214883612d4c565b601060405160200161215c939291906137eb565b6040516020818303038152906040529050919050565b600660405160200161215c9190613813565b336121976009546001600160a01b031690565b6001600160a01b0316146121be576040516301b09f9f60e01b815260040160405180910390fd5b6114798282612e81565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff165b9392505050565b3361220e6009546001600160a01b031690565b6001600160a01b031614612235576040516301b09f9f60e01b815260040160405180910390fd5b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061098557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806123bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061240b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061098557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60008160000361246e57506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b0381166121f457816124a98161381f565b6000818152600560205260409020549093506001600160a01b031691506124919050565b600080846001600160a01b0316846001600160a01b0316148061250957506000838152600360205260409020546001600160a01b038581169116145b8061253957506001600160a01b0380861660009081526004602090815260408083209388168352929052205460ff165b95945050505050565b60066114798282613524565b6000610cd4611731565b6000818152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff191690556001821161259057600161259b565b61259b600183613704565b905060006125aa836001613731565b9050600083831080156125c157506125c18361245c565b80156125e257506000838152600560205260409020546001600160a01b0316155b905060006125ef8361245c565b801561261057506000838152600560205260409020546001600160a01b0316155b9050811561264d576000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b8015612688576000838152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b600085815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b6000808215806127055750600754155b1561271f5750506008546001600160a01b0316600061274e565b60006127108460075461273291906136bb565b61273c91906136f0565b6008546001600160a01b031693509150505b9250929050565b8047101561278f576040517fe201018100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127dc576040519150601f19603f3d011682016040523d82523d6000602084013e6127e1565b606091505b5050905080610cc5576040517f3102f6f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b03821661283457506000919050565b60008060015b6000548110156128c15761284d8161245c565b156128b1576000818152600560205260409020546001600160a01b03161561288a576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b0316036128b157826128ad81613717565b9350505b6128ba81613717565b905061283a565b50909392505050565b6000833b8015612a29576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a029061291f9033908a9089908990600401613836565b6020604051808303816000875af192505050801561295a575060408051601f3d908101601f1916820190925261295791810190613872565b60015b6129dc573d808015612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b5080516000036129d4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150612a2f9050565b60019150505b949350505050565b8080600003612a72576040517fda1a0e9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490612a818483613731565b90506000612a90600183613704565b6000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038916179055905082811115612b03576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0388161790555b81600081905550612b2660008785604051806020016040528060008152506128ca565b612b67576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610a58565b825b82811015610e2b5760405181906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612bb281613717565b9050612b69565b60098054600160a01b80820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911690836002811115612c0457612c0461320b565b0217905550816002811115612c1b57612c1b61320b565b816002811115612c2d57612c2d61320b565b6040517fe2034a7bf30bb7c637ee4fd008478210b21708c5c7177151827a49a6877a020d90600090a35050565b600a546000908103612c98576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b60205260409020548211612ce9576040517fde33971400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cf38484612eef565b612d29576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0383166000908152600b602052604090205481039392505050565b606081600003612d8f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612db95780612da381613717565b9150612db29050600a836136f0565b9150612d93565b60008167ffffffffffffffff811115612dd457612dd46132a8565b6040519080825280601f01601f191660200182016040528015612dfe576020820181803683370190505b5090505b8415612a2f57612e13600183613704565b9150612e20600a8661388f565b612e2b906030613731565b60f81b818381518110612e4057612e40613744565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e7a600a866136f0565b9450612e02565b612710811115612ebd576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007556008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600a54612f4b8483612f54565b14949350505050565b600081815b84518110156117dc57612f8582868381518110612f7857612f78613744565b6020026020010151612f99565b915080612f9181613717565b915050612f59565b6000818310612fb55760008281526020849052604090206121f4565b60008381526020839052604090206121f4565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461127a57600080fd5b60006020828403121561300857600080fd5b81356121f481612fc8565b60005b8381101561302e578181015183820152602001613016565b50506000910152565b6000815180845261304f816020860160208601613013565b601f01601f19169290920160200192915050565b6020815260006121f46020830184613037565b60006020828403121561308857600080fd5b5035919050565b80356001600160a01b03811681146130a657600080fd5b919050565b600080604083850312156130be57600080fd5b6130c78361308f565b946020939093013593505050565b60008083601f8401126130e757600080fd5b50813567ffffffffffffffff8111156130ff57600080fd5b60208301915083602082850101111561274e57600080fd5b6000806020838503121561312a57600080fd5b823567ffffffffffffffff81111561314157600080fd5b61314d858286016130d5565b90969095509350505050565b60008060006060848603121561316e57600080fd5b6131778461308f565b92506131856020850161308f565b9150604084013590509250925092565b600080604083850312156131a857600080fd5b50508035926020909101359150565b600080604083850312156131ca57600080fd5b6131d38361308f565b91506131e16020840161308f565b90509250929050565b6000602082840312156131fc57600080fd5b8135600381106121f457600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324357634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325b57600080fd5b6121f48261308f565b6020808252825182820181905260009190848201906040850190845b8181101561329c57835183529284019291840191600101613280565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126132cf57600080fd5b8135602067ffffffffffffffff808311156132ec576132ec6132a8565b8260051b604051601f19603f83011681018181108482111715613311576133116132a8565b60405293845285810183019383810192508785111561332f57600080fd5b83870191505b8482101561334e57813583529183019190830190613335565b979650505050505050565b6000806040838503121561336c57600080fd5b82359150602083013567ffffffffffffffff81111561338a57600080fd5b613396858286016132be565b9150509250929050565b600080604083850312156133b357600080fd5b6133bc8361308f565b9150602083013580151581146133d157600080fd5b809150509250929050565b6000806000806000608086880312156133f457600080fd5b6133fd8661308f565b945061340b6020870161308f565b935060408601359250606086013567ffffffffffffffff81111561342e57600080fd5b61343a888289016130d5565b969995985093965092949392505050565b60008060006060848603121561346057600080fd5b6134698461308f565b925060208401359150604084013567ffffffffffffffff81111561348c57600080fd5b613498868287016132be565b9150509250925092565b600181811c908216806134b657607f821691505b60208210810361172057634e487b7160e01b600052602260045260246000fd5b601f821115610cc557600081815260208120601f850160051c810160208610156134fd5750805b601f850160051c820191505b8181101561351c57828155600101613509565b505050505050565b815167ffffffffffffffff81111561353e5761353e6132a8565b6135528161354c84546134a2565b846134d6565b602080601f831160018114613587576000841561356f5750858301515b600019600386901b1c1916600185901b17855561351c565b600085815260208120601f198616915b828110156135b657888601518255948401946001909101908401613597565b50858210156135d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff8311156135fc576135fc6132a8565b6136108361360a83546134a2565b836134d6565b6000601f841160018114613644576000851561362c5750838201355b600019600387901b1c1916600186901b17835561369e565b600083815260209020601f19861690835b828110156136755786850135825560209485019460019092019101613655565b50868210156136925760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156136d5576136d56136a5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826136ff576136ff6136da565b500490565b81810381811115610985576109856136a5565b6000600019820361372a5761372a6136a5565b5060010190565b80820180821115610985576109856136a5565b634e487b7160e01b600052603260045260246000fd5b60008154613767816134a2565b6001828116801561377f57600181146137b2576137e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528215158302870194506137e1565b8560005260208060002060005b858110156137d85781548a8201529084019082016137bf565b50505082870194505b5050505092915050565b60006137f7828661375a565b8451613807818360208901613013565b61334e8183018661375a565b60006121f4828461375a565b60008161382e5761382e6136a5565b506000190190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526138686080830184613037565b9695505050505050565b60006020828403121561388457600080fd5b81516121f481612fc8565b60008261389e5761389e6136da565b50069056fea264697066735822122085350301b55793a5b35a8dc819e783bbbb6d765da1dfad83891a71e71e83ea5064736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000218b622bbe4404c01f972f243952e3a1d2132dec00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000003455a5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003455a5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d58706e3632767743346d6851754e527a3975374d77376e427357455a4b64334a4d4c676365335835354175660000000000000000000000
-----Decoded View---------------
Arg [0] : royaltyRate_ (uint256): 500
Arg [1] : royaltyRecipient_ (address): 0x218B622bbe4404c01f972F243952E3a1D2132Dec
Arg [2] : name_ (string): EZU
Arg [3] : symbol_ (string): EZU
Arg [4] : uri_ (string): ipfs://QmXpn62vwC4mhQuNRz9u7Mw7nBsWEZKd3JMLgce3X55Auf
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [1] : 000000000000000000000000218b622bbe4404c01f972f243952e3a1d2132dec
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 455a550000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 455a550000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [10] : 697066733a2f2f516d58706e3632767743346d6851754e527a3975374d77376e
Arg [11] : 427357455a4b64334a4d4c676365335835354175660000000000000000000000
Loading...
Loading
Loading...
Loading
[ 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.