Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 978 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 16774506 | 700 days ago | IN | 0 ETH | 0.00124523 | ||||
Set Approval For... | 16715159 | 708 days ago | IN | 0 ETH | 0.00140349 | ||||
Withdraw Money | 16658328 | 716 days ago | IN | 0 ETH | 0.00055201 | ||||
Set Approval For... | 16402815 | 752 days ago | IN | 0 ETH | 0.001048 | ||||
Set Approval For... | 16398937 | 752 days ago | IN | 0 ETH | 0.00143271 | ||||
Set Approval For... | 16299955 | 766 days ago | IN | 0 ETH | 0.00113732 | ||||
Set Approval For... | 16272992 | 770 days ago | IN | 0 ETH | 0.00105313 | ||||
Transfer From | 16251920 | 773 days ago | IN | 0 ETH | 0.00048837 | ||||
Transfer From | 16251917 | 773 days ago | IN | 0 ETH | 0.00060238 | ||||
Transfer From | 16251892 | 773 days ago | IN | 0 ETH | 0.00056207 | ||||
Transfer From | 16251881 | 773 days ago | IN | 0 ETH | 0.00058007 | ||||
Transfer From | 16251880 | 773 days ago | IN | 0 ETH | 0.00057327 | ||||
Transfer From | 16251879 | 773 days ago | IN | 0 ETH | 0.00057691 | ||||
Transfer From | 16251878 | 773 days ago | IN | 0 ETH | 0.00060003 | ||||
Transfer From | 16251876 | 773 days ago | IN | 0 ETH | 0.00054072 | ||||
Transfer From | 16251874 | 773 days ago | IN | 0 ETH | 0.00053211 | ||||
Transfer From | 16251869 | 773 days ago | IN | 0 ETH | 0.00068933 | ||||
Transfer Ownersh... | 16244508 | 774 days ago | IN | 0 ETH | 0.00039492 | ||||
Set Royalty Info | 16244473 | 774 days ago | IN | 0 ETH | 0.00039238 | ||||
Set Approval For... | 16227034 | 776 days ago | IN | 0 ETH | 0.00092353 | ||||
Set Approval For... | 16224739 | 777 days ago | IN | 0 ETH | 0.00059753 | ||||
Set Approval For... | 16224621 | 777 days ago | IN | 0 ETH | 0.00061773 | ||||
Set Approval For... | 16224609 | 777 days ago | IN | 0 ETH | 0.00055939 | ||||
Set Approval For... | 16224597 | 777 days ago | IN | 0 ETH | 0.00064348 | ||||
Set Approval For... | 16224474 | 777 days ago | IN | 0 ETH | 0.00059336 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16658328 | 716 days ago | 2.12857 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Metastaq
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // Metastaq Contracts v1.0.0 // Creator: Metastaq pragma solidity ^0.8.4; import "./ERC721A.sol"; import "./IMetastaq.sol"; import "./ERC721AQueryable.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./ERC2981.sol"; import "./SafeMath.sol"; import "./Address.sol"; import "./MerkleProof.sol"; /// @title A PFP Collection Contract /// @notice This contract allows for whitelist mint, public mint, and free airdrops from owner. /// @dev The Contract uses Markle Proof for Whitelist minting, The Markle Proof mint limit is max allowed per user. contract Metastaq is IMetastaq, ERC721AQueryable, ERC2981, Ownable, ReentrancyGuard { /// maxPerAddressDuringMint the max token user can mint uint256 public immutable maxPerAddressDuringMint; /// amountForDevs number of token for dev uint256 public immutable amountForDevs; // address[] private whitelistAddress; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; address private hotWallet; bytes32 private root; string private _baseTokenURI; using SafeMath for uint256; using SafeMath for uint96; struct SaleConfig { bool isPublicSaleStarted; uint96 allowListPrice; uint96 publicPrice; } SaleConfig public saleConfig; // ============================================================= // CONSTRUCTOR // ============================================================= /// @notice Constructor of Contract /// @param tokenName_ The name of token /// @param tokenSymbol_ The symbol of token /// @param maxBatchSize_ max batch to mint at once /// @param collectionSize_ The total supply allow to be minted /// @param hotWallet_ The wallet used to perform action as owner /// @param amountForDevs_ The amount token for dev /// @param isPublicSaleStarted_ The public sale started falg /// @param royaltyFeesInBips_ The BIPS for royalty /// @param publicPrice_ public price of Token /// @param allowListPrice_ mint list price in wei /// @param baseTokenURI_ base uri of collection constructor( string memory tokenName_, string memory tokenSymbol_, uint256 maxBatchSize_, uint256 collectionSize_, address hotWallet_, uint256 amountForDevs_, bool isPublicSaleStarted_, uint96 royaltyFeesInBips_, uint96 publicPrice_, uint96 allowListPrice_, string memory baseTokenURI_ ) ERC721A(tokenName_, tokenSymbol_) { maxPerAddressDuringMint = 4; amountForDevs = amountForDevs_; _baseTokenURI = baseTokenURI_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; hotWallet = hotWallet_; saleConfig.isPublicSaleStarted = isPublicSaleStarted_; saleConfig.allowListPrice = allowListPrice_; saleConfig.publicPrice = publicPrice_; _setDefaultRoyalty(_msgSenderERC721A(), royaltyFeesInBips_); } // ============================================================= // Royalty Operation // ============================================================= /** * @dev setUp '_royaltyFeesInBips' to address '_receiver'. * The Perivous Royalty will be overirden. * * This function setup single Royalty for all tokens. * * Requirements: * * - The caller must be current owner of contract or hot wallet. * * */ function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) external onlyOwner { _setDefaultRoyalty(_receiver, _royaltyFeesInBips); emit RoyaltyInfoUpdated(_receiver, _royaltyFeesInBips); } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * interfaceId. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC721A) returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // The Contract would Check for ERC2981 Interface Support and ERC721A. return ERC2981.supportsInterface(interfaceId) || ERC721A.supportsInterface(interfaceId); } // ============================================================= // Air Drop Operations // ============================================================= /** * @dev Setup AirDrop Values isPublicSaleStarted isPublicSaleStarted allowListPriceWei allowListPriceWei publicPriceWei publicPriceWei * setup values for Air Drop and On public and allowlist sale * */ function setupSaleInfo( bool isPublicSaleStarted, uint96 allowListPriceWei, uint96 publicPriceWei ) external onlyOwner { saleConfig = SaleConfig( isPublicSaleStarted, allowListPriceWei, publicPriceWei ); } /** * @dev Mint Token to to quantity quantity _type _Type and proof 'proof' to validate user * Mint token to allowlist users * * Requirement * - The _type is provided to handle between ETH and Fiat Payment * - In case of _type 'fiat' the contract assume that Owner has received payment and The Caller is AllowedUser * - Check For Available Token Supply * - Check For Max Mint limit * - Check For allowLint Mint Price * - Would return Fund if Provided More then Price * - the proof must be valid */ function allowlistMint( address to, uint256 quantity, bytes32 _type, bytes32[] memory proof ) external payable { if(saleConfig.isPublicSaleStarted) revert AllowListMintEnded(); if (!(_type == "fiat" || _type == "crypto")) revert InvalidPaymentType(); uint96 price = uint96(saleConfig.allowListPrice); if (price == 0) revert AllowListMintNotStarted(); if (!(_verify(_leaf(to), proof))) revert NotInAllowList(); if (numberMinted(to).add(quantity) > maxPerAddressDuringMint) revert ExceedsMaxMintLimit(); if (totalSupply().add(quantity) > collectionSize) revert ExceedsSupply(); if (_type == "fiat") { if ( !(_msgSenderERC721A() == getHotWallet() || _msgSenderERC721A() == owner()) ) revert NotAllowedToCall(); _setAux(to, uint64(quantity.add(_getAux(to)))); _safeMint(to, quantity); } if (_type == "crypto") { _setAux(to, uint64(quantity.add(_getAux(to)))); _safeMint(to, quantity); refundIfOver(price.mul(quantity)); } emit AllowListMint(to, quantity); } /** * @dev Mint Token to 'to' quantity 'quantity' _type '_type' * Mint token during Public Sale and receive Fund * * Requirement * - The _type is provided to handle between ETH and Fiat Payment * - In case of _type 'fiat' the contract assume that Owner has received payment and The Caller is AllowedUser * - Check For Available Token Supply * - Check For Max Mint limit * - Check For Public Sale On * - Would return Fund if Provided More then Price */ function publicSaleMint( address to, uint256 quantity, bytes32 _type ) external payable { if (!(_type == "fiat" || _type == "crypto")) revert InvalidPaymentType(); uint96 publicPrice = uint96(saleConfig.publicPrice); if (!isPublicSaleOn()) revert PublicSaleNotStarted(); if (numberMinted(to).add(quantity) > maxPerAddressDuringMint) revert ExceedsMaxMintLimit(); if (totalSupply().add(quantity) > collectionSize) revert ExceedsSupply(); if (_type == "fiat") { if ( !(_msgSenderERC721A() == getHotWallet() || _msgSenderERC721A() == owner()) ) revert NotAllowedToCall(); _safeMint(to, quantity); } if (_type == "crypto") { _safeMint(to, quantity); refundIfOver(publicPrice.mul(quantity)); } emit PublicSaleMint(to, quantity, publicPrice); } /// @notice mint function for dev Mint /// @param to The address of receiver /// @param quantity The number of token minted function devMint(address to, uint256 quantity) external onlyOwner nonReentrant { if (totalSupply().add(quantity) > amountForDevs) revert ExceedsDevMintLimit(); if (totalSupply().add(quantity) > collectionSize) revert ExceedsSupply(); if (quantity.mod(maxBatchSize) != 0) revert NotMultipleOfMaxBatchSize(); uint256 numChunks = quantity / maxBatchSize; //--solc-disable-warnings for (uint256 i = 0; i < numChunks; i++) { _safeMint(to, maxBatchSize); } emit DevMint(to, quantity); } /** * @dev Returns the 'isPublicSaleOn' flag. true if public sale is on. */ function isPublicSaleOn() public view returns (bool) { return bool(saleConfig.isPublicSaleStarted); } /** * @dev Returns the 'getHotWallet' address. */ function getHotWallet() public view returns (address) { return hotWallet; } /** * @dev Returns the 'updateHotWallet' address. * will help Dev Team to Rotate Hot wallet * Requirements * - the caller must be owner * - The address Must be EOA */ function updateHotWallet(address hotWallet_) public onlyOwner { if (Address.isContract(hotWallet_)) revert ContractAddressNotAllowed(); hotWallet = hotWallet_; } // ============================================================= // ERC721A Operations // ============================================================= /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the 'baseURI' and the 'tokenId' */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Set Base URI for computing {tokenURI}. will be Set for All tokens, the resulting URI for each * token will be the concatenation of the 'baseURI' and the 'tokenId' */ function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } /** * @dev Number Minted of owner 'owner' * Returns Number of Token Minted By owner */ function numberMinted(address owner_) public view returns (uint256) { return _numberMinted(owner_); } /** * @dev Get Aux of owner 'owner' * Returns auxiliary data for 'owner'. in our case will return AllowList Token minted */ function getAux(address owner) external view returns (uint64) { return _getAux(owner); } /** * @dev get OwnerShip Data of Token id 'tokenId' * Returns Token OwnerShip data of token id. */ function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return _ownershipOf(tokenId); } // ============================================================= // Fund Operations // ============================================================= /** * @dev With Draw Money will be used withdraw eth from contract * Reenrrant Gurad inplace to block recuseve calling * * Requirement * - The Caller must be Owner or Hot Wallet * */ function withdrawMoney() external onlyOwner nonReentrant { //slither-disable-next-line arbitrary-send per (bool success, bytes memory error) = _msgSenderERC721A().call{ value: address(this).balance }(""); require(success, string(error)); } /** * @dev Refund If Over check price 'price' * if insufficient ETH value supplied it will revert * return extra ETH to caller * */ function refundIfOver(uint256 price) private { if (msg.value < price) revert InsufficientPayment(); if (msg.value > price) { (bool success, bytes memory returnError) = payable( _msgSenderERC721A() ).call{value: (msg.value).sub(price)}(""); require(success, string(returnError)); } } /** * @dev contract can receive Ether. msg.data is not empty */ receive() external payable {} /** * @dev contract can receive Ether. */ fallback() external payable {} // ============================================================= // Markle Tree / Whitelisting Operations // ============================================================= /** * @dev this function will set markle root * root will be set after deployment. * * - Requirements * the caller must be owner of smart contract */ function setRoot(bytes32 _root) external onlyOwner { root = _root; } /** * @dev get Root will returns current markle root */ function getRoot() external view returns (bytes32) { return root; } /** * @dev _leaf function to get the leaf of markle tree at _account * returns leaf of account */ function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } /** * @dev _verify internal function to verify proof * it will validate the proof against root and user leafs * returns true if valid proof is provided else false. */ function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, root, leaf); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view 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. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /* * @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 pragma solidity ^0.8.4; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.4; import "./IERC2981.sol"; import "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import "./IERC721A.sol"; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); if (_exists(startTokenId)) revert TokenAlreadyMinted(); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if ( !_checkContractOnERC721Received( address(0), to, updatedIndex++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); if (_exists(startTokenId)) revert TokenAlreadyMinted(); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import './ERC721A.sol'; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @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 (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.4; import "./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 // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The Token is already minted */ error TokenAlreadyMinted(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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 be 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); // ============================== // IERC721Metadata // ============================== /** * @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 // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // Metastaq Contracts v1.0.0 // Creator: Metastaq pragma solidity ^0.8.4; /** * @dev Interface of Metastaq. */ interface IMetastaq { /** * The caller must Provide required ETH value. */ error InsufficientPayment(); /** * The caller is not alowed to call this fucntion */ error NotAllowedToCall(); /** * The Caller is Contract. will not allow Contract and multi sig wallet in air drop */ error ContractNotAllowedToMint(); /** * Cannot query the balance for the zero address. */ error InvalidPaymentType(); /** * AllowList Sale Not started yet */ error AllowListMintNotStarted(); /** * AllowList Sale is Ended */ error AllowListMintEnded(); /** * The Caller is not Eligible For AllowList Mint. */ error NotInAllowList(); /** * The Caller is tring to Mint too much Tokens. */ error ExceedsAllowListLimit(); /** * The Caller has reached Max minting limit */ error ExceedsMaxMintLimit(); /** * The Total supply of Token is mined. */ error ExceedsSupply(); /** * The Public sale is not begun yet. */ error PublicSaleNotStarted(); /** * The Dev Mint Tokens limit reached */ error ExceedsDevMintLimit(); /** * The token does not exist. */ error NotMultipleOfMaxBatchSize(); /** * The Length of Address and token array not matched */ error ArraysLengthNotMatched(); /** * The Address Provided in Contract. */ error ContractAddressNotAllowed(); /** * @dev Emitted when address `to` has minted quantity `quantity` token. during allowList mint */ event AllowListMint(address indexed to, uint256 quantity); /** * @dev Emitted when address `to` has minted quantity `quantity` token. during public sale. */ event PublicSaleMint(address indexed to, uint256 qunatity, uint96 price); /** * @dev Emitted when address `to` has minted quantity `quantity` token from Dev tokens. */ event DevMint(address indexed to, uint256 quantity); /** * @dev Emitted when Allow list is updated. */ event WhiteListUpdated(); /** * @dev Emitted when royaltyReceiver `royaltyReceiver` ,royaltyInBips `royaltyInBips` Info is updated. */ event RoyaltyInfoUpdated( address indexed royaltyReceiver, uint96 royaltyInBips ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.4; /** * @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.8.4; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @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() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.4; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"tokenName_","type":"string"},{"internalType":"string","name":"tokenSymbol_","type":"string"},{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"address","name":"hotWallet_","type":"address"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"bool","name":"isPublicSaleStarted_","type":"bool"},{"internalType":"uint96","name":"royaltyFeesInBips_","type":"uint96"},{"internalType":"uint96","name":"publicPrice_","type":"uint96"},{"internalType":"uint96","name":"allowListPrice_","type":"uint96"},{"internalType":"string","name":"baseTokenURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowListMintEnded","type":"error"},{"inputs":[],"name":"AllowListMintNotStarted","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"ArraysLengthNotMatched","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"ContractAddressNotAllowed","type":"error"},{"inputs":[],"name":"ContractNotAllowedToMint","type":"error"},{"inputs":[],"name":"ExceedsAllowListLimit","type":"error"},{"inputs":[],"name":"ExceedsDevMintLimit","type":"error"},{"inputs":[],"name":"ExceedsMaxMintLimit","type":"error"},{"inputs":[],"name":"ExceedsSupply","type":"error"},{"inputs":[],"name":"InsufficientPayment","type":"error"},{"inputs":[],"name":"InvalidPaymentType","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotAllowedToCall","type":"error"},{"inputs":[],"name":"NotInAllowList","type":"error"},{"inputs":[],"name":"NotMultipleOfMaxBatchSize","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"PublicSaleNotStarted","type":"error"},{"inputs":[],"name":"TokenAlreadyMinted","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"AllowListMint","type":"event"},{"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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"DevMint","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":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"qunatity","type":"uint256"},{"indexed":false,"internalType":"uint96","name":"price","type":"uint96"}],"name":"PublicSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"royaltyInBips","type":"uint96"}],"name":"RoyaltyInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"WhiteListUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_type","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountForDevs","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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAux","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHotWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_type","type":"bytes32"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"saleConfig","outputs":[{"internalType":"bool","name":"isPublicSaleStarted","type":"bool"},{"internalType":"uint96","name":"allowListPrice","type":"uint96"},{"internalType":"uint96","name":"publicPrice","type":"uint96"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicSaleStarted","type":"bool"},{"internalType":"uint96","name":"allowListPriceWei","type":"uint96"},{"internalType":"uint96","name":"publicPriceWei","type":"uint96"}],"name":"setupSaleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":[{"internalType":"address","name":"hotWallet_","type":"address"}],"name":"updateHotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620034c0380380620034c08339810160408190526200003591620004f5565b8a518b908b906200004e90600290602085019062000356565b5080516200006490600390602084019062000356565b50620000786401000000006200017f810204565b60005550620000a490506200009564010000000062000184810204565b64010000000062000188810204565b6001600b55600460805260a08690528051620000c890600e90602084019062000356565b5060e089905260c0889052600c8054600160a060020a031916600160a060020a038916179055600f80546001606860020a031916861515610100606860020a031916176101006001606060020a038581169190910291909117606860020a60c860020a0319166d0100000000000000000000000000918616919091021790556200016e6200015e64010000000062000184810204565b85640100000000620001da810204565b50505050505050505050506200068f565b600090565b3390565b600a8054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001ed64010000000062000350810204565b6001606060020a0316816001606060020a0316111562000294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600160a060020a03821662000306576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200028b565b60408051808201909152600160a060020a039092168083526001606060020a0390911660209092018290527401000000000000000000000000000000000000000090910217600855565b61271090565b82805462000364906200060a565b90600052602060002090601f016020900481019282620003885760008555620003d3565b82601f10620003a357805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d3578251825591602001919060010190620003b6565b50620003e1929150620003e5565b5090565b5b80821115620003e15760008155600101620003e6565b8051600160a060020a03811681146200041457600080fd5b919050565b805180151581146200041457600080fd5b600082601f8301126200043b578081fd5b81516001604060020a038082111562000458576200045862000660565b604051601f8301601f19908116603f0116810190828211818310171562000483576200048362000660565b816040528381526020925086838588010111156200049f578485fd5b8491505b83821015620004c25785820183015181830184015290820190620004a3565b83821115620004d357848385830101525b9695505050505050565b80516001606060020a03811681146200041457600080fd5b60008060008060008060008060008060006101608c8e03121562000517578687fd5b8b516001604060020a038111156200052d578788fd5b6200053b8e828f016200042a565b9b505060208c01516001604060020a0381111562000557578788fd5b620005658e828f016200042a565b9a505060408c0151985060608c015197506200058460808d01620003fc565b965060a08c015195506200059b60c08d0162000419565b9450620005ab60e08d01620004dd565b9350620005bc6101008d01620004dd565b9250620005cd6101208d01620004dd565b91506101408c01516001604060020a03811115620005e9578182fd5b620005f78e828f016200042a565b9150509295989b509295989b9093969950565b6002810460018216806200061f57607f821691505b602082108114156200065a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60805160a05160c05160e051612dc6620006fa6000396000818161104d0152818161109901526110d1015260008181610b1b01528181610ff5015261159b0152600081816107450152610fa10152600081816104aa01528181610ac5015261154b0152612dc66000f3fe6080604052600436106101cf5760e060020a600035046301ffc9a781146101d857806302fa7c471461020d57806306fdde031461022d578063081812fc1461024f578063095ea7b31461028757806318160ddd146102a75780631e2f2600146102ca57806323b872dd146102dd5780632a55205a146102fd5780633f5e47411461033c57806342842e0e1461035457806355eba0c81461037457806355f804b3146103945780635bbb2177146103b45780635ca1e165146103e1578063627804af146103f65780636352211e1461041657806370a0823114610436578063715018a6146104565780638462151c1461046b5780638bc35c2f146104985780638da5cb5b146104cc57806390aa0b0f146104e15780639231ab2a1461053c57806395d89b411461056957806399a2557a1461057e5780639c5d82841461059e578063a22cb465146105b1578063ac446002146105d1578063b88d4fde146105e6578063baa79fb914610606578063bf0b175e14610626578063c23dc68f1461065e578063c87b56dd1461067e578063d367c5401461069e578063dab5f340146106b3578063dc33e681146106d3578063e985e9c5146106f3578063f2fde38b14610713578063fbe1aa511461073357005b366101d657005b005b3480156101e457600080fd5b506101f86101f336600461292c565b610767565b60405190151581526020015b60405180910390f35b34801561021957600080fd5b506101d661022836600461281a565b610787565b34801561023957600080fd5b50610242610817565b6040516102049190612b30565b34801561025b57600080fd5b5061026f61026a366004612914565b6108a9565b604051600160a060020a039091168152602001610204565b34801561029357600080fd5b506101d66102a23660046126f3565b6108f0565b3480156102b357600080fd5b50600154600054035b604051908152602001610204565b6101d66102d836600461274e565b6109c9565b3480156102e957600080fd5b506101d66102f83660046125d8565b610ccf565b34801561030957600080fd5b5061031d6103183660046129d0565b610cdf565b60408051600160a060020a039093168352602083019190915201610204565b34801561034857600080fd5b50600f5460ff166101f8565b34801561036057600080fd5b506101d661036f3660046125d8565b610d8b565b34801561038057600080fd5b506101d661038f36600461258c565b610da6565b3480156103a057600080fd5b506101d66103af366004612964565b610e1d565b3480156103c057600080fd5b506103d46103cf366004612843565b610e5b565b6040516102049190612ab6565b3480156103ed57600080fd5b50600d546102bc565b34801561040257600080fd5b506101d66104113660046126f3565b610f42565b34801561042257600080fd5b5061026f610431366004612914565b611155565b34801561044257600080fd5b506102bc61045136600461258c565b611160565b34801561046257600080fd5b506101d66111b1565b34801561047757600080fd5b5061048b61048636600461258c565b6111ef565b6040516102049190612af8565b3480156104a457600080fd5b506102bc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d857600080fd5b5061026f6112fe565b3480156104ed57600080fd5b50600f546105159060ff8116906001606060020a036101008204811691606860020a90041683565b6040805193151584526001606060020a039283166020850152911690820152606001610204565b34801561054857600080fd5b5061055c610557366004612914565b61130d565b6040516102049190612baf565b34801561057557600080fd5b5061024261131e565b34801561058a57600080fd5b5061048b610599366004612806565b61132d565b6101d66105ac36600461271c565b6114cf565b3480156105bd57600080fd5b506101d66105cc3660046126ca565b6116ee565b3480156105dd57600080fd5b506101d6611787565b3480156105f257600080fd5b506101d6610601366004612613565b611860565b34801561061257600080fd5b506101d66106213660046128d2565b6118ad565b34801561063257600080fd5b5061064661064136600461258c565b61194d565b6040516001604060020a039091168152602001610204565b34801561066a57600080fd5b5061055c610679366004612914565b611958565b34801561068a57600080fd5b50610242610699366004612914565b61199b565b3480156106aa57600080fd5b5061026f611a22565b3480156106bf57600080fd5b506101d66106ce366004612914565b611a31565b3480156106df57600080fd5b506102bc6106ee36600461258c565b611a68565b3480156106ff57600080fd5b506101f861070e3660046125a6565b611a96565b34801561071f57600080fd5b506101d661072e36600461258c565b611ac4565b34801561073f57600080fd5b506102bc7f000000000000000000000000000000000000000000000000000000000000000081565b600061077282611b6d565b80610781575061078182611ba8565b92915050565b336107906112fe565b600160a060020a0316146107c25760405160e560020a62461bcd0281526004016107b990612b43565b60405180910390fd5b6107cc8282611bff565b6040516001606060020a0382168152600160a060020a038316907fae1d656a1268648b04ffa79c1416f05879338ae295aae3234d8db217356a1c629060200160405180910390a25050565b60606002805461082690612c9e565b80601f016020809104026020016040519081016040528092919081815260200182805461085290612c9e565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b482611d04565b6108d45760405160e260020a6333d1c03902815260040160405180910390fd5b50600090815260066020526040902054600160a060020a031690565b60006108fb82611d2b565b905080600160a060020a031683600160a060020a031614156109335760405160e260020a63250fdee302815260040160405180910390fd5b33600160a060020a0382161461096d5761094d8133611a96565b61096d5760405160e160020a6367d9dca102815260040160405180910390fd5b6000828152600660205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600f5460ff16156109f05760405160e060020a63c16b32a702815260040160405180910390fd5b8160e260020a63199a585d021480610a1357508160d060020a6563727970746f02145b610a335760405160e360020a630e5525c302815260040160405180910390fd5b600f5461010090046001606060020a031680610a655760405160e060020a63bd5cf13902815260040160405180910390fd5b60408051600160a060020a038716606060020a026020808301919091528251601481840301815260349092019092528051910120610aa39083611d8f565b610ac35760405160e060020a63e0e6520902815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000610af785610af188611a68565b90611d9e565b1115610b195760405160e160020a635bfc5f1302815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000610b4b85610af16001546000540390565b1115610b6d5760405160e060020a632d573a5502815260040160405180910390fd5b8260e260020a63199a585d021415610c3c57610b87611a22565b600160a060020a031633600160a060020a03161480610bbe5750610ba96112fe565b600160a060020a031633600160a060020a0316145b610bde5760405160e160020a633416cf2502815260040160405180910390fd5b610c3285610bfe610bee88611daa565b87906001604060020a0316611d9e565b600160a060020a0390911660009081526005602052604090208054600160c060020a031660c060020a909202919091179055565b610c3c8585611dcc565b8260d060020a6563727970746f021415610c8557610c6085610bfe610bee88611daa565b610c6a8585611dcc565b610c85610c806001606060020a03831686611dea565b611df6565b84600160a060020a03167f81b89671479141298a3d45f69e25c5dc4b966e1d5ec99a0b8ed5c1c49f5c807c85604051610cc091815260200190565b60405180910390a25050505050565b610cda838383611e99565b505050565b6000828152600960209081526040808320815180830190925254600160a060020a03811680835260a060020a9091046001606060020a0316928201929092528291610d54575060408051808201909152600854600160a060020a038116825260a060020a90046001606060020a031660208201525b602081015160009061271090610d73906001606060020a031687612c3c565b610d7d9190612c28565b915196919550909350505050565b610cda83838360405180602001604052806000815250611860565b33610daf6112fe565b600160a060020a031614610dd85760405160e560020a62461bcd0281526004016107b990612b43565b803b15610dfb5760405160e060020a63a941357102815260040160405180910390fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b33610e266112fe565b600160a060020a031614610e4f5760405160e560020a62461bcd0281526004016107b990612b43565b610cda600e8383612490565b80516060906000816001604060020a03811115610e8b5760e060020a634e487b7102600052604160045260246000fd5b604051908082528060200260200182016040528015610ec457816020015b610eb1612514565b815260200190600190039081610ea95790505b50905060005b828114610f3a57610f04858281518110610ef75760e060020a634e487b7102600052603260045260246000fd5b6020026020010151611958565b828281518110610f275760e060020a634e487b7102600052603260045260246000fd5b6020908102919091010152600101610eca565b509392505050565b33610f4b6112fe565b600160a060020a031614610f745760405160e560020a62461bcd0281526004016107b990612b43565b6002600b541415610f9a5760405160e560020a62461bcd0281526004016107b990612b78565b6002600b557f0000000000000000000000000000000000000000000000000000000000000000610fd182610af16001546000540390565b1115610ff35760405160e060020a636e9c909702815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061102582610af16001546000540390565b11156110475760405160e060020a632d573a5502815260040160405180910390fd5b611071817f0000000000000000000000000000000000000000000000000000000000000000612036565b156110925760405160e160020a6306999b9702815260040160405180910390fd5b60006110be7f000000000000000000000000000000000000000000000000000000000000000083612c28565b905060005b81811015611107576110f5847f0000000000000000000000000000000000000000000000000000000000000000611dcc565b806110ff81612cdd565b9150506110c3565b5082600160a060020a03167f7d8400f0e58ae2e14f85b63f3afb0ca5b29328d8f48046b205fc7f174cf9b5ed8360405161114391815260200190565b60405180910390a250506001600b5550565b600061078182611d2b565b6000600160a060020a03821661118c5760405160e260020a6323d3ad8102815260040160405180910390fd5b50600160a060020a03166000908152600560205260409020546001604060020a031690565b336111ba6112fe565b600160a060020a0316146111e35760405160e560020a62461bcd0281526004016107b990612b43565b6111ed6000612042565b565b606060008060006111ff85611160565b90506000816001604060020a0381111561122c5760e060020a634e487b7102600052604160045260246000fd5b604051908082528060200260200182016040528015611255578160200160208202803683370190505b509050611260612514565b60005b8386146112f25761127381612094565b9150816040015115611284576112ea565b8151600160a060020a03161561129957815194505b87600160a060020a031685600160a060020a031614156112ea57808387806001019850815181106112dd5760e060020a634e487b7102600052603260045260246000fd5b6020026020010181815250505b600101611263565b50909695505050505050565b600a54600160a060020a031690565b611315612514565b610781826120b4565b60606003805461082690612c9e565b60608183106113525760405160e160020a631960ccad02815260040160405180910390fd5b60008061135e60005490565b90508084111561136c578093505b600061137787611160565b9050848610156113965785850381811015611390578091505b5061139a565b5060005b6000816001604060020a038111156113c55760e060020a634e487b7102600052604160045260246000fd5b6040519080825280602002602001820160405280156113ee578160200160208202803683370190505b509050816114015793506114c892505050565b600061140c88611958565b90506000816040015161141d575080515b885b88811415801561142f5750848714155b156114bc5761143d81612094565b925082604001511561144e576114b4565b8251600160a060020a03161561146357825191505b8a600160a060020a031682600160a060020a031614156114b457808488806001019950815181106114a75760e060020a634e487b7102600052603260045260246000fd5b6020026020010181815250505b60010161141f565b50505092835250909150505b9392505050565b8060e260020a63199a585d0214806114f257508060d060020a6563727970746f02145b6115125760405160e360020a630e5525c302815260040160405180910390fd5b600f54606860020a81046001606060020a03169060ff166115495760405160e060020a63ac4d09c702815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061157784610af187611a68565b11156115995760405160e160020a635bfc5f1302815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115cb84610af16001546000540390565b11156115ed5760405160e060020a632d573a5502815260040160405180910390fd5b8160e260020a63199a585d02141561166857611607611a22565b600160a060020a031633600160a060020a0316148061163e57506116296112fe565b600160a060020a031633600160a060020a0316145b61165e5760405160e160020a633416cf2502815260040160405180910390fd5b6116688484611dcc565b8160d060020a6563727970746f02141561169c576116868484611dcc565b61169c610c806001606060020a03831685611dea565b604080518481526001606060020a0383166020820152600160a060020a038616917fa110d9d535e61584b925c9c69e6a668d389f5f8353d78e094cc8abdf3d313ebf910160405180910390a250505050565b600160a060020a03821633141561171b5760405160e060020a63b06307db02815260040160405180910390fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336117906112fe565b600160a060020a0316146117b95760405160e560020a62461bcd0281526004016107b990612b43565b6002600b5414156117df5760405160e560020a62461bcd0281526004016107b990612b78565b6002600b55604051600090819033903031908381818185875af1925050503d8060008114611829576040519150601f19603f3d011682016040523d82523d6000602084013e61182e565b606091505b50915091508181906118565760405160e560020a62461bcd0281526004016107b99190612b30565b50506001600b5550565b61186b848484611e99565b600160a060020a0383163b156118a757611887848484846120cd565b6118a75760405160e160020a6368d2bf6b02815260040160405180910390fd5b50505050565b336118b66112fe565b600160a060020a0316146118df5760405160e560020a62461bcd0281526004016107b990612b43565b604080516060810182529315158085526001606060020a0393841660208601819052929093169301839052600f80546001606860020a031916610100606860020a03199093169290921761010090910217606860020a60c860020a031916606860020a909202919091179055565b600061078182611daa565b611960612514565b611968612514565b60005483106119775792915050565b61198083612094565b90508060400151156119925792915050565b6114c8836120b4565b60606119a682611d04565b6119c65760405160e460020a630a14c4b502815260040160405180910390fd5b60006119d06121cd565b90508051600014156119f157604051806020016040528060008152506114c8565b806119fb846121dc565b604051602001611a0c929190612a4a565b6040516020818303038152906040529392505050565b600c54600160a060020a031690565b33611a3a6112fe565b600160a060020a031614611a635760405160e560020a62461bcd0281526004016107b990612b43565b600d55565b600160a060020a038116600090815260056020526040812054604060020a90046001604060020a0316610781565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b33611acd6112fe565b600160a060020a031614611af65760405160e560020a62461bcd0281526004016107b990612b43565b600160a060020a038116611b615760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061604482015260d060020a656464726573730260648201526084016107b9565b611b6a81612042565b50565b6000600160e060020a0319821660e160020a63152a902d021480610781575060e060020a6301ffc9a702600160e060020a0319831614610781565b600060e060020a6301ffc9a702600160e060020a031983161480611bdf575060e060020a6380ac58cd02600160e060020a03198316145b80610781575050600160e060020a03191660e060020a635b5e139f021490565b6127106001606060020a0382161115611c735760405160e560020a62461bcd02815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c20657863656564604482015260b060020a692073616c6550726963650260648201526084016107b9565b600160a060020a038216611ccb5760405160e560020a62461bcd0281526020600482015260196024820152603960020a7822a921991c9c189d1034b73b30b634b2103932b1b2b4bb32b90260448201526064016107b9565b60408051808201909152600160a060020a039092168083526001606060020a03909116602090920182905260a060020a90910217600855565b600080548210801561078157505060009081526004602052604090205460e060020a161590565b600081600054811015611d735760008181526004602052604090205460e060020a8116611d71575b806114c8575060001901600081815260046020526040902054611d53565b505b60405160e160020a636f96cda102815260040160405180910390fd5b60006114c882600d548561222b565b60006114c88284612c10565b600160a060020a031660009081526005602052604090205460c060020a900490565b611de6828260405180602001604052806000815250612241565b5050565b60006114c88284612c3c565b80341015611e1a5760405160e060020a63cd1c886702815260040160405180910390fd5b80341115611b6a5760008033611e3034856123c4565b604051600081818185875af1925050503d8060008114611e6c576040519150601f19603f3d011682016040523d82523d6000602084013e611e71565b606091505b50915091508181906118a75760405160e560020a62461bcd0281526004016107b99190612b30565b6000611ea482611d2b565b905083600160a060020a031681600160a060020a031614611eda5760405160e860020a62a1148102815260040160405180910390fd5b600033600160a060020a0386161480611ef85750611ef88533611a96565b80611f13575033611f08846108a9565b600160a060020a0316145b905080611f365760405160e160020a632ce44b5f02815260040160405180910390fd5b600160a060020a038416611f605760405160e260020a633a954ecd02815260040160405180910390fd5b60008381526006602090815260408083208054600160a060020a0319169055600160a060020a03888116845260058352818420805460001901905587168352808320805460010190558583526004909152902060e160020a4260a060020a028617811790915582166120005760018301600081815260046020526040902054611ffe576000548114611ffe5760008181526004602052604090208390555b505b8284600160a060020a031686600160a060020a0316600080516020612d7183398151915260405160405180910390a45050505050565b60006114c88284612cf8565b600a8054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61209c612514565b600082815260046020526040902054610781906123d0565b6120bc612514565b6107816120c883611d2b565b6123d0565b60405160e160020a630a85bd01028152600090600160a060020a0385169063150b7a0290612105903390899088908890600401612a79565b602060405180830381600087803b15801561211f57600080fd5b505af192505050801561214f575060408051601f3d908101601f1916820190925261214c91810190612948565b60015b6121ad573d80801561217d576040519150601f19603f3d011682016040523d82523d6000602084013e612182565b606091505b5080516121a55760405160e160020a6368d2bf6b02815260040160405180910390fd5b805181602001fd5b600160e060020a03191660e160020a630a85bd0102149050949350505050565b6060600e805461082690612c9e565b604080516080810191829052607f0190826030600a8206018353600a90045b801561221957600183039250600a81066030018353600a90046121fb565b50819003601f19909101908152919050565b600082612238858461240b565b14949350505050565b600054600160a060020a03841661226d5760405160e860020a622e076302815260040160405180910390fd5b8261228e5760405160e060020a63b562e8dd02815260040160405180910390fd5b61229781611d04565b156122b75760405160e060020a62a5a1f502815260040160405180910390fd5b600160a060020a038416600081815260056020908152604080832080546001604060020a0189020190558483526004909152902060a060020a4202861760e160020a60018714021790558190818501903b15612381575b6040518290600160a060020a03881690600090600080516020612d71833981519152908290a461234760008784806001019550876120cd565b6123675760405160e160020a6368d2bf6b02815260040160405180910390fd5b80821061230e57826000541461237c57600080fd5b6123b4565b5b604051600183019290600160a060020a03881690600090600080516020612d71833981519152908290a4808210612382575b5060009081556118a79085838684565b60006114c88284612c5b565b6123d8612514565b600160a060020a03821681526001604060020a0360a060020a830416602082015260e060020a9091161515604082015290565b600081815b8451811015610f3a5761244d828683815181106124405760e060020a634e487b7102600052603260045260246000fd5b6020026020010151612461565b91508061245981612cdd565b915050612410565b600081831061247d5760008281526020849052604090206114c8565b60008381526020839052604090206114c8565b82805461249c90612c9e565b90600052602060002090601f0160209004810192826124be5760008555612504565b82601f106124d75782800160ff19823516178555612504565b82800160010185558215612504579182015b828111156125045782358255916020019190600101906124e9565b50612510929150612534565b5090565b604080516060810182526000808252602082018190529181019190915290565b5b808211156125105760008155600101612535565b8035600160a060020a038116811461256057600080fd5b919050565b8035801515811461256057600080fd5b80356001606060020a038116811461256057600080fd5b60006020828403121561259d578081fd5b6114c882612549565b600080604083850312156125b8578081fd5b6125c183612549565b91506125cf60208401612549565b90509250929050565b6000806000606084860312156125ec578081fd5b6125f584612549565b925061260360208501612549565b9150604084013590509250925092565b60008060008060808587031215612628578081fd5b61263185612549565b93506020612640818701612549565b93506040860135925060608601356001604060020a0380821115612662578384fd5b818801915088601f830112612675578384fd5b81358181111561268757612687612d40565b612699601f8201601f19168501612bbd565b915080825289848285010111156126ae578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156126dc578182fd5b6126e583612549565b91506125cf60208401612565565b60008060408385031215612705578182fd5b61270e83612549565b946020939093013593505050565b600080600060608486031215612730578283fd5b61273984612549565b95602085013595506040909401359392505050565b60008060008060808587031215612763578384fd5b61276c85612549565b935060208581013593506040860135925060608601356001604060020a03811115612795578283fd5b8601601f810188136127a5578283fd5b80356127b86127b382612bed565b612bbd565b81815283810190838501858402850186018c10156127d4578687fd5b8694505b838510156127f65780358352600194909401939185019185016127d8565b50979a9699509497505050505050565b600080600060608486031215612730578081fd5b6000806040838503121561282c578182fd5b61283583612549565b91506125cf60208401612575565b60006020808385031215612855578182fd5b82356001604060020a0381111561286a578283fd5b8301601f8101851361287a578283fd5b80356128886127b382612bed565b81815283810190838501858402850186018910156128a4578687fd5b8694505b838510156128c65780358352600194909401939185019185016128a8565b50979650505050505050565b6000806000606084860312156128e6578081fd5b6128ef84612565565b92506128fd60208501612575565b915061290b60408501612575565b90509250925092565b600060208284031215612925578081fd5b5035919050565b60006020828403121561293d578081fd5b81356114c881612d5a565b600060208284031215612959578081fd5b81516114c881612d5a565b60008060208385031215612976578182fd5b82356001604060020a038082111561298c578384fd5b818501915085601f83011261299f578384fd5b8135818111156129ad578485fd5b8660208285010111156129be578485fd5b60209290920196919550909350505050565b600080604083850312156129e2578182fd5b50508035926020909101359150565b60008151808452612a09816020860160208601612c72565b601f01601f19169290920160200192915050565b8051600160a060020a031682526020808201516001604060020a0316908301526040908101511515910152565b60008351612a5c818460208801612c72565b835190830190612a70818360208801612c72565b01949350505050565b600160a060020a0385811682528416602082015260408101839052608060608201819052600090612aac908301846129f1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156112f257612ae5838551612a1d565b9284019260609290920191600101612ad2565b6020808252825182820181905260009190848201906040850190845b818110156112f257835183529284019291840191600101612b14565b6020815260006114c860208301846129f1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b606081016107818284612a1d565b604051601f8201601f191681016001604060020a0381118282101715612be557612be5612d40565b604052919050565b60006001604060020a03821115612c0657612c06612d40565b5060209081020190565b60008219821115612c2357612c23612d0c565b500190565b600082612c3757612c37612d26565b500490565b6000816000190483118215151615612c5657612c56612d0c565b500290565b600082821015612c6d57612c6d612d0c565b500390565b60005b83811015612c8d578181015183820152602001612c75565b838111156118a75750506000910152565b600281046001821680612cb257607f821691505b60208210811415612cd75760e060020a634e487b710260009081526022600452602490fd5b50919050565b6000600019821415612cf157612cf1612d0c565b5060010190565b600082612d0757612d07612d26565b500690565b60e060020a634e487b710260009081526011600452602490fd5b60e060020a634e487b710260009081526012600452602490fd5b60e060020a634e487b710260009081526041600452602490fd5b600160e060020a031981168114611b6a57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a98790f2de35f830e9533b667dae6f9d0bb967e8708b09aeee888fcff955a4b864736f6c63430008040033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000af1185be8b3fa871680172cc3a5e09e93ab834bd00000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000012a6d8e11220000000000000000000000000000000000000000000000000000010e0198eaee000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000193649585459384947485420426f6c642042756e6e79204e46540000000000000000000000000000000000000000000000000000000000000000000000000000034242590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f6d657461737461712e6d7970696e6174612e636c6f75642f697066732f516d534c57425a59524b4552347a706f487946366f6a704b33454e386e42593675554e564d51575569323652434a2f000000000000000000000000
Deployed Bytecode
0x6080604052600436106101cf5760e060020a600035046301ffc9a781146101d857806302fa7c471461020d57806306fdde031461022d578063081812fc1461024f578063095ea7b31461028757806318160ddd146102a75780631e2f2600146102ca57806323b872dd146102dd5780632a55205a146102fd5780633f5e47411461033c57806342842e0e1461035457806355eba0c81461037457806355f804b3146103945780635bbb2177146103b45780635ca1e165146103e1578063627804af146103f65780636352211e1461041657806370a0823114610436578063715018a6146104565780638462151c1461046b5780638bc35c2f146104985780638da5cb5b146104cc57806390aa0b0f146104e15780639231ab2a1461053c57806395d89b411461056957806399a2557a1461057e5780639c5d82841461059e578063a22cb465146105b1578063ac446002146105d1578063b88d4fde146105e6578063baa79fb914610606578063bf0b175e14610626578063c23dc68f1461065e578063c87b56dd1461067e578063d367c5401461069e578063dab5f340146106b3578063dc33e681146106d3578063e985e9c5146106f3578063f2fde38b14610713578063fbe1aa511461073357005b366101d657005b005b3480156101e457600080fd5b506101f86101f336600461292c565b610767565b60405190151581526020015b60405180910390f35b34801561021957600080fd5b506101d661022836600461281a565b610787565b34801561023957600080fd5b50610242610817565b6040516102049190612b30565b34801561025b57600080fd5b5061026f61026a366004612914565b6108a9565b604051600160a060020a039091168152602001610204565b34801561029357600080fd5b506101d66102a23660046126f3565b6108f0565b3480156102b357600080fd5b50600154600054035b604051908152602001610204565b6101d66102d836600461274e565b6109c9565b3480156102e957600080fd5b506101d66102f83660046125d8565b610ccf565b34801561030957600080fd5b5061031d6103183660046129d0565b610cdf565b60408051600160a060020a039093168352602083019190915201610204565b34801561034857600080fd5b50600f5460ff166101f8565b34801561036057600080fd5b506101d661036f3660046125d8565b610d8b565b34801561038057600080fd5b506101d661038f36600461258c565b610da6565b3480156103a057600080fd5b506101d66103af366004612964565b610e1d565b3480156103c057600080fd5b506103d46103cf366004612843565b610e5b565b6040516102049190612ab6565b3480156103ed57600080fd5b50600d546102bc565b34801561040257600080fd5b506101d66104113660046126f3565b610f42565b34801561042257600080fd5b5061026f610431366004612914565b611155565b34801561044257600080fd5b506102bc61045136600461258c565b611160565b34801561046257600080fd5b506101d66111b1565b34801561047757600080fd5b5061048b61048636600461258c565b6111ef565b6040516102049190612af8565b3480156104a457600080fd5b506102bc7f000000000000000000000000000000000000000000000000000000000000000481565b3480156104d857600080fd5b5061026f6112fe565b3480156104ed57600080fd5b50600f546105159060ff8116906001606060020a036101008204811691606860020a90041683565b6040805193151584526001606060020a039283166020850152911690820152606001610204565b34801561054857600080fd5b5061055c610557366004612914565b61130d565b6040516102049190612baf565b34801561057557600080fd5b5061024261131e565b34801561058a57600080fd5b5061048b610599366004612806565b61132d565b6101d66105ac36600461271c565b6114cf565b3480156105bd57600080fd5b506101d66105cc3660046126ca565b6116ee565b3480156105dd57600080fd5b506101d6611787565b3480156105f257600080fd5b506101d6610601366004612613565b611860565b34801561061257600080fd5b506101d66106213660046128d2565b6118ad565b34801561063257600080fd5b5061064661064136600461258c565b61194d565b6040516001604060020a039091168152602001610204565b34801561066a57600080fd5b5061055c610679366004612914565b611958565b34801561068a57600080fd5b50610242610699366004612914565b61199b565b3480156106aa57600080fd5b5061026f611a22565b3480156106bf57600080fd5b506101d66106ce366004612914565b611a31565b3480156106df57600080fd5b506102bc6106ee36600461258c565b611a68565b3480156106ff57600080fd5b506101f861070e3660046125a6565b611a96565b34801561071f57600080fd5b506101d661072e36600461258c565b611ac4565b34801561073f57600080fd5b506102bc7f00000000000000000000000000000000000000000000000000000000000007d081565b600061077282611b6d565b80610781575061078182611ba8565b92915050565b336107906112fe565b600160a060020a0316146107c25760405160e560020a62461bcd0281526004016107b990612b43565b60405180910390fd5b6107cc8282611bff565b6040516001606060020a0382168152600160a060020a038316907fae1d656a1268648b04ffa79c1416f05879338ae295aae3234d8db217356a1c629060200160405180910390a25050565b60606002805461082690612c9e565b80601f016020809104026020016040519081016040528092919081815260200182805461085290612c9e565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b482611d04565b6108d45760405160e260020a6333d1c03902815260040160405180910390fd5b50600090815260066020526040902054600160a060020a031690565b60006108fb82611d2b565b905080600160a060020a031683600160a060020a031614156109335760405160e260020a63250fdee302815260040160405180910390fd5b33600160a060020a0382161461096d5761094d8133611a96565b61096d5760405160e160020a6367d9dca102815260040160405180910390fd5b6000828152600660205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600f5460ff16156109f05760405160e060020a63c16b32a702815260040160405180910390fd5b8160e260020a63199a585d021480610a1357508160d060020a6563727970746f02145b610a335760405160e360020a630e5525c302815260040160405180910390fd5b600f5461010090046001606060020a031680610a655760405160e060020a63bd5cf13902815260040160405180910390fd5b60408051600160a060020a038716606060020a026020808301919091528251601481840301815260349092019092528051910120610aa39083611d8f565b610ac35760405160e060020a63e0e6520902815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000004610af785610af188611a68565b90611d9e565b1115610b195760405160e160020a635bfc5f1302815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000007d0610b4b85610af16001546000540390565b1115610b6d5760405160e060020a632d573a5502815260040160405180910390fd5b8260e260020a63199a585d021415610c3c57610b87611a22565b600160a060020a031633600160a060020a03161480610bbe5750610ba96112fe565b600160a060020a031633600160a060020a0316145b610bde5760405160e160020a633416cf2502815260040160405180910390fd5b610c3285610bfe610bee88611daa565b87906001604060020a0316611d9e565b600160a060020a0390911660009081526005602052604090208054600160c060020a031660c060020a909202919091179055565b610c3c8585611dcc565b8260d060020a6563727970746f021415610c8557610c6085610bfe610bee88611daa565b610c6a8585611dcc565b610c85610c806001606060020a03831686611dea565b611df6565b84600160a060020a03167f81b89671479141298a3d45f69e25c5dc4b966e1d5ec99a0b8ed5c1c49f5c807c85604051610cc091815260200190565b60405180910390a25050505050565b610cda838383611e99565b505050565b6000828152600960209081526040808320815180830190925254600160a060020a03811680835260a060020a9091046001606060020a0316928201929092528291610d54575060408051808201909152600854600160a060020a038116825260a060020a90046001606060020a031660208201525b602081015160009061271090610d73906001606060020a031687612c3c565b610d7d9190612c28565b915196919550909350505050565b610cda83838360405180602001604052806000815250611860565b33610daf6112fe565b600160a060020a031614610dd85760405160e560020a62461bcd0281526004016107b990612b43565b803b15610dfb5760405160e060020a63a941357102815260040160405180910390fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b33610e266112fe565b600160a060020a031614610e4f5760405160e560020a62461bcd0281526004016107b990612b43565b610cda600e8383612490565b80516060906000816001604060020a03811115610e8b5760e060020a634e487b7102600052604160045260246000fd5b604051908082528060200260200182016040528015610ec457816020015b610eb1612514565b815260200190600190039081610ea95790505b50905060005b828114610f3a57610f04858281518110610ef75760e060020a634e487b7102600052603260045260246000fd5b6020026020010151611958565b828281518110610f275760e060020a634e487b7102600052603260045260246000fd5b6020908102919091010152600101610eca565b509392505050565b33610f4b6112fe565b600160a060020a031614610f745760405160e560020a62461bcd0281526004016107b990612b43565b6002600b541415610f9a5760405160e560020a62461bcd0281526004016107b990612b78565b6002600b557f00000000000000000000000000000000000000000000000000000000000007d0610fd182610af16001546000540390565b1115610ff35760405160e060020a636e9c909702815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000007d061102582610af16001546000540390565b11156110475760405160e060020a632d573a5502815260040160405180910390fd5b611071817f0000000000000000000000000000000000000000000000000000000000000002612036565b156110925760405160e160020a6306999b9702815260040160405180910390fd5b60006110be7f000000000000000000000000000000000000000000000000000000000000000283612c28565b905060005b81811015611107576110f5847f0000000000000000000000000000000000000000000000000000000000000002611dcc565b806110ff81612cdd565b9150506110c3565b5082600160a060020a03167f7d8400f0e58ae2e14f85b63f3afb0ca5b29328d8f48046b205fc7f174cf9b5ed8360405161114391815260200190565b60405180910390a250506001600b5550565b600061078182611d2b565b6000600160a060020a03821661118c5760405160e260020a6323d3ad8102815260040160405180910390fd5b50600160a060020a03166000908152600560205260409020546001604060020a031690565b336111ba6112fe565b600160a060020a0316146111e35760405160e560020a62461bcd0281526004016107b990612b43565b6111ed6000612042565b565b606060008060006111ff85611160565b90506000816001604060020a0381111561122c5760e060020a634e487b7102600052604160045260246000fd5b604051908082528060200260200182016040528015611255578160200160208202803683370190505b509050611260612514565b60005b8386146112f25761127381612094565b9150816040015115611284576112ea565b8151600160a060020a03161561129957815194505b87600160a060020a031685600160a060020a031614156112ea57808387806001019850815181106112dd5760e060020a634e487b7102600052603260045260246000fd5b6020026020010181815250505b600101611263565b50909695505050505050565b600a54600160a060020a031690565b611315612514565b610781826120b4565b60606003805461082690612c9e565b60608183106113525760405160e160020a631960ccad02815260040160405180910390fd5b60008061135e60005490565b90508084111561136c578093505b600061137787611160565b9050848610156113965785850381811015611390578091505b5061139a565b5060005b6000816001604060020a038111156113c55760e060020a634e487b7102600052604160045260246000fd5b6040519080825280602002602001820160405280156113ee578160200160208202803683370190505b509050816114015793506114c892505050565b600061140c88611958565b90506000816040015161141d575080515b885b88811415801561142f5750848714155b156114bc5761143d81612094565b925082604001511561144e576114b4565b8251600160a060020a03161561146357825191505b8a600160a060020a031682600160a060020a031614156114b457808488806001019950815181106114a75760e060020a634e487b7102600052603260045260246000fd5b6020026020010181815250505b60010161141f565b50505092835250909150505b9392505050565b8060e260020a63199a585d0214806114f257508060d060020a6563727970746f02145b6115125760405160e360020a630e5525c302815260040160405180910390fd5b600f54606860020a81046001606060020a03169060ff166115495760405160e060020a63ac4d09c702815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000461157784610af187611a68565b11156115995760405160e160020a635bfc5f1302815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000007d06115cb84610af16001546000540390565b11156115ed5760405160e060020a632d573a5502815260040160405180910390fd5b8160e260020a63199a585d02141561166857611607611a22565b600160a060020a031633600160a060020a0316148061163e57506116296112fe565b600160a060020a031633600160a060020a0316145b61165e5760405160e160020a633416cf2502815260040160405180910390fd5b6116688484611dcc565b8160d060020a6563727970746f02141561169c576116868484611dcc565b61169c610c806001606060020a03831685611dea565b604080518481526001606060020a0383166020820152600160a060020a038616917fa110d9d535e61584b925c9c69e6a668d389f5f8353d78e094cc8abdf3d313ebf910160405180910390a250505050565b600160a060020a03821633141561171b5760405160e060020a63b06307db02815260040160405180910390fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336117906112fe565b600160a060020a0316146117b95760405160e560020a62461bcd0281526004016107b990612b43565b6002600b5414156117df5760405160e560020a62461bcd0281526004016107b990612b78565b6002600b55604051600090819033903031908381818185875af1925050503d8060008114611829576040519150601f19603f3d011682016040523d82523d6000602084013e61182e565b606091505b50915091508181906118565760405160e560020a62461bcd0281526004016107b99190612b30565b50506001600b5550565b61186b848484611e99565b600160a060020a0383163b156118a757611887848484846120cd565b6118a75760405160e160020a6368d2bf6b02815260040160405180910390fd5b50505050565b336118b66112fe565b600160a060020a0316146118df5760405160e560020a62461bcd0281526004016107b990612b43565b604080516060810182529315158085526001606060020a0393841660208601819052929093169301839052600f80546001606860020a031916610100606860020a03199093169290921761010090910217606860020a60c860020a031916606860020a909202919091179055565b600061078182611daa565b611960612514565b611968612514565b60005483106119775792915050565b61198083612094565b90508060400151156119925792915050565b6114c8836120b4565b60606119a682611d04565b6119c65760405160e460020a630a14c4b502815260040160405180910390fd5b60006119d06121cd565b90508051600014156119f157604051806020016040528060008152506114c8565b806119fb846121dc565b604051602001611a0c929190612a4a565b6040516020818303038152906040529392505050565b600c54600160a060020a031690565b33611a3a6112fe565b600160a060020a031614611a635760405160e560020a62461bcd0281526004016107b990612b43565b600d55565b600160a060020a038116600090815260056020526040812054604060020a90046001604060020a0316610781565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b33611acd6112fe565b600160a060020a031614611af65760405160e560020a62461bcd0281526004016107b990612b43565b600160a060020a038116611b615760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061604482015260d060020a656464726573730260648201526084016107b9565b611b6a81612042565b50565b6000600160e060020a0319821660e160020a63152a902d021480610781575060e060020a6301ffc9a702600160e060020a0319831614610781565b600060e060020a6301ffc9a702600160e060020a031983161480611bdf575060e060020a6380ac58cd02600160e060020a03198316145b80610781575050600160e060020a03191660e060020a635b5e139f021490565b6127106001606060020a0382161115611c735760405160e560020a62461bcd02815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c20657863656564604482015260b060020a692073616c6550726963650260648201526084016107b9565b600160a060020a038216611ccb5760405160e560020a62461bcd0281526020600482015260196024820152603960020a7822a921991c9c189d1034b73b30b634b2103932b1b2b4bb32b90260448201526064016107b9565b60408051808201909152600160a060020a039092168083526001606060020a03909116602090920182905260a060020a90910217600855565b600080548210801561078157505060009081526004602052604090205460e060020a161590565b600081600054811015611d735760008181526004602052604090205460e060020a8116611d71575b806114c8575060001901600081815260046020526040902054611d53565b505b60405160e160020a636f96cda102815260040160405180910390fd5b60006114c882600d548561222b565b60006114c88284612c10565b600160a060020a031660009081526005602052604090205460c060020a900490565b611de6828260405180602001604052806000815250612241565b5050565b60006114c88284612c3c565b80341015611e1a5760405160e060020a63cd1c886702815260040160405180910390fd5b80341115611b6a5760008033611e3034856123c4565b604051600081818185875af1925050503d8060008114611e6c576040519150601f19603f3d011682016040523d82523d6000602084013e611e71565b606091505b50915091508181906118a75760405160e560020a62461bcd0281526004016107b99190612b30565b6000611ea482611d2b565b905083600160a060020a031681600160a060020a031614611eda5760405160e860020a62a1148102815260040160405180910390fd5b600033600160a060020a0386161480611ef85750611ef88533611a96565b80611f13575033611f08846108a9565b600160a060020a0316145b905080611f365760405160e160020a632ce44b5f02815260040160405180910390fd5b600160a060020a038416611f605760405160e260020a633a954ecd02815260040160405180910390fd5b60008381526006602090815260408083208054600160a060020a0319169055600160a060020a03888116845260058352818420805460001901905587168352808320805460010190558583526004909152902060e160020a4260a060020a028617811790915582166120005760018301600081815260046020526040902054611ffe576000548114611ffe5760008181526004602052604090208390555b505b8284600160a060020a031686600160a060020a0316600080516020612d7183398151915260405160405180910390a45050505050565b60006114c88284612cf8565b600a8054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61209c612514565b600082815260046020526040902054610781906123d0565b6120bc612514565b6107816120c883611d2b565b6123d0565b60405160e160020a630a85bd01028152600090600160a060020a0385169063150b7a0290612105903390899088908890600401612a79565b602060405180830381600087803b15801561211f57600080fd5b505af192505050801561214f575060408051601f3d908101601f1916820190925261214c91810190612948565b60015b6121ad573d80801561217d576040519150601f19603f3d011682016040523d82523d6000602084013e612182565b606091505b5080516121a55760405160e160020a6368d2bf6b02815260040160405180910390fd5b805181602001fd5b600160e060020a03191660e160020a630a85bd0102149050949350505050565b6060600e805461082690612c9e565b604080516080810191829052607f0190826030600a8206018353600a90045b801561221957600183039250600a81066030018353600a90046121fb565b50819003601f19909101908152919050565b600082612238858461240b565b14949350505050565b600054600160a060020a03841661226d5760405160e860020a622e076302815260040160405180910390fd5b8261228e5760405160e060020a63b562e8dd02815260040160405180910390fd5b61229781611d04565b156122b75760405160e060020a62a5a1f502815260040160405180910390fd5b600160a060020a038416600081815260056020908152604080832080546001604060020a0189020190558483526004909152902060a060020a4202861760e160020a60018714021790558190818501903b15612381575b6040518290600160a060020a03881690600090600080516020612d71833981519152908290a461234760008784806001019550876120cd565b6123675760405160e160020a6368d2bf6b02815260040160405180910390fd5b80821061230e57826000541461237c57600080fd5b6123b4565b5b604051600183019290600160a060020a03881690600090600080516020612d71833981519152908290a4808210612382575b5060009081556118a79085838684565b60006114c88284612c5b565b6123d8612514565b600160a060020a03821681526001604060020a0360a060020a830416602082015260e060020a9091161515604082015290565b600081815b8451811015610f3a5761244d828683815181106124405760e060020a634e487b7102600052603260045260246000fd5b6020026020010151612461565b91508061245981612cdd565b915050612410565b600081831061247d5760008281526020849052604090206114c8565b60008381526020839052604090206114c8565b82805461249c90612c9e565b90600052602060002090601f0160209004810192826124be5760008555612504565b82601f106124d75782800160ff19823516178555612504565b82800160010185558215612504579182015b828111156125045782358255916020019190600101906124e9565b50612510929150612534565b5090565b604080516060810182526000808252602082018190529181019190915290565b5b808211156125105760008155600101612535565b8035600160a060020a038116811461256057600080fd5b919050565b8035801515811461256057600080fd5b80356001606060020a038116811461256057600080fd5b60006020828403121561259d578081fd5b6114c882612549565b600080604083850312156125b8578081fd5b6125c183612549565b91506125cf60208401612549565b90509250929050565b6000806000606084860312156125ec578081fd5b6125f584612549565b925061260360208501612549565b9150604084013590509250925092565b60008060008060808587031215612628578081fd5b61263185612549565b93506020612640818701612549565b93506040860135925060608601356001604060020a0380821115612662578384fd5b818801915088601f830112612675578384fd5b81358181111561268757612687612d40565b612699601f8201601f19168501612bbd565b915080825289848285010111156126ae578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156126dc578182fd5b6126e583612549565b91506125cf60208401612565565b60008060408385031215612705578182fd5b61270e83612549565b946020939093013593505050565b600080600060608486031215612730578283fd5b61273984612549565b95602085013595506040909401359392505050565b60008060008060808587031215612763578384fd5b61276c85612549565b935060208581013593506040860135925060608601356001604060020a03811115612795578283fd5b8601601f810188136127a5578283fd5b80356127b86127b382612bed565b612bbd565b81815283810190838501858402850186018c10156127d4578687fd5b8694505b838510156127f65780358352600194909401939185019185016127d8565b50979a9699509497505050505050565b600080600060608486031215612730578081fd5b6000806040838503121561282c578182fd5b61283583612549565b91506125cf60208401612575565b60006020808385031215612855578182fd5b82356001604060020a0381111561286a578283fd5b8301601f8101851361287a578283fd5b80356128886127b382612bed565b81815283810190838501858402850186018910156128a4578687fd5b8694505b838510156128c65780358352600194909401939185019185016128a8565b50979650505050505050565b6000806000606084860312156128e6578081fd5b6128ef84612565565b92506128fd60208501612575565b915061290b60408501612575565b90509250925092565b600060208284031215612925578081fd5b5035919050565b60006020828403121561293d578081fd5b81356114c881612d5a565b600060208284031215612959578081fd5b81516114c881612d5a565b60008060208385031215612976578182fd5b82356001604060020a038082111561298c578384fd5b818501915085601f83011261299f578384fd5b8135818111156129ad578485fd5b8660208285010111156129be578485fd5b60209290920196919550909350505050565b600080604083850312156129e2578182fd5b50508035926020909101359150565b60008151808452612a09816020860160208601612c72565b601f01601f19169290920160200192915050565b8051600160a060020a031682526020808201516001604060020a0316908301526040908101511515910152565b60008351612a5c818460208801612c72565b835190830190612a70818360208801612c72565b01949350505050565b600160a060020a0385811682528416602082015260408101839052608060608201819052600090612aac908301846129f1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156112f257612ae5838551612a1d565b9284019260609290920191600101612ad2565b6020808252825182820181905260009190848201906040850190845b818110156112f257835183529284019291840191600101612b14565b6020815260006114c860208301846129f1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b606081016107818284612a1d565b604051601f8201601f191681016001604060020a0381118282101715612be557612be5612d40565b604052919050565b60006001604060020a03821115612c0657612c06612d40565b5060209081020190565b60008219821115612c2357612c23612d0c565b500190565b600082612c3757612c37612d26565b500490565b6000816000190483118215151615612c5657612c56612d0c565b500290565b600082821015612c6d57612c6d612d0c565b500390565b60005b83811015612c8d578181015183820152602001612c75565b838111156118a75750506000910152565b600281046001821680612cb257607f821691505b60208210811415612cd75760e060020a634e487b710260009081526022600452602490fd5b50919050565b6000600019821415612cf157612cf1612d0c565b5060010190565b600082612d0757612d07612d26565b500690565b60e060020a634e487b710260009081526011600452602490fd5b60e060020a634e487b710260009081526012600452602490fd5b60e060020a634e487b710260009081526041600452602490fd5b600160e060020a031981168114611b6a57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a98790f2de35f830e9533b667dae6f9d0bb967e8708b09aeee888fcff955a4b864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000af1185be8b3fa871680172cc3a5e09e93ab834bd00000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000012a6d8e11220000000000000000000000000000000000000000000000000000010e0198eaee000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000193649585459384947485420426f6c642042756e6e79204e46540000000000000000000000000000000000000000000000000000000000000000000000000000034242590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f6d657461737461712e6d7970696e6174612e636c6f75642f697066732f516d534c57425a59524b4552347a706f487946366f6a704b33454e386e42593675554e564d51575569323652434a2f000000000000000000000000
-----Decoded View---------------
Arg [0] : tokenName_ (string): 6IXTY8IGHT Bold Bunny NFT
Arg [1] : tokenSymbol_ (string): BBY
Arg [2] : maxBatchSize_ (uint256): 2
Arg [3] : collectionSize_ (uint256): 2000
Arg [4] : hotWallet_ (address): 0xAf1185bE8b3Fa871680172Cc3A5E09E93ab834Bd
Arg [5] : amountForDevs_ (uint256): 2000
Arg [6] : isPublicSaleStarted_ (bool): False
Arg [7] : royaltyFeesInBips_ (uint96): 1000
Arg [8] : publicPrice_ (uint96): 84000000000000000
Arg [9] : allowListPrice_ (uint96): 76000000000000000
Arg [10] : baseTokenURI_ (string): https://metastaq.mypinata.cloud/ipfs/QmSLWBZYRKER4zpoHyF6ojpK3EN8nBY6uUNVMQWUi26RCJ/
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 000000000000000000000000af1185be8b3fa871680172cc3a5e09e93ab834bd
Arg [5] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [8] : 000000000000000000000000000000000000000000000000012a6d8e11220000
Arg [9] : 000000000000000000000000000000000000000000000000010e0198eaee0000
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [12] : 3649585459384947485420426f6c642042756e6e79204e465400000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [14] : 4242590000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000054
Arg [16] : 68747470733a2f2f6d657461737461712e6d7970696e6174612e636c6f75642f
Arg [17] : 697066732f516d534c57425a59524b4552347a706f487946366f6a704b33454e
Arg [18] : 386e42593675554e564d51575569323652434a2f000000000000000000000000
Deployed Bytecode Sourcemap
658:13998:12:-:0;;;;;;;;-1:-1:-1;;;658:13998:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4414:500;;;;;;;;;;-1:-1:-1;4414:500:12;;;;;:::i;:::-;;:::i;:::-;;;12124:14:16;;12117:22;12099:41;;12087:2;12072:18;4414:500:12;;;;;;;;3644:239;;;;;;;;;;-1:-1:-1;3644:239:12;;;;;:::i;:::-;;:::i;9961:98:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12078:236::-;;;;;;;;;;-1:-1:-1;12078:236:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9771:32:16;;;9753:51;;9741:2;9726:18;12078:236:4;9708:102:16;11554:463:4;;;;;;;;;;-1:-1:-1;11554:463:4;;;;;:::i;:::-;;:::i;3957:309::-;;;;;;;;;;-1:-1:-1;4219:12:4;;4010:7;4203:13;:28;3957:309;;;12682:25:16;;;12670:2;12655:18;3957:309:4;12637:76:16;6199:1245:12;;;;;;:::i;:::-;;:::i;13046:164:4:-;;;;;;;;;;-1:-1:-1;13046:164:4;;;;;:::i;:::-;;:::i;1632:432:3:-;;;;;;;;;;-1:-1:-1;1632:432:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10500:32:16;;;10482:51;;10564:2;10549:18;;10542:34;;;;10455:18;1632:432:3;10437:145:16;9763:113:12;;;;;;;;;;-1:-1:-1;9838:10:12;:30;;;9763:113;;13276:179:4;;;;;;;;;;-1:-1:-1;13276:179:4;;;;;:::i;:::-;;:::i;10241:181:12:-;;;;;;;;;;-1:-1:-1;10241:181:12;;;;;:::i;:::-;;:::i;11103:104::-;;;;;;;;;;-1:-1:-1;11103:104:12;;;;;:::i;:::-;;:::i;1501:459:5:-;;;;;;;;;;-1:-1:-1;1501:459:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13956:79:12:-;;;;;;;;;;-1:-1:-1;14024:4:12;;13956:79;;9087:580;;;;;;;;;;-1:-1:-1;9087:580:12;;;;;:::i;:::-;;:::i;9757:142:4:-;;;;;;;;;;-1:-1:-1;9757:142:4;;;;;:::i;:::-;;:::i;5567:221::-;;;;;;;;;;-1:-1:-1;5567:221:4;;;;;:::i;:::-;;:::i;1598:92:13:-;;;;;;;;;;;;;:::i;5219:871:5:-;;;;;;;;;;-1:-1:-1;5219:871:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;828:48:12:-;;;;;;;;;;;;;;;966:85:13;;;;;;;;;;;;;:::i;1387:28:12:-;;;;;;;;;;-1:-1:-1;1387:28:12;;;;;;;;-1:-1:-1;;;;;1387:28:12;;;;;;-1:-1:-1;;;1387:28:12;;;;;;;;;12368:14:16;;12361:22;12343:41;;-1:-1:-1;;;;;12457:15:16;;;12452:2;12437:18;;12430:43;12509:15;;12489:18;;;12482:43;12331:2;12316:18;1387:28:12;12298:233:16;11807:162:12;;;;;;;;;;-1:-1:-1;11807:162:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10123:102:4:-;;;;;;;;;;;;;:::i;2336:2446:5:-;;;;;;;;;;-1:-1:-1;2336:2446:5;;;;;:::i;:::-;;:::i;7962:982:12:-;;;;;;:::i;:::-;;:::i;12381:331:4:-;;;;;;;;;;-1:-1:-1;12381:331:4;;;;;:::i;:::-;;:::i;12389:287:12:-;;;;;;;;;;;;;:::i;13521:385:4:-;;;;;;;;;;-1:-1:-1;13521:385:4;;;;;:::i;:::-;;:::i;5341:289:12:-;;;;;;;;;;-1:-1:-1;5341:289:12;;;;;:::i;:::-;;:::i;11583:100::-;;;;;;;;;;-1:-1:-1;11583:100:12;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;15727:31:16;;;15709:50;;15697:2;15682:18;11583:100:12;15664:101:16;938:410:5;;;;;;;;;;-1:-1:-1;938:410:5;;;;;:::i;:::-;;:::i;10291:401:4:-;;;;;;;;;;-1:-1:-1;10291:401:4;;;;;:::i;:::-;;:::i;9946:87:12:-;;;;;;;;;;;;;:::i;13798:80::-;;;;;;;;;;-1:-1:-1;13798:80:12;;;;;:::i;:::-;;:::i;11319:113::-;;;;;;;;;;-1:-1:-1;11319:113:12;;;;;:::i;:::-;;:::i;12778:206:4:-;;;;;;;;;;-1:-1:-1;12778:206:4;;;;;:::i;:::-;;:::i;1839:189:13:-;;;;;;;;;;-1:-1:-1;1839:189:13;;;;;:::i;:::-;;:::i;928:38:12:-;;;;;;;;;;;;;;;4414:500;4557:4;4815:38;4841:11;4815:25;:38::i;:::-;:92;;;;4869:38;4895:11;4869:25;:38::i;:::-;4796:111;4414:500;-1:-1:-1;;4414:500:12:o;3644:239::-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;;;;;;;;;3763:49:12::1;3782:9;3793:18;3763;:49::i;:::-;3827;::::0;-1:-1:-1;;;;;15932:31:16;;15914:50;;-1:-1:-1;;;;;3827:49:12;::::1;::::0;::::1;::::0;15902:2:16;15887:18;3827:49:12::1;;;;;;;3644:239:::0;;:::o;9961:98:4:-;10015:13;10047:5;10040:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9961:98;:::o;12078:236::-;12178:7;12206:16;12214:7;12206;:16::i;:::-;12201:64;;12231:34;;-1:-1:-1;;;;;12231:34:4;;;;;;;;;;;12201:64;-1:-1:-1;12283:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;12283:24:4;;12078:236::o;11554:463::-;11626:13;11658:27;11677:7;11658:18;:27::i;:::-;11626:61;;11707:5;-1:-1:-1;;;;;11701:11:4;:2;-1:-1:-1;;;;;11701:11:4;;11697:48;;;11721:24;;-1:-1:-1;;;;;11721:24:4;;;;;;;;;;;11697:48;665:10:1;-1:-1:-1;;;;;11760:28:4;;;11756:172;;11807:44;11824:5;665:10:1;12778:206:4;:::i;11807:44::-;11802:126;;11878:35;;-1:-1:-1;;;;;11878:35:4;;;;;;;;;;;11802:126;11938:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;11938:29:4;-1:-1:-1;;;;;11938:29:4;;;;;;;;;11982:28;;11938:24;;11982:28;;;;;;;11554:463;;;:::o;6199:1245:12:-;6359:10;:30;;;6356:62;;;6398:20;;-1:-1:-1;;;;;6398:20:12;;;;;;;;;;;6356:62;6434:5;-1:-1:-1;;;;;6434:15:12;:36;;;;6453:5;-1:-1:-1;;;;;6453:17:12;6434:36;6428:84;;6492:20;;-1:-1:-1;;;;;6492:20:12;;;;;;;;;;;6428:84;6544:10;:25;;;;-1:-1:-1;;;;;6544:25:12;;6580:48;;6603:25;;-1:-1:-1;;;;;6603:25:12;;;;;;;;;;;6580:48;14251:25;;;-1:-1:-1;;;;;8837:32:16;;-1:-1:-1;;;8833:49:16;14251:25:12;;;;8821:62:16;;;;14251:25:12;;;;;;;;;8899:12:16;;;;14251:25:12;;;14241:36;;;;;6644:25;;6663:5;6644:7;:25::i;:::-;6638:57;;6679:16;;-1:-1:-1;;;;;6679:16:12;;;;;;;;;;;6638:57;6742:23;6709:30;6730:8;6709:16;6722:2;6709:12;:16::i;:::-;:20;;:30::i;:::-;:56;6705:102;;;6786:21;;-1:-1:-1;;;;;6786:21:12;;;;;;;;;;;6705:102;6851:14;6821:27;6839:8;6821:13;4219:12:4;;4010:7;4203:13;:28;;3957:309;6821:27:12;:44;6817:84;;;6886:15;;-1:-1:-1;;;;;6886:15:12;;;;;;;;;;;6817:84;6915:5;-1:-1:-1;;;;;6915:15:12;6911:298;;;6992:14;:12;:14::i;:::-;-1:-1:-1;;;;;6969:37:12;665:10:1;-1:-1:-1;;;;;6969:37:12;;:91;;;;7053:7;:5;:7::i;:::-;-1:-1:-1;;;;;7030:30:12;665:10:1;-1:-1:-1;;;;;7030:30:12;;6969:91;6946:155;;7083:18;;-1:-1:-1;;;;;7083:18:12;;;;;;;;;;;6946:155;7115:46;7123:2;7134:25;7147:11;7155:2;7147:7;:11::i;:::-;7134:8;;-1:-1:-1;;;;;7134:25:12;:12;:25::i;:::-;-1:-1:-1;;;;;6863:25:4;;;6846:14;6863:25;;;:18;:25;;;;;;;-1:-1:-1;;;;;7034:31:4;-1:-1:-1;;;7070:23:4;;;7033:61;;;;7104:34;;6783:362;7115:46:12;7175:23;7185:2;7189:8;7175:9;:23::i;:::-;7222:5;-1:-1:-1;;;;;7222:17:12;7218:178;;;7255:46;7263:2;7274:25;7287:11;7295:2;7287:7;:11::i;7255:46::-;7315:23;7325:2;7329:8;7315:9;:23::i;:::-;7352:33;7365:19;-1:-1:-1;;;;;7365:9:12;;7375:8;7365:9;:19::i;:::-;7352:12;:33::i;:::-;7424:2;-1:-1:-1;;;;;7410:27:12;;7428:8;7410:27;;;;12682:25:16;;12670:2;12655:18;;12637:76;7410:27:12;;;;;;;;6199:1245;;;;;:::o;13046:164:4:-;13175:28;13185:4;13191:2;13195:7;13175:9;:28::i;:::-;13046:164;;;:::o;1632:432:3:-;1729:7;1786:27;;;:17;:27;;;;;;;;1757:56;;;;;;;;;-1:-1:-1;;;;;1757:56:3;;;;;-1:-1:-1;;;1757:56:3;;;-1:-1:-1;;;;;1757:56:3;;;;;;;;1729:7;;1824:90;;-1:-1:-1;1874:29:3;;;;;;;;;1884:19;1874:29;-1:-1:-1;;;;;1874:29:3;;;;-1:-1:-1;;;1874:29:3;;-1:-1:-1;;;;;1874:29:3;;;;;1824:90;1962:23;;;;1924:21;;2422:5;;1949:36;;-1:-1:-1;;;;;1949:36:3;:10;:36;:::i;:::-;1948:58;;;;:::i;:::-;2025:16;;;;;-1:-1:-1;1632:432:3;;-1:-1:-1;;;;1632:432:3:o;13276:179:4:-;13409:39;13426:4;13432:2;13436:7;13409:39;;;;;;;;;;;;:16;:39::i;10241:181:12:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;1034:20:0;;1080:8;10313:70:12::1;;10356:27;;-1:-1:-1::0;;;;;10356:27:12::1;;;;;;;;;;;10313:70;10393:9;:22:::0;;-1:-1:-1;;;;;;10393:22:12::1;-1:-1:-1::0;;;;;10393:22:12;;;::::1;::::0;;;::::1;::::0;;10241:181::o;11103:104::-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;11177:23:12::1;:13;11193:7:::0;;11177:23:::1;:::i;1501:459:5:-:0;1674:15;;1590:23;;1649:22;1674:15;-1:-1:-1;;;;;1740:36:5;;;;;-1:-1:-1;;;;;1740:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1703:73;;1795:9;1790:123;1811:14;1806:1;:19;1790:123;;1866:32;1886:8;1895:1;1886:11;;;;;;-1:-1:-1;;;;;1886:11:5;;;;;;;;;;;;;;;1866:19;:32::i;:::-;1850:10;1861:1;1850:13;;;;;;-1:-1:-1;;;;;1850:13:5;;;;;;;;;;;;;;;;;;:48;1827:3;;1790:123;;;-1:-1:-1;1933:10:5;1501:459;-1:-1:-1;;;1501:459:5:o;9087:580:12:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;1680:1:14::1;2259:7;;:19;;2251:63;;;;-1:-1:-1::0;;;;;2251:63:14::1;;;;;;;:::i;:::-;1680:1;2389:7;:18:::0;9235:13:12::2;9205:27;9223:8:::0;9205:13:::2;4219:12:4::0;;4010:7;4203:13;:28;;3957:309;9205:27:12::2;:43;9201:78;;;9258:21;;-1:-1:-1::0;;;;;9258:21:12::2;;;;;;;;;;;9201:78;9319:14;9289:27;9307:8;9289:13;4219:12:4::0;;4010:7;4203:13;:28;;3957:309;9289:27:12::2;:44;9285:73;;;9343:15;;-1:-1:-1::0;;;;;9343:15:12::2;;;;;;;;;;;9285:73;9368:26;:8:::0;9381:12:::2;9368;:26::i;:::-;:31:::0;9364:71:::2;;9408:27;;-1:-1:-1::0;;;;;9408:27:12::2;;;;;;;;;;;9364:71;9446:17;9466:23;9477:12;9466:8:::0;:23:::2;:::i;:::-;9446:43;;9538:9;9533:92;9557:9;9553:1;:13;9533:92;;;9587:27;9597:2;9601:12;9587:9;:27::i;:::-;9568:3:::0;::::2;::::0;::::2;:::i;:::-;;;;9533:92;;;;9647:2;-1:-1:-1::0;;;;;9639:21:12::2;;9651:8;9639:21;;;;12682:25:16::0;;12670:2;12655:18;;12637:76;9639:21:12::2;;;;;;;;-1:-1:-1::0;;1637:1:14::1;2562:7;:22:::0;-1:-1:-1;9087:580:12:o;9757:142:4:-;9821:7;9863:27;9882:7;9863:18;:27::i;5567:221::-;5631:7;-1:-1:-1;;;;;5654:19:4;;5650:60;;5682:28;;-1:-1:-1;;;;;5682:28:4;;;;;;;;;;;5650:60;-1:-1:-1;;;;;;5727:25:4;;;;;:18;:25;;;;;;-1:-1:-1;;;;;5727:54:4;;5567:221::o;1598:92:13:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;5219:871:5:-;5289:16;5341:19;5374:25;5413:22;5438:16;5448:5;5438:9;:16::i;:::-;5413:41;;5468:25;5510:14;-1:-1:-1;;;;;5496:29:5;;;;;-1:-1:-1;;;;;5496:29:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5496:29:5;;5468:57;;5539:31;;:::i;:::-;5589:9;5584:461;5633:14;5618:11;:29;5584:461;;5684:15;5697:1;5684:12;:15::i;:::-;5672:27;;5721:9;:16;;;5717:71;;;5761:8;;5717:71;5809:14;;-1:-1:-1;;;;;5809:28:5;;5805:109;;5881:14;;;-1:-1:-1;5805:109:5;5956:5;-1:-1:-1;;;;;5935:26:5;:17;-1:-1:-1;;;;;5935:26:5;;5931:100;;;6011:1;5985:8;5994:13;;;;;;5985:23;;;;;;-1:-1:-1;;;;;5985:23:5;;;;;;;;;;;;;;:27;;;;;5931:100;5649:3;;5584:461;;;-1:-1:-1;6065:8:5;;5219:871;-1:-1:-1;;;;;;5219:871:5:o;966:85:13:-;1038:6;;-1:-1:-1;;;;;1038:6:13;;966:85::o;11807:162:12:-;11897:21;;:::i;:::-;11941;11954:7;11941:12;:21::i;10123:102:4:-;10179:13;10211:7;10204:14;;;;;:::i;2336:2446:5:-;2467:16;2532:4;2523:5;:13;2519:45;;2545:19;;-1:-1:-1;;;;;2545:19:5;;;;;;;;;;;2519:45;2578:19;2611:17;2631:14;3708:7:4;3734:13;;3661:93;2631:14:5;2611:34;-1:-1:-1;2876:9:5;2869:4;:16;2865:71;;;2912:9;2905:16;;2865:71;2949:25;2977:16;2987:5;2977:9;:16::i;:::-;2949:44;;3168:4;3160:5;:12;3156:271;;;3214:12;;;3248:31;;;3244:109;;;3323:11;3303:31;;3244:109;3156:271;;;;-1:-1:-1;3411:1:5;3156:271;3440:25;3482:17;-1:-1:-1;;;;;3468:32:5;;;;;-1:-1:-1;;;;;3468:32:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3468:32:5;-1:-1:-1;3440:60:5;-1:-1:-1;3518:22:5;3514:76;;3567:8;-1:-1:-1;3560:15:5;;-1:-1:-1;;;3560:15:5;3514:76;3731:31;3765:26;3785:5;3765:19;:26::i;:::-;3731:60;;3805:25;4047:9;:16;;;4042:90;;-1:-1:-1;4103:14:5;;4042:90;4162:5;4145:467;4174:4;4169:1;:9;;:45;;;;;4197:17;4182:11;:32;;4169:45;4145:467;;;4251:15;4264:1;4251:12;:15::i;:::-;4239:27;;4288:9;:16;;;4284:71;;;4328:8;;4284:71;4376:14;;-1:-1:-1;;;;;4376:28:5;;4372:109;;4448:14;;;-1:-1:-1;4372:109:5;4523:5;-1:-1:-1;;;;;4502:26:5;:17;-1:-1:-1;;;;;4502:26:5;;4498:100;;;4578:1;4552:8;4561:13;;;;;;4552:23;;;;;;-1:-1:-1;;;;;4552:23:5;;;;;;;;;;;;;;:27;;;;;4498:100;4216:3;;4145:467;;;-1:-1:-1;;;4694:29:5;;;-1:-1:-1;4701:8:5;;-1:-1:-1;;2336:2446:5;;;;;;:::o;7962:982:12:-;8094:5;-1:-1:-1;;;;;8094:15:12;:36;;;;8113:5;-1:-1:-1;;;;;8113:17:12;8094:36;8088:84;;8152:20;;-1:-1:-1;;;;;8152:20:12;;;;;;;;;;;8088:84;8210:10;:22;-1:-1:-1;;;8210:22:12;;-1:-1:-1;;;;;8210:22:12;;9838:30;;8243:52;;8273:22;;-1:-1:-1;;;;;8273:22:12;;;;;;;;;;;8243:52;8342:23;8309:30;8330:8;8309:16;8322:2;8309:12;:16::i;:30::-;:56;8305:102;;;8386:21;;-1:-1:-1;;;;;8386:21:12;;;;;;;;;;;8305:102;8451:14;8421:27;8439:8;8421:13;4219:12:4;;4010:7;4203:13;:28;;3957:309;8421:27:12;:44;8417:84;;;8486:15;;-1:-1:-1;;;;;8486:15:12;;;;;;;;;;;8417:84;8515:5;-1:-1:-1;;;;;8515:15:12;8511:238;;;8592:14;:12;:14::i;:::-;-1:-1:-1;;;;;8569:37:12;665:10:1;-1:-1:-1;;;;;8569:37:12;;:91;;;;8653:7;:5;:7::i;:::-;-1:-1:-1;;;;;8630:30:12;665:10:1;-1:-1:-1;;;;;8630:30:12;;8569:91;8546:155;;8683:18;;-1:-1:-1;;;;;8683:18:12;;;;;;;;;;;8546:155;8715:23;8725:2;8729:8;8715:9;:23::i;:::-;8762:5;-1:-1:-1;;;;;8762:17:12;8758:124;;;8795:23;8805:2;8809:8;8795:9;:23::i;:::-;8832:39;8845:25;-1:-1:-1;;;;;8845:15:12;;8861:8;8845:15;:25::i;8832:39::-;8896:41;;;15461:25:16;;;-1:-1:-1;;;;;15522:31:16;;15517:2;15502:18;;15495:59;-1:-1:-1;;;;;8896:41:12;;;;;15434:18:16;8896:41:12;;;;;;;7962:982;;;;:::o;12381:331:4:-;-1:-1:-1;;;;;12507:31:4;;665:10:1;12507:31:4;12503:61;;;12547:17;;-1:-1:-1;;;;;12547:17:4;;;;;;;;;;;12503:61;665:10:1;12575:39:4;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;12575:49:4;;;;;;;;;;;;:60;;-1:-1:-1;;12575:60:4;;;;;;;;;;12650:55;;12099:41:16;;;12575:49:4;;665:10:1;12650:55:4;;12072:18:16;12650:55:4;;;;;;;12381:331;;:::o;12389:287:12:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;1680:1:14::1;2259:7;;:19;;2251:63;;;;-1:-1:-1::0;;;;;2251:63:14::1;;;;;;;:::i;:::-;1680:1;2389:7;:18:::0;12548:80:12::2;::::0;12512:12:::2;::::0;;;665:10:1;;12601:4:12::2;12593:21;::::0;12512:12;12548:80;12512:12;12548:80;12593:21;665:10:1;12548:80:12::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12511:117;;;;12646:7;12662:5;12638:31;;;;;-1:-1:-1::0;;;;;12638:31:12::2;;;;;;;;:::i;:::-;-1:-1:-1::0;;1637:1:14::1;2562:7;:22:::0;-1:-1:-1;12389:287:12:o;13521:385:4:-;13682:28;13692:4;13698:2;13702:7;13682:9;:28::i;:::-;-1:-1:-1;;;;;13724:14:4;;;:19;13720:180;;13762:56;13793:4;13799:2;13803:7;13812:5;13762:30;:56::i;:::-;13757:143;;13845:40;;-1:-1:-1;;;;;13845:40:4;;;;;;;;;;;13757:143;13521:385;;;;:::o;5341:289:12:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;5511:112:12::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;-1:-1:-1;;;;;5511:112:12;;::::1;;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;5498:10:::1;:125:::0;;-1:-1:-1;;;;;;5498:125:12;-1:-1:-1;;;;;;5498:125:12;;;;;;;::::1;::::0;;::::1;;-1:-1:-1::0;;;;;;;;5498:125:12::1;-1:-1:-1::0;;;5498:125:12;;::::1;::::0;;;::::1;::::0;;5341:289::o;11583:100::-;11637:6;11662:14;11670:5;11662:7;:14::i;938:410:5:-;1014:21;;:::i;:::-;1047:31;;:::i;:::-;3708:7:4;3734:13;1121:7:5;:25;1088:101;;1169:9;938:410;-1:-1:-1;;938:410:5:o;1088:101::-;1210:21;1223:7;1210:12;:21::i;:::-;1198:33;;1245:9;:16;;;1241:63;;;1284:9;938:410;-1:-1:-1;;938:410:5:o;1241:63::-;1320:21;1333:7;1320:12;:21::i;10291:401:4:-;10404:13;10438:16;10446:7;10438;:16::i;:::-;10433:59;;10463:29;;-1:-1:-1;;;;;10463:29:4;;;;;;;;;;;10433:59;10503:21;10527:10;:8;:10::i;:::-;10503:34;;10572:7;10566:21;10591:1;10566:26;;:119;;;;;;;;;;;;;;;;;10635:7;10644:18;10654:7;10644:9;:18::i;:::-;10618:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10547:138;10291:401;-1:-1:-1;;;10291:401:4:o;9946:87:12:-;10017:9;;-1:-1:-1;;;;;10017:9:12;;9946:87::o;13798:80::-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;13859:4:12::1;:12:::0;13798:80::o;11319:113::-;-1:-1:-1;;;;;5965:25:4;;11378:7:12;5965:25:4;;;:18;:25;;1151:2;5965:25;;;-1:-1:-1;;;5965:49:4;;-1:-1:-1;;;;;5964:92:4;11404:21:12;5865:198:4;12778:206;-1:-1:-1;;;;;12942:25:4;;;12915:4;12942:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;12778:206::o;1839:189:13:-;665:10:1;1178:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:13;;1170:68;;;;-1:-1:-1;;;;;1170:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:13;::::1;1919:73;;;::::0;-1:-1:-1;;;;;1919:73:13;;13144:2:16;1919:73:13::1;::::0;::::1;13126:21:16::0;13183:2;13163:18;;;13156:30;13222:34;13202:18;;;13195:62;-1:-1:-1;;;;;13273:18:16;;;13266:36;13319:19;;1919:73:13::1;13116:228:16::0;1919:73:13::1;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;1369:213:3:-;1471:4;-1:-1:-1;;;;;;1494:41:3;;-1:-1:-1;;;;;1494:41:3;;:81;;-1:-1:-1;;;;;;;;;;;;871:40:2;;;1539:36:3;763:155:2;4874:634:4;4982:4;-1:-1:-1;;;;;;;;;;;5281:25:4;;;;:101;;-1:-1:-1;;;;;;;;;;;;5357:25:4;;;5281:101;:177;;;-1:-1:-1;;;;;;;;5433:25:4;-1:-1:-1;;;;;5433:25:4;;4874:634::o;2695:327:3:-;2422:5;-1:-1:-1;;;;;2797:33:3;;;;2789:88;;;;-1:-1:-1;;;;;2789:88:3;;13912:2:16;2789:88:3;;;13894:21:16;13951:2;13931:18;;;13924:30;13990:34;13970:18;;;13963:62;-1:-1:-1;;;;;14041:18:16;;;14034:40;14091:19;;2789:88:3;13884:232:16;2789:88:3;-1:-1:-1;;;;;2895:22:3;;2887:60;;;;-1:-1:-1;;;;;2887:60:3;;14683:2:16;2887:60:3;;;14665:21:16;14722:2;14702:18;;;14695:30;-1:-1:-1;;;;;14741:18:16;;;14734:55;14806:18;;2887:60:3;14655:175:16;2887:60:3;2980:35;;;;;;;;;-1:-1:-1;;;;;2980:35:3;;;;;;-1:-1:-1;;;;;2980:35:3;;;;;;;;;;-1:-1:-1;;;2958:57:3;;;;:19;:57;2695:327::o;14152:268:4:-;14209:4;14296:13;;14286:7;:23;14244:150;;;;-1:-1:-1;;14346:26:4;;;;:17;:26;;;;;;-1:-1:-1;;;14346:43:4;:48;;14152:268::o;7222:1133::-;7313:7;7351;7449:13;;7442:4;:20;7438:853;;;7486:14;7503:23;;;:17;:23;;;;;;-1:-1:-1;;;7590:23:4;;7586:687;;8101:111;8108:11;8101:111;;-1:-1:-1;;;8178:6:4;8160:25;;;;:17;:25;;;;;;8101:111;;7586:687;7438:853;;8317:31;;-1:-1:-1;;;;;8317:31:4;;;;;;;;;;;14481:173:12;14583:4;14610:37;14629:5;14636:4;;14642;14610:18;:37::i;2755:96:15:-;2813:7;2839:5;2843:1;2839;:5;:::i;6467:134:4:-;-1:-1:-1;;;;;6554:25:4;6522:6;6554:25;;;:18;:25;;;;;;-1:-1:-1;;;6554:39:4;;;6467:134::o;14499:102::-;14567:27;14577:2;14581:8;14567:27;;;;;;;;;;;;:9;:27::i;:::-;14499:102;;:::o;3465:96:15:-;3523:7;3549:5;3553:1;3549;:5;:::i;12843:362:12:-;12914:5;12902:9;:17;12898:51;;;12928:21;;-1:-1:-1;;;;;12928:21:12;;;;;;;;;;;12898:51;12975:5;12963:9;:17;12959:240;;;12997:12;;665:10:1;13110:22:12;13111:9;13126:5;13110:15;:22::i;:::-;13039:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12996:141;;;;13159:7;13175:11;13151:37;;;;;-1:-1:-1;;;;;13151:37:12;;;;;;;;:::i;19626:2472:4:-;19736:27;19766;19785:7;19766:18;:27::i;:::-;19736:57;;19849:4;-1:-1:-1;;;;;19808:45:4;19824:19;-1:-1:-1;;;;;19808:45:4;;19804:98;;19874:28;;-1:-1:-1;;;;;19874:28:4;;;;;;;;;;;19804:98;19913:22;665:10:1;-1:-1:-1;;;;;19939:27:4;;;;:86;;-1:-1:-1;19982:43:4;19999:4;665:10:1;12778:206:4;:::i;19982:43::-;19939:145;;;-1:-1:-1;665:10:1;20041:20:4;20053:7;20041:11;:20::i;:::-;-1:-1:-1;;;;;20041:43:4;;19939:145;19913:172;;20101:17;20096:66;;20127:35;;-1:-1:-1;;;;;20127:35:4;;;;;;;;;;;20096:66;-1:-1:-1;;;;;20176:16:4;;20172:52;;20201:23;;-1:-1:-1;;;;;20201:23:4;;;;;;;;;;;20172:52;20348:24;;;;:15;:24;;;;;;;;20341:31;;-1:-1:-1;;;;;;20341:31:4;;;-1:-1:-1;;;;;20733:24:4;;;;;:18;:24;;;;;20731:26;;-1:-1:-1;;20731:26:4;;;20801:22;;;;;;;20799:24;;-1:-1:-1;20799:24:4;;;21087:26;;;:17;:26;;;;;-1:-1:-1;;;21173:15:4;-1:-1:-1;;;21173:41:4;21132:83;;:126;;21087:171;;;21375:46;;21371:616;;21478:1;21468:11;;21446:19;21599:30;;;:17;:30;;;;;;21595:378;;21735:13;;21720:11;:28;21716:239;;21880:30;;;;:17;:30;;;;;:52;;;21716:239;21371:616;;22031:7;22027:2;-1:-1:-1;;;;;22012:27:4;22021:4;-1:-1:-1;;;;;22012:27:4;-1:-1:-1;;;;;;;;;;;22012:27:4;;;;;;;;;19626:2472;;;;;:::o;4399:96:15:-;4457:7;4483:5;4487:1;4483;:5;:::i;2034:169:13:-;2108:6;;;-1:-1:-1;;;;;2124:17:13;;;-1:-1:-1;;;;;;2124:17:13;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;8849:179:4:-;8933:21;;:::i;:::-;8996:24;;;;:17;:24;;;;;;8977:44;;:18;:44::i;9516:184::-;9602:21;;:::i;:::-;9646:47;9665:27;9684:7;9665:18;:27::i;:::-;9646:18;:47::i;25702:805::-;25892:166;;-1:-1:-1;;;;;25892:166:4;;25860:4;;-1:-1:-1;;;;;25892:45:4;;;;;:166;;665:10:1;;25992:4:4;;26014:7;;26039:5;;25892:166;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25892:166:4;;;;;;;;-1:-1:-1;;25892:166:4;;;;;;;;;;;;:::i;:::-;;;25876:625;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26266:13:4;;26262:229;;26311:40;;-1:-1:-1;;;;;26311:40:4;;;;;;;;;;;26262:229;26451:6;26445:13;26436:6;26432:2;26428:15;26421:38;25876:625;-1:-1:-1;;;;;;26128:80:4;-1:-1:-1;;;;;26128:80:4;;-1:-1:-1;25702:805:4;;;;;;:::o;10789:112:12:-;10849:13;10881;10874:20;;;;;:::i;28474:1948:4:-;28965:4;28959:11;;28972:3;28955:21;;29048:17;;;;29731:11;;;29612:5;29861:2;29875;29865:13;;29857:22;29731:11;29844:36;29915:2;29905:13;;29506:682;29933:4;29506:682;;;30119:1;30114:3;30110:11;30103:18;;30169:2;30163:4;30159:13;30155:2;30151:22;30146:3;30138:36;30026:2;30016:13;;29506:682;;;-1:-1:-1;30216:13:4;;;-1:-1:-1;;30329:12:4;;;30387:19;;;30329:12;28597:1819;-1:-1:-1;28597:1819:4:o;1139:164:11:-;1246:4;1294;1265:25;1278:5;1285:4;1265:12;:25::i;:::-;:33;;1139:164;-1:-1:-1;;;;1139:164:11:o;14961:2463:4:-;15079:20;15102:13;-1:-1:-1;;;;;15129:16:4;;15125:48;;15154:19;;-1:-1:-1;;;;;15154:19:4;;;;;;;;;;;15125:48;15187:13;15183:44;;15209:18;;-1:-1:-1;;;;;15209:18:4;;;;;;;;;;;15183:44;15313:21;15321:12;15313:7;:21::i;:::-;15309:54;;;15343:20;;-1:-1:-1;;;;;15343:20:4;;;;;;;;;;;15309:54;-1:-1:-1;;;;;15826:22:4;;;;;;:18;:22;;;;1151:2;15826:22;;;:102;;-1:-1:-1;;;;;15868:60:4;;15826:102;;;16164:31;;;:17;:31;;;;;-1:-1:-1;;;16255:15:4;:41;16214:83;;-1:-1:-1;;;;16332:13:4;;16317:56;16214:160;16164:210;;:31;;16452:23;;;;16494:14;:19;16490:806;;16533:492;16563:38;;16588:12;;-1:-1:-1;;;;;16563:38:4;;;16580:1;;-1:-1:-1;;;;;;;;;;;16563:38:4;16580:1;;16563:38;16653:207;16721:1;16753:2;16785:14;;;;;;16829:5;16653:30;:207::i;:::-;16623:356;;16916:40;;-1:-1:-1;;;;;16916:40:4;;;;;;;;;;;16623:356;17020:3;17005:12;:18;16533:492;;17104:12;17087:13;;:29;17083:43;;17118:8;;;17083:43;16490:806;;;17165:117;17195:40;;17220:14;;;;;-1:-1:-1;;;;;17195:40:4;;;17212:1;;-1:-1:-1;;;;;;;;;;;17195:40:4;17212:1;;17195:40;17277:3;17262:12;:18;17165:117;;16490:806;-1:-1:-1;17309:13:4;:28;;;17357:60;;17390:2;17394:12;17408:8;17357:60;:::i;3122:96:15:-;3180:7;3206:5;3210:1;3206;:5;:::i;8444:319:4:-;8534:31;;:::i;:::-;-1:-1:-1;;;;;8581:41:4;;;;-1:-1:-1;;;;;;;;8666:32:4;;8632:67;:24;;;:67;-1:-1:-1;;;8728:23:4;;;:28;;8709:16;;;:47;8581:9;8444:319::o;1907:280:11:-;2002:7;2042:4;2002:7;2052:106;2076:5;:12;2072:1;:16;2052:106;;;2118:33;2128:12;2142:5;2148:1;2142:8;;;;;;-1:-1:-1;;;;;2142:8:11;;;;;;;;;;;;;;;2118:9;:33::i;:::-;2103:48;-1:-1:-1;2090:3:11;;;;:::i;:::-;;;;2052:106;;7598:141;7661:7;7687:1;7683;:5;:51;;7823:13;7902:15;;;7931:4;7924:15;;;7971:4;7955:21;;7683:51;;;7823:13;7902:15;;;7931:4;7924:15;;;7971:4;7955:21;;7691:20;7894:88;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:16;82:20;;-1:-1:-1;;;;;131:31:16;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:2;;342:1;339;332:12;357:171;424:20;;-1:-1:-1;;;;;473:30:16;;463:41;;453:2;;518:1;515;508:12;533:196;592:6;645:2;633:9;624:7;620:23;616:32;613:2;;;666:6;658;651:22;613:2;694:29;713:9;694:29;:::i;734:270::-;802:6;810;863:2;851:9;842:7;838:23;834:32;831:2;;;884:6;876;869:22;831:2;912:29;931:9;912:29;:::i;:::-;902:39;;960:38;994:2;983:9;979:18;960:38;:::i;:::-;950:48;;821:183;;;;;:::o;1009:338::-;1086:6;1094;1102;1155:2;1143:9;1134:7;1130:23;1126:32;1123:2;;;1176:6;1168;1161:22;1123:2;1204:29;1223:9;1204:29;:::i;:::-;1194:39;;1252:38;1286:2;1275:9;1271:18;1252:38;:::i;:::-;1242:48;;1337:2;1326:9;1322:18;1309:32;1299:42;;1113:234;;;;;:::o;1352:1025::-;1447:6;1455;1463;1471;1524:3;1512:9;1503:7;1499:23;1495:33;1492:2;;;1546:6;1538;1531:22;1492:2;1574:29;1593:9;1574:29;:::i;:::-;1564:39;;1622:2;1643:38;1677:2;1666:9;1662:18;1643:38;:::i;:::-;1633:48;-1:-1:-1;1728:2:16;1713:18;;1700:32;;-1:-1:-1;1783:2:16;1768:18;;1755:32;-1:-1:-1;;;;;1836:14:16;;;1833:2;;;1868:6;1860;1853:22;1833:2;1911:6;1900:9;1896:22;1886:32;;1956:7;1949:4;1945:2;1941:13;1937:27;1927:2;;1983:6;1975;1968:22;1927:2;2024;2011:16;2046:2;2042;2039:10;2036:2;;;2052:18;;:::i;:::-;2094:53;2137:2;2118:13;;-1:-1:-1;;2114:27:16;2110:36;;2094:53;:::i;:::-;2081:66;;2170:2;2163:5;2156:17;2210:7;2205:2;2200;2196;2192:11;2188:20;2185:33;2182:2;;;2236:6;2228;2221:22;2182:2;2296;2291;2287;2283:11;2278:2;2271:5;2267:14;2254:45;2319:14;;2315:23;;;2308:39;;;;1482:895;;;;-1:-1:-1;1482:895:16;;-1:-1:-1;;1482:895:16:o;2382:264::-;2447:6;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:2;;;2529:6;2521;2514:22;2476:2;2557:29;2576:9;2557:29;:::i;:::-;2547:39;;2605:35;2636:2;2625:9;2621:18;2605:35;:::i;2651:264::-;2719:6;2727;2780:2;2768:9;2759:7;2755:23;2751:32;2748:2;;;2801:6;2793;2786:22;2748:2;2829:29;2848:9;2829:29;:::i;:::-;2819:39;2905:2;2890:18;;;;2877:32;;-1:-1:-1;;;2738:177:16:o;2920:332::-;2997:6;3005;3013;3066:2;3054:9;3045:7;3041:23;3037:32;3034:2;;;3087:6;3079;3072:22;3034:2;3115:29;3134:9;3115:29;:::i;:::-;3105:39;3191:2;3176:18;;3163:32;;-1:-1:-1;3242:2:16;3227:18;;;3214:32;;3024:228;-1:-1:-1;;;3024:228:16:o;3257:1159::-;3368:6;3376;3384;3392;3445:3;3433:9;3424:7;3420:23;3416:33;3413:2;;;3467:6;3459;3452:22;3413:2;3495:29;3514:9;3495:29;:::i;:::-;3485:39;-1:-1:-1;3543:2:16;3577:18;;;3564:32;;-1:-1:-1;3643:2:16;3628:18;;3615:32;;-1:-1:-1;3698:2:16;3683:18;;3670:32;-1:-1:-1;;;;;3714:30:16;;3711:2;;;3762:6;3754;3747:22;3711:2;3790:22;;3843:4;3835:13;;3831:27;-1:-1:-1;3821:2:16;;3877:6;3869;3862:22;3821:2;3918;3905:16;3941:60;3957:43;3997:2;3957:43;:::i;:::-;3941:60;:::i;:::-;4035:15;;;4066:12;;;;4098:11;;;4136;;;4128:20;;4124:29;;4121:42;-1:-1:-1;4118:2:16;;;4181:6;4173;4166:22;4118:2;4208:6;4199:15;;4223:163;4237:2;4234:1;4231:9;4223:163;;;4294:17;;4282:30;;4255:1;4248:9;;;;;4332:12;;;;4364;;4223:163;;;-1:-1:-1;3403:1013:16;;;;-1:-1:-1;3403:1013:16;;-1:-1:-1;;;;;;3403:1013:16:o;4421:332::-;4498:6;4506;4514;4567:2;4555:9;4546:7;4542:23;4538:32;4535:2;;;4588:6;4580;4573:22;4758:268;4825:6;4833;4886:2;4874:9;4865:7;4861:23;4857:32;4854:2;;;4907:6;4899;4892:22;4854:2;4935:29;4954:9;4935:29;:::i;:::-;4925:39;;4983:37;5016:2;5005:9;5001:18;4983:37;:::i;5031:948::-;5115:6;5146:2;5189;5177:9;5168:7;5164:23;5160:32;5157:2;;;5210:6;5202;5195:22;5157:2;5242:23;;-1:-1:-1;;;;;5277:30:16;;5274:2;;;5325:6;5317;5310:22;5274:2;5353:22;;5406:4;5398:13;;5394:27;-1:-1:-1;5384:2:16;;5440:6;5432;5425:22;5384:2;5481;5468:16;5504:60;5520:43;5560:2;5520:43;:::i;5504:60::-;5598:15;;;5629:12;;;;5661:11;;;5699;;;5691:20;;5687:29;;5684:42;-1:-1:-1;5681:2:16;;;5744:6;5736;5729:22;5681:2;5771:6;5762:15;;5786:163;5800:2;5797:1;5794:9;5786:163;;;5857:17;;5845:30;;5818:1;5811:9;;;;;5895:12;;;;5927;;5786:163;;;-1:-1:-1;5968:5:16;5126:853;-1:-1:-1;;;;;;;5126:853:16:o;5984:334::-;6056:6;6064;6072;6125:2;6113:9;6104:7;6100:23;6096:32;6093:2;;;6146:6;6138;6131:22;6093:2;6174:26;6190:9;6174:26;:::i;:::-;6164:36;;6219:37;6252:2;6241:9;6237:18;6219:37;:::i;:::-;6209:47;;6275:37;6308:2;6297:9;6293:18;6275:37;:::i;:::-;6265:47;;6083:235;;;;;:::o;6323:190::-;6382:6;6435:2;6423:9;6414:7;6410:23;6406:32;6403:2;;;6456:6;6448;6441:22;6403:2;-1:-1:-1;6484:23:16;;6393:120;-1:-1:-1;6393:120:16:o;6518:255::-;6576:6;6629:2;6617:9;6608:7;6604:23;6600:32;6597:2;;;6650:6;6642;6635:22;6597:2;6694:9;6681:23;6713:30;6737:5;6713:30;:::i;6778:259::-;6847:6;6900:2;6888:9;6879:7;6875:23;6871:32;6868:2;;;6921:6;6913;6906:22;6868:2;6958:9;6952:16;6977:30;7001:5;6977:30;:::i;7042:642::-;7113:6;7121;7174:2;7162:9;7153:7;7149:23;7145:32;7142:2;;;7195:6;7187;7180:22;7142:2;7227:23;;-1:-1:-1;;;;;7299:14:16;;;7296:2;;;7331:6;7323;7316:22;7296:2;7374:6;7363:9;7359:22;7349:32;;7419:7;7412:4;7408:2;7404:13;7400:27;7390:2;;7446:6;7438;7431:22;7390:2;7491;7478:16;7517:2;7509:6;7506:14;7503:2;;;7538:6;7530;7523:22;7503:2;7588:7;7583:2;7574:6;7570:2;7566:15;7562:24;7559:37;7556:2;;;7614:6;7606;7599:22;7556:2;7650;7642:11;;;;;7672:6;;-1:-1:-1;7132:552:16;;-1:-1:-1;;;;7132:552:16:o;7884:258::-;7952:6;7960;8013:2;8001:9;7992:7;7988:23;7984:32;7981:2;;;8034:6;8026;8019:22;7981:2;-1:-1:-1;;8062:23:16;;;8132:2;8117:18;;;8104:32;;-1:-1:-1;7971:171:16:o;8147:257::-;8188:3;8226:5;8220:12;8253:6;8248:3;8241:19;8269:63;8325:6;8318:4;8313:3;8309:14;8302:4;8295:5;8291:16;8269:63;:::i;:::-;8386:2;8365:15;-1:-1:-1;;8361:29:16;8352:39;;;;8393:4;8348:50;;8196:208;-1:-1:-1;;8196:208:16:o;8409:278::-;8493:12;;-1:-1:-1;;;;;8489:38:16;8477:51;;8581:4;8570:16;;;8564:23;-1:-1:-1;;;;;8560:48:16;8544:14;;;8537:72;8600:2;8661:16;;;8655:23;8648:31;8641:39;8625:14;;8618:63;8467:220::o;8922:470::-;9101:3;9139:6;9133:13;9155:53;9201:6;9196:3;9189:4;9181:6;9177:17;9155:53;:::i;:::-;9271:13;;9230:16;;;;9293:57;9271:13;9230:16;9327:4;9315:17;;9293:57;:::i;:::-;9366:20;;9109:283;-1:-1:-1;;;;9109:283:16:o;9815:488::-;-1:-1:-1;;;;;10084:15:16;;;10066:34;;10136:15;;10131:2;10116:18;;10109:43;10183:2;10168:18;;10161:34;;;10231:3;10226:2;10211:18;;10204:31;;;10009:4;;10252:45;;10277:19;;10269:6;10252:45;:::i;:::-;10244:53;10018:285;-1:-1:-1;;;;;;10018:285:16:o;10587:727::-;10822:2;10874:21;;;10944:13;;10847:18;;;10966:22;;;10793:4;;10822:2;11045:15;;;;11019:2;11004:18;;;10793:4;11091:197;11105:6;11102:1;11099:13;11091:197;;;11154:52;11202:3;11193:6;11187:13;11154:52;:::i;:::-;11263:15;;;;11235:4;11226:14;;;;;11127:1;11120:9;11091:197;;11319:635;11490:2;11542:21;;;11612:13;;11515:18;;;11634:22;;;11461:4;;11490:2;11713:15;;;;11687:2;11672:18;;;11461:4;11759:169;11773:6;11770:1;11767:13;11759:169;;;11834:13;;11822:26;;11903:15;;;;11868:12;;;;11795:1;11788:9;11759:169;;12718:219;12867:2;12856:9;12849:21;12830:4;12887:44;12927:2;12916:9;12912:18;12904:6;12887:44;:::i;13349:356::-;13551:2;13533:21;;;13570:18;;;13563:30;13629:34;13624:2;13609:18;;13602:62;13696:2;13681:18;;13523:182::o;14121:355::-;14323:2;14305:21;;;14362:2;14342:18;;;14335:30;14401:33;14396:2;14381:18;;14374:61;14467:2;14452:18;;14295:181::o;14835:267::-;15033:2;15018:18;;15045:51;15022:9;15078:6;15045:51;:::i;15975:275::-;16046:2;16040:9;16111:2;16092:13;;-1:-1:-1;;16088:27:16;16076:40;;-1:-1:-1;;;;;16131:34:16;;16167:22;;;16128:62;16125:2;;;16193:18;;:::i;:::-;16229:2;16222:22;16020:230;;-1:-1:-1;16020:230:16:o;16255:186::-;16315:4;-1:-1:-1;;;;;16337:30:16;;16334:2;;;16370:18;;:::i;:::-;-1:-1:-1;16430:4:16;16411:17;;;16407:28;;16324:117::o;16446:128::-;16486:3;16517:1;16513:6;16510:1;16507:13;16504:2;;;16523:18;;:::i;:::-;-1:-1:-1;16559:9:16;;16494:80::o;16579:120::-;16619:1;16645;16635:2;;16650:18;;:::i;:::-;-1:-1:-1;16684:9:16;;16625:74::o;16704:168::-;16744:7;16810:1;16806;16802:6;16798:14;16795:1;16792:21;16787:1;16780:9;16773:17;16769:45;16766:2;;;16817:18;;:::i;:::-;-1:-1:-1;16857:9:16;;16756:116::o;16877:125::-;16917:4;16945:1;16942;16939:8;16936:2;;;16950:18;;:::i;:::-;-1:-1:-1;16987:9:16;;16926:76::o;17007:258::-;17079:1;17089:113;17103:6;17100:1;17097:13;17089:113;;;17179:11;;;17173:18;17160:11;;;17153:39;17125:2;17118:10;17089:113;;;17220:6;17217:1;17214:13;17211:2;;;-1:-1:-1;;17255:1:16;17237:16;;17230:27;17060:205::o;17270:388::-;17355:1;17345:12;;17402:1;17392:12;;;17413:2;;17467:4;17459:6;17455:17;17445:27;;17413:2;17520;17512:6;17509:14;17489:18;17486:38;17483:2;;;-1:-1:-1;;;;;17554:1:16;17547:39;;;17609:4;17606:1;17599:15;17637:4;;17627:15;17483:2;;17325:333;;;:::o;17663:135::-;17702:3;-1:-1:-1;;17723:17:16;;17720:2;;;17743:18;;:::i;:::-;-1:-1:-1;17790:1:16;17779:13;;17710:88::o;17803:112::-;17835:1;17861;17851:2;;17866:18;;:::i;:::-;-1:-1:-1;17900:9:16;;17841:74::o;17920:135::-;-1:-1:-1;;;;;17969:1:16;17962:39;;;18020:4;18017:1;18010:15;18044:4;;18034:15;18060:135;-1:-1:-1;;;;;18109:1:16;18102:39;;;18160:4;18157:1;18150:15;18184:4;;18174:15;18200:135;-1:-1:-1;;;;;18249:1:16;18242:39;;;18300:4;18297:1;18290:15;18324:4;;18314:15;18340:135;-1:-1:-1;;;;;;18414:36:16;;18404:47;;18394:2;;18465:1;18462;18455:12
Swarm Source
ipfs://a98790f2de35f830e9533b667dae6f9d0bb967e8708b09aeee888fcff955a4b8
Loading...
Loading
Loading...
Loading
OVERVIEW
Bold Bunnies are 2,000 unique NFTs living on the Ethereum blockchain. Your Bold Bunny is your pass to our exclusive community, with jaw-dropping rewards (up to 40% discounts off 6IXTY8IGHT merchandise!) and an exciting roadmap.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.