Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MetaZellysV2
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-16 */ // File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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); } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: contracts/NFT721UpgradeableV2.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract NFT721UpgradeableV2 is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string internal _name; // Token symbol string internal _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _balances; // const locked address address internal _lockAddr; // address(0x000000000000000000000000000000000000dEaD); // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); _lockAddr = address(0x000000000000000000000000000000000000dEaD); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "balanceOf: address zero is not a valid owner"); require(owner != _lockAddr, "balanceOf: address zero is locked owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ownerOf: invalid token ID"); require(owner != _lockAddr, "ownerOf: locked token ID"); return owner; } /** * @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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @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 overridden in child contracts. */ /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = NFT721UpgradeableV2.ownerOf(tokenId); require(to != owner, "approve: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "approve: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), 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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { address owner = _owners[tokenId]; return (owner != address(0) && owner != _lockAddr); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = NFT721UpgradeableV2.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "_safeMint: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "_mint: mint to the zero address"); require(_owners[tokenId] != _lockAddr, "_mint: token is locked"); require(!_exists(tokenId), "_mint: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), msg.sender, tokenId); if(msg.sender != to) { emit Transfer(msg.sender, to, tokenId); } _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = NFT721UpgradeableV2.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(NFT721UpgradeableV2.ownerOf(tokenId) == from, "_transfer: transfer from incorrect owner"); require(to != address(0), "_transfer: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(NFT721UpgradeableV2.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "_setApprovalForAll: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "_requireMinted: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } // File: contracts/mz_nft721_v2.sol pragma solidity ^0.8.0; contract MetaZellysV2 is NFT721UpgradeableV2 { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // admin address public _admin; // base Uri string public _baseUri; // _uriType: 0 baseUri + {tokenId}.json , 1: baseUri+_tokenUris[tokenId] , 2: _tokenUris[tokenId] uint8 public _uriType; mapping(uint256 => string) _tokenUris; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize(string memory name_, string memory symbol_,string memory baseUri_,uint8 uriType_) public virtual initializer { __Context_init(); __ERC721_init(name_, symbol_); _baseUri = baseUri_; _uriType = uriType_; _admin = msg.sender; } /** * @dev change governor account */ function setAdmin(address admin) public { require(msg.sender == _admin, "!_admin"); _admin = admin; } function getAdmin() public view returns(address) { return _admin; } function setUriType(uint8 uriType) public { require(msg.sender == _admin, "!_admin"); _uriType = uriType; } function getUriType() public view returns(uint8) { return _uriType; } function mint(address to, uint256 tokenId,string memory uri) public { require(msg.sender == _admin, "!_admin"); _safeMint(to, tokenId,""); if(_uriType != 0 ) _tokenUris[tokenId] = uri; } function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "burn: caller is not owner nor approved"); _burn(tokenId); if(_uriType != 0 ) delete _tokenUris[tokenId]; } function lockState(uint256 tokenId) public view returns(uint8) { address owner = _owners[tokenId]; if(owner == address(0)) return 0; if(owner == _lockAddr) return 2; return 1; } function lock(uint256 tokenId) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "lock: lock caller is not owner nor approved"); address owner = _owners[tokenId]; _balances[owner] -= 1; _owners[tokenId] = _lockAddr; // Clear approvals _tokenApprovals[tokenId] = address(0); emit Transfer(owner, _lockAddr, tokenId); //emit Locked(_msgSender(),owner,tokenId); } function unlock(address to, uint256 tokenId) public { require(msg.sender == _admin, "!_admin"); address owner = _owners[tokenId]; require(owner == _lockAddr,"token is not locked"); require(to != address(0), "unlock: unlock to the zero address"); _owners[tokenId] = to; _balances[to] += 1; emit Transfer(_lockAddr,to, tokenId); //emit Unlocked(_msgSender(),to,tokenId); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); if(_uriType == 1) return string(abi.encodePacked(_baseUri, _tokenUris[tokenId])); else if(_uriType == 2) return _tokenUris[tokenId]; // _uriType == 0 return string(abi.encodePacked(_baseUri, tokenId.toString(),".json")); } function setBaseURI(string memory baseUri) public { require(msg.sender == _admin, "!_admin"); _baseUri = baseUri; } function getBaseURI() public view returns (string memory) { return _baseUri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uriType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUriType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"uint8","name":"uriType_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":[{"internalType":"address","name":"admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"uriType","type":"uint8"}],"name":"setUriType","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":"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61229880620000ee6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063c87b56dd11610097578063e985e9c511610071578063e985e9c5146103bf578063ed5c475b146103fb578063f2119aff1461040e578063ff78e4f31461041b576101c4565b8063c87b56dd14610386578063d3fc986414610399578063dd467064146103ac576101c4565b806395d89b41116100d357806395d89b4114610333578063a22cb4651461033b578063a9e7c3711461034e578063b88d4fde14610373576101c4565b806370a08231146102f7578063714c5398146103185780637eee288d14610320576101c4565b806342842e0e116101665780636352211e116101405780636352211e146102ad578063690d6542146102c05780636e9960c3146102d3578063704b6c02146102e4576101c4565b806342842e0e1461027457806342966c681461028757806355f804b31461029a576101c4565b8063081812fc116101a2578063081812fc14610231578063095ea7b31461024457806323b872dd146102595780633e63eb2a1461026c576101c4565b806301bc45c9146101c957806301ffc9a7146101f957806306fdde031461021c575b600080fd5b6098546101dc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61020c610207366004611d75565b610426565b60405190151581526020016101f0565b61022461047a565b6040516101f09190611ff2565b6101dc61023f366004611e75565b61050c565b610257610252366004611cf7565b610533565b005b610257610267366004611c09565b61064f565b610224610681565b610257610282366004611c09565b61070f565b610257610295366004611e75565b61072a565b6102576102a8366004611dad565b6107bc565b6101dc6102bb366004611e75565b6107fd565b6102576102ce366004611e8d565b6108c0565b6098546001600160a01b03166101dc565b6102576102f2366004611bbd565b610900565b61030a610305366004611bbd565b61094c565b6040519081526020016101f0565b610224610a43565b61025761032e366004611cf7565b610a52565b610224610bbc565b610257610349366004611cbd565b610bcb565b61036161035c366004611e75565b610bd6565b60405160ff90911681526020016101f0565b610257610381366004611c44565b610c26565b610224610394366004611e75565b610c5e565b6102576103a7366004611d20565b610d91565b6102576103ba366004611e75565b610dff565b61020c6103cd366004611bd7565b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205460ff1690565b610257610409366004611de0565b610f07565b609a546103619060ff1681565b609a5460ff16610361565b60006001600160e01b031982166380ac58cd60e01b148061045757506001600160e01b03198216635b5e139f60e01b145b8061047257506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b60606065805461048990612180565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612180565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b60006105178261105d565b506000908152606a60205260409020546001600160a01b031690565b600061053e826107fd565b9050806001600160a01b0316836001600160a01b031614156105b25760405162461bcd60e51b815260206004820152602260248201527f617070726f76653a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084015b60405180910390fd5b336001600160a01b03821614806105ce57506105ce81336103cd565b6106405760405162461bcd60e51b815260206004820152603f60248201527f617070726f76653a20617070726f76652063616c6c6572206973206e6f74207460448201527f6f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0060648201526084016105a9565b61064a83836110b2565b505050565b61065a335b82611120565b6106765760405162461bcd60e51b81526004016105a9906120c3565b61064a83838361119f565b6099805461068e90612180565b80601f01602080910402602001604051908101604052809291908181526020018280546106ba90612180565b80156107075780601f106106dc57610100808354040283529160200191610707565b820191906000526020600020905b8154815290600101906020018083116106ea57829003601f168201915b505050505081565b61064a83838360405180602001604052806000815250610c26565b61073333610654565b61078e5760405162461bcd60e51b815260206004820152602660248201527f6275726e3a2063616c6c6572206973206e6f74206f776e6572206e6f722061706044820152651c1c9bdd995960d21b60648201526084016105a9565b61079781611330565b609a5460ff16156107b9576000818152609b602052604081206107b991611a2b565b50565b6098546001600160a01b031633146107e65760405162461bcd60e51b81526004016105a990612057565b80516107f9906099906020840190611a67565b5050565b6000818152606760205260408120546001600160a01b0316806108625760405162461bcd60e51b815260206004820152601960248201527f6f776e65724f663a20696e76616c696420746f6b656e2049440000000000000060448201526064016105a9565b6069546001600160a01b03828116911614156104725760405162461bcd60e51b815260206004820152601860248201527f6f776e65724f663a206c6f636b656420746f6b656e204944000000000000000060448201526064016105a9565b6098546001600160a01b031633146108ea5760405162461bcd60e51b81526004016105a990612057565b609a805460ff191660ff92909216919091179055565b6098546001600160a01b0316331461092a5760405162461bcd60e51b81526004016105a990612057565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166109b95760405162461bcd60e51b815260206004820152602c60248201527f62616c616e63654f663a2061646472657373207a65726f206973206e6f74206160448201526b103b30b634b21037bbb732b960a11b60648201526084016105a9565b6069546001600160a01b0383811691161415610a275760405162461bcd60e51b815260206004820152602760248201527f62616c616e63654f663a2061646472657373207a65726f206973206c6f636b65604482015266321037bbb732b960c91b60648201526084016105a9565b506001600160a01b031660009081526068602052604090205490565b60606099805461048990612180565b6098546001600160a01b03163314610a7c5760405162461bcd60e51b81526004016105a990612057565b6000818152606760205260409020546069546001600160a01b0391821691168114610adf5760405162461bcd60e51b81526020600482015260136024820152721d1bdad95b881a5cc81b9bdd081b1bd8dad959606a1b60448201526064016105a9565b6001600160a01b038316610b405760405162461bcd60e51b815260206004820152602260248201527f756e6c6f636b3a20756e6c6f636b20746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105a9565b600082815260676020908152604080832080546001600160a01b0319166001600160a01b038816908117909155835260689091528120805460019290610b87908490612111565b909155505060695460405183916001600160a01b038087169291169060008051602061224383398151915290600090a4505050565b60606066805461048990612180565b6107f93383836113ba565b6000818152606760205260408120546001600160a01b031680610bfd576000915050610475565b6069546001600160a01b0382811691161415610c1d576002915050610475565b50600192915050565b610c303383611120565b610c4c5760405162461bcd60e51b81526004016105a9906120c3565b610c5884848484611497565b50505050565b6060610c698261105d565b609a5460ff1660011415610cb3576099609b6000848152602001908152602001600020604051602001610c9d929190611fa0565b6040516020818303038152906040529050610475565b609a5460ff1660021415610d5f576000828152609b602052604090208054610cda90612180565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690612180565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b50505050509050610475565b6099610d6a836114ca565b604051602001610d7b929190611f6b565b6040516020818303038152906040529050919050565b6098546001600160a01b03163314610dbb5760405162461bcd60e51b81526004016105a990612057565b610dd58383604051806020016040528060008152506115e5565b609a5460ff161561064a576000828152609b602090815260409091208251610c5892840190611a67565b610e0833610654565b610e685760405162461bcd60e51b815260206004820152602b60248201527f6c6f636b3a206c6f636b2063616c6c6572206973206e6f74206f776e6572206e60448201526a1bdc88185c1c1c9bdd995960aa1b60648201526084016105a9565b6000818152606760209081526040808320546001600160a01b03168084526068909252822080549192600192610e9f90849061213d565b909155505060698054600084815260676020908152604080832080546001600160a01b03199081166001600160a01b0396871617909155606a909252808320805490921690915592549251859383169285169160008051602061224383398151915291a45050565b600054610100900460ff1615808015610f275750600054600160ff909116105b80610f415750303b158015610f41575060005460ff166001145b610fa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105a9565b6000805460ff191660011790558015610fc7576000805461ff0019166101001790555b610fcf611666565b610fd9858561168f565b8251610fec906099906020860190611a67565b50609a805460ff841660ff19909116179055609880546001600160a01b031916331790558015611056576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b611066816116d8565b6107b95760405162461bcd60e51b815260206004820181905260248201527f5f726571756972654d696e7465643a20696e76616c696420746f6b656e20494460448201526064016105a9565b6000818152606a6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110e7826107fd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061112c836107fd565b9050806001600160a01b0316846001600160a01b0316148061117357506001600160a01b038082166000908152606b602090815260408083209388168352929052205460ff165b806111975750836001600160a01b031661118c8461050c565b6001600160a01b0316145b949350505050565b826001600160a01b03166111b2826107fd565b6001600160a01b0316146112195760405162461bcd60e51b815260206004820152602860248201527f5f7472616e736665723a207472616e736665722066726f6d20696e636f72726560448201526731ba1037bbb732b960c11b60648201526084016105a9565b6001600160a01b03821661127f5760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016105a9565b61128a6000826110b2565b6001600160a01b03831660009081526068602052604081208054600192906112b390849061213d565b90915550506001600160a01b03821660009081526068602052604081208054600192906112e1908490612111565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061224383398151915291a461064a565b600061133b826107fd565b90506113486000836110b2565b6001600160a01b038116600090815260686020526040812080546001929061137190849061213d565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b03841690600080516020612243833981519152908390a46107f9565b816001600160a01b0316836001600160a01b0316141561142a5760405162461bcd60e51b815260206004820152602560248201527f5f736574417070726f76616c466f72416c6c3a20617070726f766520746f206360448201526430b63632b960d91b60648201526084016105a9565b6001600160a01b038381166000818152606b6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114a284848461119f565b6114ae84848484611714565b610c585760405162461bcd60e51b81526004016105a990612005565b6060816114ef57506040805180820190915260018152600360fc1b6020820152610475565b8160005b81156115195780611503816121bb565b91506115129050600a83612129565b91506114f3565b60008167ffffffffffffffff81111561154257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561156c576020820181803683370190505b5090505b84156111975761158160018361213d565b915061158e600a866121d6565b611599906030612111565b60f81b8183815181106115bc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115de600a86612129565b9450611570565b6115ef8383611821565b6115fc6000848484611714565b61064a5760405162461bcd60e51b815260206004820152603560248201527f5f736166654d696e743a207472616e7366657220746f206e6f6e20455243373260448201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b60648201526084016105a9565b600054610100900460ff1661168d5760405162461bcd60e51b81526004016105a990612078565b565b600054610100900460ff166116b65760405162461bcd60e51b81526004016105a990612078565b6116c082826119dd565b5050606980546001600160a01b03191661dead179055565b6000818152606760205260408120546001600160a01b0316801580159061170d57506069546001600160a01b03828116911614155b9392505050565b60006001600160a01b0384163b1561181657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611758903390899088908890600401611fb5565b602060405180830381600087803b15801561177257600080fd5b505af19250505080156117a2575060408051601f3d908101601f1916820190925261179f91810190611d91565b60015b6117fc573d8080156117d0576040519150601f19603f3d011682016040523d82523d6000602084013e6117d5565b606091505b5080516117f45760405162461bcd60e51b81526004016105a990612005565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001949350505050565b6001600160a01b0382166118775760405162461bcd60e51b815260206004820152601f60248201527f5f6d696e743a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105a9565b6069546000828152606760205260409020546001600160a01b03908116911614156118dd5760405162461bcd60e51b815260206004820152601660248201527517db5a5b9d0e881d1bdad95b881a5cc81b1bd8dad95960521b60448201526064016105a9565b6118e6816116d8565b156119335760405162461bcd60e51b815260206004820152601b60248201527f5f6d696e743a20746f6b656e20616c7265616479206d696e746564000000000060448201526064016105a9565b6001600160a01b038216600090815260686020526040812080546001929061195c908490612111565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386161790555182913391600080516020612243833981519152908290a4336001600160a01b038316146119d85760405181906001600160a01b03841690339060008051602061224383398151915290600090a45b6107f9565b600054610100900460ff16611a045760405162461bcd60e51b81526004016105a990612078565b8151611a17906065906020850190611a67565b50805161064a906066906020840190611a67565b508054611a3790612180565b6000825580601f10611a4957506107b9565b601f0160209004906000526020600020908101906107b99190611aeb565b828054611a7390612180565b90600052602060002090601f016020900481019282611a955760008555611adb565b82601f10611aae57805160ff1916838001178555611adb565b82800160010185558215611adb579182015b82811115611adb578251825591602001919060010190611ac0565b50611ae7929150611aeb565b5090565b5b80821115611ae75760008155600101611aec565b600067ffffffffffffffff80841115611b1b57611b1b612216565b604051601f8501601f19908116603f01168101908282118183101715611b4357611b43612216565b81604052809350858152868686011115611b5c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461047557600080fd5b600082601f830112611b9d578081fd5b61170d83833560208501611b00565b803560ff8116811461047557600080fd5b600060208284031215611bce578081fd5b61170d82611b76565b60008060408385031215611be9578081fd5b611bf283611b76565b9150611c0060208401611b76565b90509250929050565b600080600060608486031215611c1d578081fd5b611c2684611b76565b9250611c3460208501611b76565b9150604084013590509250925092565b60008060008060808587031215611c59578081fd5b611c6285611b76565b9350611c7060208601611b76565b925060408501359150606085013567ffffffffffffffff811115611c92578182fd5b8501601f81018713611ca2578182fd5b611cb187823560208401611b00565b91505092959194509250565b60008060408385031215611ccf578182fd5b611cd883611b76565b915060208301358015158114611cec578182fd5b809150509250929050565b60008060408385031215611d09578182fd5b611d1283611b76565b946020939093013593505050565b600080600060608486031215611d34578283fd5b611d3d84611b76565b925060208401359150604084013567ffffffffffffffff811115611d5f578182fd5b611d6b86828701611b8d565b9150509250925092565b600060208284031215611d86578081fd5b813561170d8161222c565b600060208284031215611da2578081fd5b815161170d8161222c565b600060208284031215611dbe578081fd5b813567ffffffffffffffff811115611dd4578182fd5b61119784828501611b8d565b60008060008060808587031215611df5578384fd5b843567ffffffffffffffff80821115611e0c578586fd5b611e1888838901611b8d565b95506020870135915080821115611e2d578485fd5b611e3988838901611b8d565b94506040870135915080821115611e4e578384fd5b50611e5b87828801611b8d565b925050611e6a60608601611bac565b905092959194509250565b600060208284031215611e86578081fd5b5035919050565b600060208284031215611e9e578081fd5b61170d82611bac565b60008151808452611ebf816020860160208601612154565b601f01601f19169290920160200192915050565b805460009060028104600180831680611eed57607f831692505b6020808410821415611f0d57634e487b7160e01b86526022600452602486fd5b818015611f215760018114611f3257611f5f565b60ff19861689528489019650611f5f565b60008881526020902060005b86811015611f575781548b820152908501908301611f3e565b505084890196505b50505050505092915050565b6000611f778285611ed3565b8351611f87818360208801612154565b64173539b7b760d91b9101908152600501949350505050565b6000611197611faf8386611ed3565b84611ed3565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fe890830184611ea7565b9695505050505050565b60006020825261170d6020830184611ea7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526007908201526610afb0b236b4b760c91b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612124576121246121ea565b500190565b60008261213857612138612200565b500490565b60008282101561214f5761214f6121ea565b500390565b60005b8381101561216f578181015183820152602001612157565b83811115610c585750506000910152565b60028104600182168061219457607f821691505b602082108114156121b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121cf576121cf6121ea565b5060010190565b6000826121e5576121e5612200565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107b957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122000abe03946605dad932da2ffa51163a4103f64b868bb62b082b0b7041920946864736f6c63430008020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063c87b56dd11610097578063e985e9c511610071578063e985e9c5146103bf578063ed5c475b146103fb578063f2119aff1461040e578063ff78e4f31461041b576101c4565b8063c87b56dd14610386578063d3fc986414610399578063dd467064146103ac576101c4565b806395d89b41116100d357806395d89b4114610333578063a22cb4651461033b578063a9e7c3711461034e578063b88d4fde14610373576101c4565b806370a08231146102f7578063714c5398146103185780637eee288d14610320576101c4565b806342842e0e116101665780636352211e116101405780636352211e146102ad578063690d6542146102c05780636e9960c3146102d3578063704b6c02146102e4576101c4565b806342842e0e1461027457806342966c681461028757806355f804b31461029a576101c4565b8063081812fc116101a2578063081812fc14610231578063095ea7b31461024457806323b872dd146102595780633e63eb2a1461026c576101c4565b806301bc45c9146101c957806301ffc9a7146101f957806306fdde031461021c575b600080fd5b6098546101dc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61020c610207366004611d75565b610426565b60405190151581526020016101f0565b61022461047a565b6040516101f09190611ff2565b6101dc61023f366004611e75565b61050c565b610257610252366004611cf7565b610533565b005b610257610267366004611c09565b61064f565b610224610681565b610257610282366004611c09565b61070f565b610257610295366004611e75565b61072a565b6102576102a8366004611dad565b6107bc565b6101dc6102bb366004611e75565b6107fd565b6102576102ce366004611e8d565b6108c0565b6098546001600160a01b03166101dc565b6102576102f2366004611bbd565b610900565b61030a610305366004611bbd565b61094c565b6040519081526020016101f0565b610224610a43565b61025761032e366004611cf7565b610a52565b610224610bbc565b610257610349366004611cbd565b610bcb565b61036161035c366004611e75565b610bd6565b60405160ff90911681526020016101f0565b610257610381366004611c44565b610c26565b610224610394366004611e75565b610c5e565b6102576103a7366004611d20565b610d91565b6102576103ba366004611e75565b610dff565b61020c6103cd366004611bd7565b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205460ff1690565b610257610409366004611de0565b610f07565b609a546103619060ff1681565b609a5460ff16610361565b60006001600160e01b031982166380ac58cd60e01b148061045757506001600160e01b03198216635b5e139f60e01b145b8061047257506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b60606065805461048990612180565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612180565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b60006105178261105d565b506000908152606a60205260409020546001600160a01b031690565b600061053e826107fd565b9050806001600160a01b0316836001600160a01b031614156105b25760405162461bcd60e51b815260206004820152602260248201527f617070726f76653a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084015b60405180910390fd5b336001600160a01b03821614806105ce57506105ce81336103cd565b6106405760405162461bcd60e51b815260206004820152603f60248201527f617070726f76653a20617070726f76652063616c6c6572206973206e6f74207460448201527f6f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0060648201526084016105a9565b61064a83836110b2565b505050565b61065a335b82611120565b6106765760405162461bcd60e51b81526004016105a9906120c3565b61064a83838361119f565b6099805461068e90612180565b80601f01602080910402602001604051908101604052809291908181526020018280546106ba90612180565b80156107075780601f106106dc57610100808354040283529160200191610707565b820191906000526020600020905b8154815290600101906020018083116106ea57829003601f168201915b505050505081565b61064a83838360405180602001604052806000815250610c26565b61073333610654565b61078e5760405162461bcd60e51b815260206004820152602660248201527f6275726e3a2063616c6c6572206973206e6f74206f776e6572206e6f722061706044820152651c1c9bdd995960d21b60648201526084016105a9565b61079781611330565b609a5460ff16156107b9576000818152609b602052604081206107b991611a2b565b50565b6098546001600160a01b031633146107e65760405162461bcd60e51b81526004016105a990612057565b80516107f9906099906020840190611a67565b5050565b6000818152606760205260408120546001600160a01b0316806108625760405162461bcd60e51b815260206004820152601960248201527f6f776e65724f663a20696e76616c696420746f6b656e2049440000000000000060448201526064016105a9565b6069546001600160a01b03828116911614156104725760405162461bcd60e51b815260206004820152601860248201527f6f776e65724f663a206c6f636b656420746f6b656e204944000000000000000060448201526064016105a9565b6098546001600160a01b031633146108ea5760405162461bcd60e51b81526004016105a990612057565b609a805460ff191660ff92909216919091179055565b6098546001600160a01b0316331461092a5760405162461bcd60e51b81526004016105a990612057565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166109b95760405162461bcd60e51b815260206004820152602c60248201527f62616c616e63654f663a2061646472657373207a65726f206973206e6f74206160448201526b103b30b634b21037bbb732b960a11b60648201526084016105a9565b6069546001600160a01b0383811691161415610a275760405162461bcd60e51b815260206004820152602760248201527f62616c616e63654f663a2061646472657373207a65726f206973206c6f636b65604482015266321037bbb732b960c91b60648201526084016105a9565b506001600160a01b031660009081526068602052604090205490565b60606099805461048990612180565b6098546001600160a01b03163314610a7c5760405162461bcd60e51b81526004016105a990612057565b6000818152606760205260409020546069546001600160a01b0391821691168114610adf5760405162461bcd60e51b81526020600482015260136024820152721d1bdad95b881a5cc81b9bdd081b1bd8dad959606a1b60448201526064016105a9565b6001600160a01b038316610b405760405162461bcd60e51b815260206004820152602260248201527f756e6c6f636b3a20756e6c6f636b20746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105a9565b600082815260676020908152604080832080546001600160a01b0319166001600160a01b038816908117909155835260689091528120805460019290610b87908490612111565b909155505060695460405183916001600160a01b038087169291169060008051602061224383398151915290600090a4505050565b60606066805461048990612180565b6107f93383836113ba565b6000818152606760205260408120546001600160a01b031680610bfd576000915050610475565b6069546001600160a01b0382811691161415610c1d576002915050610475565b50600192915050565b610c303383611120565b610c4c5760405162461bcd60e51b81526004016105a9906120c3565b610c5884848484611497565b50505050565b6060610c698261105d565b609a5460ff1660011415610cb3576099609b6000848152602001908152602001600020604051602001610c9d929190611fa0565b6040516020818303038152906040529050610475565b609a5460ff1660021415610d5f576000828152609b602052604090208054610cda90612180565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690612180565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b50505050509050610475565b6099610d6a836114ca565b604051602001610d7b929190611f6b565b6040516020818303038152906040529050919050565b6098546001600160a01b03163314610dbb5760405162461bcd60e51b81526004016105a990612057565b610dd58383604051806020016040528060008152506115e5565b609a5460ff161561064a576000828152609b602090815260409091208251610c5892840190611a67565b610e0833610654565b610e685760405162461bcd60e51b815260206004820152602b60248201527f6c6f636b3a206c6f636b2063616c6c6572206973206e6f74206f776e6572206e60448201526a1bdc88185c1c1c9bdd995960aa1b60648201526084016105a9565b6000818152606760209081526040808320546001600160a01b03168084526068909252822080549192600192610e9f90849061213d565b909155505060698054600084815260676020908152604080832080546001600160a01b03199081166001600160a01b0396871617909155606a909252808320805490921690915592549251859383169285169160008051602061224383398151915291a45050565b600054610100900460ff1615808015610f275750600054600160ff909116105b80610f415750303b158015610f41575060005460ff166001145b610fa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105a9565b6000805460ff191660011790558015610fc7576000805461ff0019166101001790555b610fcf611666565b610fd9858561168f565b8251610fec906099906020860190611a67565b50609a805460ff841660ff19909116179055609880546001600160a01b031916331790558015611056576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b611066816116d8565b6107b95760405162461bcd60e51b815260206004820181905260248201527f5f726571756972654d696e7465643a20696e76616c696420746f6b656e20494460448201526064016105a9565b6000818152606a6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110e7826107fd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061112c836107fd565b9050806001600160a01b0316846001600160a01b0316148061117357506001600160a01b038082166000908152606b602090815260408083209388168352929052205460ff165b806111975750836001600160a01b031661118c8461050c565b6001600160a01b0316145b949350505050565b826001600160a01b03166111b2826107fd565b6001600160a01b0316146112195760405162461bcd60e51b815260206004820152602860248201527f5f7472616e736665723a207472616e736665722066726f6d20696e636f72726560448201526731ba1037bbb732b960c11b60648201526084016105a9565b6001600160a01b03821661127f5760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016105a9565b61128a6000826110b2565b6001600160a01b03831660009081526068602052604081208054600192906112b390849061213d565b90915550506001600160a01b03821660009081526068602052604081208054600192906112e1908490612111565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061224383398151915291a461064a565b600061133b826107fd565b90506113486000836110b2565b6001600160a01b038116600090815260686020526040812080546001929061137190849061213d565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b03841690600080516020612243833981519152908390a46107f9565b816001600160a01b0316836001600160a01b0316141561142a5760405162461bcd60e51b815260206004820152602560248201527f5f736574417070726f76616c466f72416c6c3a20617070726f766520746f206360448201526430b63632b960d91b60648201526084016105a9565b6001600160a01b038381166000818152606b6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114a284848461119f565b6114ae84848484611714565b610c585760405162461bcd60e51b81526004016105a990612005565b6060816114ef57506040805180820190915260018152600360fc1b6020820152610475565b8160005b81156115195780611503816121bb565b91506115129050600a83612129565b91506114f3565b60008167ffffffffffffffff81111561154257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561156c576020820181803683370190505b5090505b84156111975761158160018361213d565b915061158e600a866121d6565b611599906030612111565b60f81b8183815181106115bc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115de600a86612129565b9450611570565b6115ef8383611821565b6115fc6000848484611714565b61064a5760405162461bcd60e51b815260206004820152603560248201527f5f736166654d696e743a207472616e7366657220746f206e6f6e20455243373260448201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b60648201526084016105a9565b600054610100900460ff1661168d5760405162461bcd60e51b81526004016105a990612078565b565b600054610100900460ff166116b65760405162461bcd60e51b81526004016105a990612078565b6116c082826119dd565b5050606980546001600160a01b03191661dead179055565b6000818152606760205260408120546001600160a01b0316801580159061170d57506069546001600160a01b03828116911614155b9392505050565b60006001600160a01b0384163b1561181657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611758903390899088908890600401611fb5565b602060405180830381600087803b15801561177257600080fd5b505af19250505080156117a2575060408051601f3d908101601f1916820190925261179f91810190611d91565b60015b6117fc573d8080156117d0576040519150601f19603f3d011682016040523d82523d6000602084013e6117d5565b606091505b5080516117f45760405162461bcd60e51b81526004016105a990612005565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001949350505050565b6001600160a01b0382166118775760405162461bcd60e51b815260206004820152601f60248201527f5f6d696e743a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105a9565b6069546000828152606760205260409020546001600160a01b03908116911614156118dd5760405162461bcd60e51b815260206004820152601660248201527517db5a5b9d0e881d1bdad95b881a5cc81b1bd8dad95960521b60448201526064016105a9565b6118e6816116d8565b156119335760405162461bcd60e51b815260206004820152601b60248201527f5f6d696e743a20746f6b656e20616c7265616479206d696e746564000000000060448201526064016105a9565b6001600160a01b038216600090815260686020526040812080546001929061195c908490612111565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386161790555182913391600080516020612243833981519152908290a4336001600160a01b038316146119d85760405181906001600160a01b03841690339060008051602061224383398151915290600090a45b6107f9565b600054610100900460ff16611a045760405162461bcd60e51b81526004016105a990612078565b8151611a17906065906020850190611a67565b50805161064a906066906020840190611a67565b508054611a3790612180565b6000825580601f10611a4957506107b9565b601f0160209004906000526020600020908101906107b99190611aeb565b828054611a7390612180565b90600052602060002090601f016020900481019282611a955760008555611adb565b82601f10611aae57805160ff1916838001178555611adb565b82800160010185558215611adb579182015b82811115611adb578251825591602001919060010190611ac0565b50611ae7929150611aeb565b5090565b5b80821115611ae75760008155600101611aec565b600067ffffffffffffffff80841115611b1b57611b1b612216565b604051601f8501601f19908116603f01168101908282118183101715611b4357611b43612216565b81604052809350858152868686011115611b5c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461047557600080fd5b600082601f830112611b9d578081fd5b61170d83833560208501611b00565b803560ff8116811461047557600080fd5b600060208284031215611bce578081fd5b61170d82611b76565b60008060408385031215611be9578081fd5b611bf283611b76565b9150611c0060208401611b76565b90509250929050565b600080600060608486031215611c1d578081fd5b611c2684611b76565b9250611c3460208501611b76565b9150604084013590509250925092565b60008060008060808587031215611c59578081fd5b611c6285611b76565b9350611c7060208601611b76565b925060408501359150606085013567ffffffffffffffff811115611c92578182fd5b8501601f81018713611ca2578182fd5b611cb187823560208401611b00565b91505092959194509250565b60008060408385031215611ccf578182fd5b611cd883611b76565b915060208301358015158114611cec578182fd5b809150509250929050565b60008060408385031215611d09578182fd5b611d1283611b76565b946020939093013593505050565b600080600060608486031215611d34578283fd5b611d3d84611b76565b925060208401359150604084013567ffffffffffffffff811115611d5f578182fd5b611d6b86828701611b8d565b9150509250925092565b600060208284031215611d86578081fd5b813561170d8161222c565b600060208284031215611da2578081fd5b815161170d8161222c565b600060208284031215611dbe578081fd5b813567ffffffffffffffff811115611dd4578182fd5b61119784828501611b8d565b60008060008060808587031215611df5578384fd5b843567ffffffffffffffff80821115611e0c578586fd5b611e1888838901611b8d565b95506020870135915080821115611e2d578485fd5b611e3988838901611b8d565b94506040870135915080821115611e4e578384fd5b50611e5b87828801611b8d565b925050611e6a60608601611bac565b905092959194509250565b600060208284031215611e86578081fd5b5035919050565b600060208284031215611e9e578081fd5b61170d82611bac565b60008151808452611ebf816020860160208601612154565b601f01601f19169290920160200192915050565b805460009060028104600180831680611eed57607f831692505b6020808410821415611f0d57634e487b7160e01b86526022600452602486fd5b818015611f215760018114611f3257611f5f565b60ff19861689528489019650611f5f565b60008881526020902060005b86811015611f575781548b820152908501908301611f3e565b505084890196505b50505050505092915050565b6000611f778285611ed3565b8351611f87818360208801612154565b64173539b7b760d91b9101908152600501949350505050565b6000611197611faf8386611ed3565b84611ed3565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fe890830184611ea7565b9695505050505050565b60006020825261170d6020830184611ea7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526007908201526610afb0b236b4b760c91b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612124576121246121ea565b500190565b60008261213857612138612200565b500490565b60008282101561214f5761214f6121ea565b500390565b60005b8381101561216f578181015183820152602001612157565b83811115610c585750506000910152565b60028104600182168061219457607f821691505b602082108114156121b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121cf576121cf6121ea565b5060010190565b6000826121e5576121e5612200565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107b957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122000abe03946605dad932da2ffa51163a4103f64b868bb62b082b0b7041920946864736f6c63430008020033
Deployed Bytecode Sourcemap
42935:3709:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43089:21;;;;;-1:-1:-1;;;;;43089:21:0;;;;;;-1:-1:-1;;;;;8234:32:1;;;8216:51;;8204:2;8189:18;43089:21:0;;;;;;;;28594:349;;;;;;:::i;:::-;;:::i;:::-;;;8936:14:1;;8929:22;8911:41;;8899:2;8884:18;28594:349:0;8866:92:1;29716:100:0;;;:::i;:::-;;;;;;;:::i;31489:171::-;;;;;;:::i;:::-;;:::i;30991:432::-;;;;;;:::i;:::-;;:::i;:::-;;32189:336;;;;;;:::i;:::-;;:::i;43136:23::-;;;:::i;32596:185::-;;;;;;:::i;:::-;;:::i;44514:304::-;;;;;;:::i;:::-;;:::i;46406:136::-;;;;;;:::i;:::-;;:::i;29360:289::-;;;;;;:::i;:::-;;:::i;44045:130::-;;;;;;:::i;:::-;;:::i;43956:81::-;44023:6;;-1:-1:-1;;;;;44023:6:0;43956:81;;43826:124;;;;;;:::i;:::-;;:::i;29007:291::-;;;;;;:::i;:::-;;:::i;:::-;;;18534:25:1;;;18522:2;18507:18;29007:291:0;18489:76:1;46550:91:0;;;:::i;45532:444::-;;;;;;:::i;:::-;;:::i;29885:104::-;;;:::i;31732:155::-;;;;;;:::i;:::-;;:::i;44826:250::-;;;;;;:::i;:::-;;:::i;:::-;;;9145:4:1;9133:17;;;9115:36;;9103:2;9088:18;44826:250:0;9070:87:1;32852:323:0;;;;;;:::i;:::-;;:::i;45984:414::-;;;;;;:::i;:::-;;:::i;44274:228::-;;;;;;:::i;:::-;;:::i;45084:440::-;;;;;;:::i;:::-;;:::i;31958:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32079:25:0;;;32055:4;32079:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31958:164;43468:294;;;;;;:::i;:::-;;:::i;43275:21::-;;;;;;;;;44183:83;44250:8;;;;44183:83;;28594:349;28718:4;-1:-1:-1;;;;;;28755:51:0;;-1:-1:-1;;;28755:51:0;;:127;;-1:-1:-1;;;;;;;28823:59:0;;-1:-1:-1;;;28823:59:0;28755:127;:180;;;-1:-1:-1;;;;;;;;;;26339:51:0;;;28899:36;28735:200;;28594:349;;;;:::o;29716:100::-;29770:13;29803:5;29796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29716:100;:::o;31489:171::-;31565:7;31585:23;31600:7;31585:14;:23::i;:::-;-1:-1:-1;31628:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31628:24:0;;31489:171::o;30991:432::-;31072:13;31088:36;31116:7;31088:27;:36::i;:::-;31072:52;;31149:5;-1:-1:-1;;;;;31143:11:0;:2;-1:-1:-1;;;;;31143:11:0;;;31135:58;;;;-1:-1:-1;;;31135:58:0;;14241:2:1;31135:58:0;;;14223:21:1;14280:2;14260:18;;;14253:30;14319:34;14299:18;;;14292:62;-1:-1:-1;;;14370:18:1;;;14363:32;14412:19;;31135:58:0;;;;;;;;;22204:10;-1:-1:-1;;;;;31228:21:0;;;;:62;;-1:-1:-1;31253:37:0;31270:5;22204:10;31277:12;22124:98;31253:37;31206:175;;;;-1:-1:-1;;;31206:175:0;;18158:2:1;31206:175:0;;;18140:21:1;18197:2;18177:18;;;18170:30;18236:34;18216:18;;;18209:62;18307:33;18287:18;;;18280:61;18358:19;;31206:175:0;18130:253:1;31206:175:0;31394:21;31403:2;31407:7;31394:8;:21::i;:::-;30991:432;;;:::o;32189:336::-;32384:41;22204:10;32403:12;32417:7;32384:18;:41::i;:::-;32376:100;;;;-1:-1:-1;;;32376:100:0;;;;;;;:::i;:::-;32489:28;32499:4;32505:2;32509:7;32489:9;:28::i;43136:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32596:185::-;32734:39;32751:4;32757:2;32761:7;32734:39;;;;;;;;;;;;:16;:39::i;44514:304::-;44632:41;22204:10;44651:12;22124:98;44632:41;44624:92;;;;-1:-1:-1;;;44624:92:0;;14644:2:1;44624:92:0;;;14626:21:1;14683:2;14663:18;;;14656:30;14722:34;14702:18;;;14695:62;-1:-1:-1;;;14773:18:1;;;14766:36;14819:19;;44624:92:0;14616:228:1;44624:92:0;44727:14;44733:7;44727:5;:14::i;:::-;44755:8;;;;:13;44752:58;;44791:19;;;;:10;:19;;;;;44784:26;;;:::i;:::-;44514:304;:::o;46406:136::-;46488:6;;-1:-1:-1;;;;;46488:6:0;46474:10;:20;46466:40;;;;-1:-1:-1;;;46466:40:0;;;;;;;:::i;:::-;46516:18;;;;:8;;:18;;;;;:::i;:::-;;46406:136;:::o;29360:289::-;29432:7;29468:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29468:16:0;29503:19;29495:57;;;;-1:-1:-1;;;29495:57:0;;11585:2:1;29495:57:0;;;11567:21:1;11624:2;11604:18;;;11597:30;11663:27;11643:18;;;11636:55;11708:18;;29495:57:0;11557:175:1;29495:57:0;29580:9;;-1:-1:-1;;;;;29571:18:0;;;29580:9;;29571:18;;29563:55;;;;-1:-1:-1;;;29563:55:0;;11939:2:1;29563:55:0;;;11921:21:1;11978:2;11958:18;;;11951:30;12017:26;11997:18;;;11990:54;12061:18;;29563:55:0;11911:174:1;44045:130:0;44120:6;;-1:-1:-1;;;;;44120:6:0;44106:10;:20;44098:40;;;;-1:-1:-1;;;44098:40:0;;;;;;;:::i;:::-;44149:8;:18;;-1:-1:-1;;44149:18:0;;;;;;;;;;;;44045:130::o;43826:124::-;43899:6;;-1:-1:-1;;;;;43899:6:0;43885:10;:20;43877:40;;;;-1:-1:-1;;;43877:40:0;;;;;;;:::i;:::-;43928:6;:14;;-1:-1:-1;;;;;;43928:14:0;-1:-1:-1;;;;;43928:14:0;;;;;;;;;;43826:124::o;29007:291::-;29079:7;-1:-1:-1;;;;;29107:19:0;;29099:76;;;;-1:-1:-1;;;29099:76:0;;16557:2:1;29099:76:0;;;16539:21:1;16596:2;16576:18;;;16569:30;16635:34;16615:18;;;16608:62;-1:-1:-1;;;16686:18:1;;;16679:42;16738:19;;29099:76:0;16529:234:1;29099:76:0;29203:9;;-1:-1:-1;;;;;29194:18:0;;;29203:9;;29194:18;;29186:70;;;;-1:-1:-1;;;29186:70:0;;13473:2:1;29186:70:0;;;13455:21:1;13512:2;13492:18;;;13485:30;13551:34;13531:18;;;13524:62;-1:-1:-1;;;13602:18:1;;;13595:37;13649:19;;29186:70:0;13445:229:1;29186:70:0;-1:-1:-1;;;;;;29274:16:0;;;;;:9;:16;;;;;;;29007:291::o;46550:91::-;46593:13;46625:8;46618:15;;;;;:::i;45532:444::-;45616:6;;-1:-1:-1;;;;;45616:6:0;45602:10;:20;45594:40;;;;-1:-1:-1;;;45594:40:0;;;;;;;:::i;:::-;45644:13;45660:16;;;:7;:16;;;;;;45703:9;;-1:-1:-1;;;;;45660:16:0;;;;45703:9;45694:18;;45686:49;;;;-1:-1:-1;;;45686:49:0;;15051:2:1;45686:49:0;;;15033:21:1;15090:2;15070:18;;;15063:30;-1:-1:-1;;;15109:18:1;;;15102:49;15168:18;;45686:49:0;15023:169:1;45686:49:0;-1:-1:-1;;;;;45753:16:0;;45745:63;;;;-1:-1:-1;;;45745:63:0;;12714:2:1;45745:63:0;;;12696:21:1;12753:2;12733:18;;;12726:30;12792:34;12772:18;;;12765:62;-1:-1:-1;;;12843:18:1;;;12836:32;12885:19;;45745:63:0;12686:224:1;45745:63:0;45820:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;45820:21:0;-1:-1:-1;;;;;45820:21:0;;;;;;;;45852:13;;:9;:13;;;;;:18;;-1:-1:-1;;45820:16:0;45852:18;;-1:-1:-1;;45852:18:0;:::i;:::-;;;;-1:-1:-1;;45895:9:0;;45886:31;;45909:7;;-1:-1:-1;;;;;45886:31:0;;;;45895:9;;;-1:-1:-1;;;;;;;;;;;45886:31:0;45895:9;;45886:31;45532:444;;;:::o;29885:104::-;29941:13;29974:7;29967:14;;;;;:::i;31732:155::-;31827:52;22204:10;31860:8;31870;31827:18;:52::i;44826:250::-;44882:5;44917:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44917:16:0;44947:19;44944:46;;44989:1;44982:8;;;;;44944:46;45013:9;;-1:-1:-1;;;;;45004:18:0;;;45013:9;;45004:18;45001:44;;;45044:1;45037:8;;;;;45001:44;-1:-1:-1;45063:1:0;;44826:250;-1:-1:-1;;44826:250:0:o;32852:323::-;33026:41;22204:10;33059:7;33026:18;:41::i;:::-;33018:100;;;;-1:-1:-1;;;33018:100:0;;;;;;;:::i;:::-;33129:38;33143:4;33149:2;33153:7;33162:4;33129:13;:38::i;:::-;32852:323;;;;:::o;45984:414::-;46057:13;46083:23;46098:7;46083:14;:23::i;:::-;46120:8;;;;;:13;46117:166;;;46179:8;46189:10;:19;46200:7;46189:19;;;;;;;;;;;46162:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46148:62;;;;46117:166;46229:8;;;;46241:1;46229:13;46226:57;;;46264:19;;;;:10;:19;;;;;46257:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46226:57;46352:8;46362:18;:7;:16;:18::i;:::-;46335:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46321:69;;45984:414;;;:::o;44274:228::-;44374:6;;-1:-1:-1;;;;;44374:6:0;44360:10;:20;44352:40;;;;-1:-1:-1;;;44352:40:0;;;;;;;:::i;:::-;44402:25;44412:2;44416:7;44402:25;;;;;;;;;;;;:9;:25::i;:::-;44440:8;;;;:13;44437:57;;44469:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;45084:440::-;45140:41;22204:10;45159:12;22124:98;45140:41;45132:97;;;;-1:-1:-1;;;45132:97:0;;10358:2:1;45132:97:0;;;10340:21:1;10397:2;10377:18;;;10370:30;10436:34;10416:18;;;10409:62;-1:-1:-1;;;10487:18:1;;;10480:41;10538:19;;45132:97:0;10330:233:1;45132:97:0;45239:13;45255:16;;;:7;:16;;;;;;;;;-1:-1:-1;;;;;45255:16:0;45281;;;:9;:16;;;;;:21;;45255:16;;;;45281:21;;45255:16;;45281:21;:::i;:::-;;;;-1:-1:-1;;45331:9:0;;;;45312:16;;;:7;:16;;;;;;;;:28;;-1:-1:-1;;;;;;45312:28:0;;;-1:-1:-1;;;;;45331:9:0;;;45312:28;;;;45378:15;:24;;;;;;:37;;;;;;;;45446:9;;45430:35;;45320:7;;45446:9;;;45430:35;;;-1:-1:-1;;;;;;;;;;;45430:35:0;;45084:440;;:::o;43468:294::-;18631:19;18654:13;;;;;;18653:14;;18701:34;;;;-1:-1:-1;18719:12:0;;18734:1;18719:12;;;;:16;18701:34;18700:108;;;-1:-1:-1;18780:4:0;9397:19;:23;;;18741:66;;-1:-1:-1;18790:12:0;;;;;:17;18741:66;18678:204;;;;-1:-1:-1;;;18678:204:0;;15399:2:1;18678:204:0;;;15381:21:1;15438:2;15418:18;;;15411:30;15477:34;15457:18;;;15450:62;-1:-1:-1;;;15528:18:1;;;15521:44;15582:19;;18678:204:0;15371:236:1;18678:204:0;18893:12;:16;;-1:-1:-1;;18893:16:0;18908:1;18893:16;;;18920:67;;;;18955:13;:20;;-1:-1:-1;;18955:20:0;;;;;18920:67;43608:16:::1;:14;:16::i;:::-;43635:29;43649:5;43656:7;43635:13;:29::i;:::-;43675:19:::0;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;43705:8:0::1;:19:::0;;::::1;::::0;::::1;-1:-1:-1::0;;43705:19:0;;::::1;;::::0;;43735:6:::1;:19:::0;;-1:-1:-1;;;;;;43735:19:0::1;43744:10;43735:19;::::0;;19009:102;;;;19060:5;19044:21;;-1:-1:-1;;19044:21:0;;;19085:14;;-1:-1:-1;9115:36:1;;19085:14:0;;9103:2:1;9088:18;19085:14:0;;;;;;;19009:102;43468:294;;;;;:::o;39768:143::-;39850:16;39858:7;39850;:16::i;:::-;39842:61;;;;-1:-1:-1;;;39842:61:0;;17382:2:1;39842:61:0;;;17364:21:1;;;17401:18;;;17394:30;17460:34;17440:18;;;17433:62;17512:18;;39842:61:0;17354:182:1;39022:187:0;39097:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39097:29:0;-1:-1:-1;;;;;39097:29:0;;;;;;;;:24;;39151:36;39097:24;39151:27;:36::i;:::-;-1:-1:-1;;;;;39142:59:0;;;;;;;;;;;39022:187;;:::o;35032:277::-;35125:4;35142:13;35158:36;35186:7;35158:27;:36::i;:::-;35142:52;;35224:5;-1:-1:-1;;;;;35213:16:0;:7;-1:-1:-1;;;;;35213:16:0;;:52;;;-1:-1:-1;;;;;;32079:25:0;;;32055:4;32079:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35233:32;35213:87;;;;35293:7;-1:-1:-1;;;;;35269:31:0;:20;35281:7;35269:11;:20::i;:::-;-1:-1:-1;;;;;35269:31:0;;35213:87;35205:96;35032:277;-1:-1:-1;;;;35032:277:0:o;38259:644::-;38431:4;-1:-1:-1;;;;;38391:44:0;:36;38419:7;38391:27;:36::i;:::-;-1:-1:-1;;;;;38391:44:0;;38383:97;;;;-1:-1:-1;;;38383:97:0;;10770:2:1;38383:97:0;;;10752:21:1;10809:2;10789:18;;;10782:30;10848:34;10828:18;;;10821:62;-1:-1:-1;;;10899:18:1;;;10892:38;10947:19;;38383:97:0;10742:230:1;38383:97:0;-1:-1:-1;;;;;38499:16:0;;38491:68;;;;-1:-1:-1;;;38491:68:0;;15814:2:1;38491:68:0;;;15796:21:1;15853:2;15833:18;;;15826:30;15892:34;15872:18;;;15865:62;-1:-1:-1;;;15943:18:1;;;15936:37;15990:19;;38491:68:0;15786:229:1;38491:68:0;38676:29;38693:1;38697:7;38676:8;:29::i;:::-;-1:-1:-1;;;;;38718:15:0;;;;;;:9;:15;;;;;:20;;38737:1;;38718:15;:20;;38737:1;;38718:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38749:13:0;;;;;;:9;:13;;;;;:18;;38766:1;;38749:13;:18;;38766:1;;38749:18;:::i;:::-;;;;-1:-1:-1;;38778:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38778:21:0;-1:-1:-1;;;;;38778:21:0;;;;;;;;;38817:27;;38778:16;;38817:27;;;;-1:-1:-1;;;;;;;;;;;38817:27:0;;38857:38;30991:432;37489:433;37549:13;37565:36;37593:7;37565:27;:36::i;:::-;37549:52;;37703:29;37720:1;37724:7;37703:8;:29::i;:::-;-1:-1:-1;;;;;37745:16:0;;;;;;:9;:16;;;;;:21;;37765:1;;37745:16;:21;;37765:1;;37745:21;:::i;:::-;;;;-1:-1:-1;;37784:16:0;;;;:7;:16;;;;;;37777:23;;-1:-1:-1;;;;;;37777:23:0;;;37818:36;37792:7;;37784:16;-1:-1:-1;;;;;37818:36:0;;;-1:-1:-1;;;;;;;;;;;37818:36:0;37784:16;;37818:36;37867:47;30991:432;39352:327;39507:8;-1:-1:-1;;;;;39498:17:0;:5;-1:-1:-1;;;;;39498:17:0;;;39490:67;;;;-1:-1:-1;;;39490:67:0;;11179:2:1;39490:67:0;;;11161:21:1;11218:2;11198:18;;;11191:30;11257:34;11237:18;;;11230:62;-1:-1:-1;;;11308:18:1;;;11301:35;11353:19;;39490:67:0;11151:227:1;39490:67:0;-1:-1:-1;;;;;39568:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;39568:46:0;;;;;;;;;;39630:41;;8911::1;;;39630::0;;8884:18:1;39630:41:0;;;;;;;39352:327;;;:::o;34056:313::-;34212:28;34222:4;34228:2;34232:7;34212:9;:28::i;:::-;34259:47;34282:4;34288:2;34292:7;34301:4;34259:22;:47::i;:::-;34251:110;;;;-1:-1:-1;;;34251:110:0;;;;;;;:::i;23098:723::-;23154:13;23375:10;23371:53;;-1:-1:-1;23402:10:0;;;;;;;;;;;;-1:-1:-1;;;23402:10:0;;;;;;23371:53;23449:5;23434:12;23490:78;23497:9;;23490:78;;23523:8;;;;:::i;:::-;;-1:-1:-1;23546:10:0;;-1:-1:-1;23554:2:0;23546:10;;:::i;:::-;;;23490:78;;;23578:19;23610:6;23600:17;;;;;;-1:-1:-1;;;23600:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23600:17:0;;23578:39;;23628:154;23635:10;;23628:154;;23662:11;23672:1;23662:11;;:::i;:::-;;-1:-1:-1;23731:10:0;23739:2;23731:5;:10;:::i;:::-;23718:24;;:2;:24;:::i;:::-;23705:39;;23688:6;23695;23688:14;;;;;;-1:-1:-1;;;23688:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;23688:56:0;;;;;;;;-1:-1:-1;23759:11:0;23768:2;23759:11;;:::i;:::-;;;23628:154;;35988:322;36117:18;36123:2;36127:7;36117:5;:18::i;:::-;36168:53;36199:1;36203:2;36207:7;36216:4;36168:22;:53::i;:::-;36146:156;;;;-1:-1:-1;;;36146:156:0;;12292:2:1;36146:156:0;;;12274:21:1;12331:2;12311:18;;;12304:30;12370:34;12350:18;;;12343:62;-1:-1:-1;;;12421:18:1;;;12414:51;12482:19;;36146:156:0;12264:243:1;21980:60:0;20472:13;;;;;;;20464:69;;;;-1:-1:-1;;;20464:69:0;;;;;;;:::i;:::-;21980:60::o;28126:225::-;20472:13;;;;;;;20464:69;;;;-1:-1:-1;;;20464:69:0;;;;;;;:::i;:::-;28230:39:::1;28254:5;28261:7;28230:23;:39::i;:::-;-1:-1:-1::0;;28280:9:0::1;:63:::0;;-1:-1:-1;;;;;;28280:63:0::1;28300:42;28280:63;::::0;;28126:225::o;34682:183::-;34747:4;34780:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34780:16:0;34815:19;;;;;:41;;-1:-1:-1;34847:9:0;;-1:-1:-1;;;;;34838:18:0;;;34847:9;;34838:18;;34815:41;34807:50;34682:183;-1:-1:-1;;;34682:183:0:o;40475:875::-;40629:4;-1:-1:-1;;;;;40650:13:0;;9397:19;:23;40646:697;;40686:82;;-1:-1:-1;;;40686:82:0;;-1:-1:-1;;;;;40686:47:0;;;;;:82;;22204:10;;40748:4;;40754:7;;40763:4;;40686:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40686:82:0;;;;;;;;-1:-1:-1;;40686:82:0;;;;;;;;;;;;:::i;:::-;;;40682:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40949:13:0;;40945:328;;40992:60;;-1:-1:-1;;;40992:60:0;;;;;;;:::i;40945:328::-;41223:6;41217:13;41208:6;41204:2;41200:15;41193:38;40682:606;-1:-1:-1;;;;;;40819:62:0;-1:-1:-1;;;40819:62:0;;-1:-1:-1;40812:69:0;;40646:697;-1:-1:-1;41327:4:0;40475:875;;;;;;:::o;36646:614::-;-1:-1:-1;;;;;36726:16:0;;36718:60;;;;-1:-1:-1;;;36718:60:0;;13881:2:1;36718:60:0;;;13863:21:1;13920:2;13900:18;;;13893:30;13959:33;13939:18;;;13932:61;14010:18;;36718:60:0;13853:181:1;36718:60:0;36817:9;;;36797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36797:16:0;;;36817:9;;36797:29;;36789:64;;;;-1:-1:-1;;;36789:64:0;;10007:2:1;36789:64:0;;;9989:21:1;10046:2;10026:18;;;10019:30;-1:-1:-1;;;10065:18:1;;;10058:52;10127:18;;36789:64:0;9979:172:1;36789:64:0;36873:16;36881:7;36873;:16::i;:::-;36872:17;36864:57;;;;-1:-1:-1;;;36864:57:0;;13117:2:1;36864:57:0;;;13099:21:1;13156:2;13136:18;;;13129:30;13195:29;13175:18;;;13168:57;13242:18;;36864:57:0;13089:177:1;36864:57:0;-1:-1:-1;;;;;36992:13:0;;;;;;:9;:13;;;;;:18;;37009:1;;36992:13;:18;;37009:1;;36992:18;:::i;:::-;;;;-1:-1:-1;;37021:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37021:21:0;-1:-1:-1;;;;;37021:21:0;;;;;37058:41;37021:16;;37079:10;;-1:-1:-1;;;;;;;;;;;37058:41:0;37021:16;;37058:41;37113:10;-1:-1:-1;;;;;37113:16:0;;;37110:86;;37151:33;;37176:7;;-1:-1:-1;;;;;37151:33:0;;;37160:10;;-1:-1:-1;;;;;;;;;;;37151:33:0;;;;37110:86;37208:44;30991:432;28359:163;20472:13;;;;;;;20464:69;;;;-1:-1:-1;;;20464:69:0;;;;;;;:::i;:::-;28473:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;28497:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;-1:-1:-1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;828:229;;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;1062:156::-;1128:20;;1188:4;1177:16;;1167:27;;1157:2;;1208:1;1205;1198:12;1223:196;;1335:2;1323:9;1314:7;1310:23;1306:32;1303:2;;;1356:6;1348;1341:22;1303:2;1384:29;1403:9;1384:29;:::i;1424:270::-;;;1553:2;1541:9;1532:7;1528:23;1524:32;1521:2;;;1574:6;1566;1559:22;1521:2;1602:29;1621:9;1602:29;:::i;:::-;1592:39;;1650:38;1684:2;1673:9;1669:18;1650:38;:::i;:::-;1640:48;;1511:183;;;;;:::o;1699:338::-;;;;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1866:6;1858;1851:22;1813:2;1894:29;1913:9;1894:29;:::i;:::-;1884:39;;1942:38;1976:2;1965:9;1961:18;1942:38;:::i;:::-;1932:48;;2027:2;2016:9;2012:18;1999:32;1989:42;;1803:234;;;;;:::o;2042:696::-;;;;;2214:3;2202:9;2193:7;2189:23;2185:33;2182:2;;;2236:6;2228;2221:22;2182:2;2264:29;2283:9;2264:29;:::i;:::-;2254:39;;2312:38;2346:2;2335:9;2331:18;2312:38;:::i;:::-;2302:48;;2397:2;2386:9;2382:18;2369:32;2359:42;;2452:2;2441:9;2437:18;2424:32;2479:18;2471:6;2468:30;2465:2;;;2516:6;2508;2501:22;2465:2;2544:22;;2597:4;2589:13;;2585:27;-1:-1:-1;2575:2:1;;2631:6;2623;2616:22;2575:2;2659:73;2724:7;2719:2;2706:16;2701:2;2697;2693:11;2659:73;:::i;:::-;2649:83;;;2172:566;;;;;;;:::o;2743:367::-;;;2869:2;2857:9;2848:7;2844:23;2840:32;2837:2;;;2890:6;2882;2875:22;2837:2;2918:29;2937:9;2918:29;:::i;:::-;2908:39;;2997:2;2986:9;2982:18;2969:32;3044:5;3037:13;3030:21;3023:5;3020:32;3010:2;;3071:6;3063;3056:22;3010:2;3099:5;3089:15;;;2827:283;;;;;:::o;3115:264::-;;;3244:2;3232:9;3223:7;3219:23;3215:32;3212:2;;;3265:6;3257;3250:22;3212:2;3293:29;3312:9;3293:29;:::i;:::-;3283:39;3369:2;3354:18;;;;3341:32;;-1:-1:-1;;;3202:177:1:o;3384:484::-;;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3561:6;3553;3546:22;3508:2;3589:29;3608:9;3589:29;:::i;:::-;3579:39;;3665:2;3654:9;3650:18;3637:32;3627:42;;3720:2;3709:9;3705:18;3692:32;3747:18;3739:6;3736:30;3733:2;;;3784:6;3776;3769:22;3733:2;3812:50;3854:7;3845:6;3834:9;3830:22;3812:50;:::i;:::-;3802:60;;;3498:370;;;;;:::o;3873:255::-;;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4005:6;3997;3990:22;3952:2;4049:9;4036:23;4068:30;4092:5;4068:30;:::i;4133:259::-;;4255:2;4243:9;4234:7;4230:23;4226:32;4223:2;;;4276:6;4268;4261:22;4223:2;4313:9;4307:16;4332:30;4356:5;4332:30;:::i;4397:342::-;;4519:2;4507:9;4498:7;4494:23;4490:32;4487:2;;;4540:6;4532;4525:22;4487:2;4585:9;4572:23;4618:18;4610:6;4607:30;4604:2;;;4655:6;4647;4640:22;4604:2;4683:50;4725:7;4716:6;4705:9;4701:22;4683:50;:::i;4744:854::-;;;;;4935:3;4923:9;4914:7;4910:23;4906:33;4903:2;;;4957:6;4949;4942:22;4903:2;5002:9;4989:23;5031:18;5072:2;5064:6;5061:14;5058:2;;;5093:6;5085;5078:22;5058:2;5121:50;5163:7;5154:6;5143:9;5139:22;5121:50;:::i;:::-;5111:60;;5224:2;5213:9;5209:18;5196:32;5180:48;;5253:2;5243:8;5240:16;5237:2;;;5274:6;5266;5259:22;5237:2;5302:52;5346:7;5335:8;5324:9;5320:24;5302:52;:::i;:::-;5292:62;;5407:2;5396:9;5392:18;5379:32;5363:48;;5436:2;5426:8;5423:16;5420:2;;;5457:6;5449;5442:22;5420:2;;5485:52;5529:7;5518:8;5507:9;5503:24;5485:52;:::i;:::-;5475:62;;;5556:36;5588:2;5577:9;5573:18;5556:36;:::i;:::-;5546:46;;4893:705;;;;;;;:::o;5603:190::-;;5715:2;5703:9;5694:7;5690:23;5686:32;5683:2;;;5736:6;5728;5721:22;5683:2;-1:-1:-1;5764:23:1;;5673:120;-1:-1:-1;5673:120:1:o;5798:192::-;;5908:2;5896:9;5887:7;5883:23;5879:32;5876:2;;;5929:6;5921;5914:22;5876:2;5957:27;5974:9;5957:27;:::i;5995:257::-;;6074:5;6068:12;6101:6;6096:3;6089:19;6117:63;6173:6;6166:4;6161:3;6157:14;6150:4;6143:5;6139:16;6117:63;:::i;:::-;6234:2;6213:15;-1:-1:-1;;6209:29:1;6200:39;;;;6241:4;6196:50;;6044:208;-1:-1:-1;;6044:208:1:o;6257:978::-;6342:12;;6257:978;;6414:1;6399:17;;6435:1;6471:18;;;;6498:2;;6552:4;6544:6;6540:17;6530:27;;6498:2;6578;6626;6618:6;6615:14;6595:18;6592:38;6589:2;;;-1:-1:-1;;;6653:33:1;;6709:4;6706:1;6699:15;6739:4;6660:3;6727:17;6589:2;6770:18;6797:104;;;;6915:1;6910:319;;;;6763:466;;6797:104;-1:-1:-1;;6830:24:1;;6818:37;;6875:16;;;;-1:-1:-1;6797:104:1;;6910:319;18759:127;18825:17;;;18875:4;18859:21;;7004:1;7018:165;7032:6;7029:1;7026:13;7018:165;;;7110:14;;7097:11;;;7090:35;7153:16;;;;7047:10;;7018:165;;;7022:3;;7212:6;7207:3;7203:16;7196:23;;6763:466;;;;;;;6315:920;;;;:::o;7240:543::-;;7545:38;7579:3;7571:6;7545:38;:::i;:::-;7612:6;7606:13;7628:52;7673:6;7669:2;7662:4;7654:6;7650:17;7628:52;:::i;:::-;-1:-1:-1;;;7702:15:1;;7726:22;;;7775:1;7764:13;;7525:258;-1:-1:-1;;;;7525:258:1:o;7788:277::-;;7986:73;8020:38;8054:3;8046:6;8020:38;:::i;:::-;8012:6;7986:73;:::i;8278:488::-;-1:-1:-1;;;;;8547:15:1;;;8529:34;;8599:15;;8594:2;8579:18;;8572:43;8646:2;8631:18;;8624:34;;;8694:3;8689:2;8674:18;;8667:31;;;8278:488;;8715:45;;8740:19;;8732:6;8715:45;:::i;:::-;8707:53;8481:285;-1:-1:-1;;;;;;8481:285:1:o;9162:219::-;;9311:2;9300:9;9293:21;9331:44;9371:2;9360:9;9356:18;9348:6;9331:44;:::i;9386:414::-;9588:2;9570:21;;;9627:2;9607:18;;;9600:30;9666:34;9661:2;9646:18;;9639:62;-1:-1:-1;;;9732:2:1;9717:18;;9710:48;9790:3;9775:19;;9560:240::o;16020:330::-;16222:2;16204:21;;;16261:1;16241:18;;;16234:29;-1:-1:-1;;;16294:2:1;16279:18;;16272:37;16341:2;16326:18;;16194:156::o;16768:407::-;16970:2;16952:21;;;17009:2;16989:18;;;16982:30;17048:34;17043:2;17028:18;;17021:62;-1:-1:-1;;;17114:2:1;17099:18;;17092:41;17165:3;17150:19;;16942:233::o;17541:410::-;17743:2;17725:21;;;17782:2;17762:18;;;17755:30;17821:34;17816:2;17801:18;;17794:62;-1:-1:-1;;;17887:2:1;17872:18;;17865:44;17941:3;17926:19;;17715:236::o;18891:128::-;;18962:1;18958:6;18955:1;18952:13;18949:2;;;18968:18;;:::i;:::-;-1:-1:-1;19004:9:1;;18939:80::o;19024:120::-;;19090:1;19080:2;;19095:18;;:::i;:::-;-1:-1:-1;19129:9:1;;19070:74::o;19149:125::-;;19217:1;19214;19211:8;19208:2;;;19222:18;;:::i;:::-;-1:-1:-1;19259:9:1;;19198:76::o;19279:258::-;19351:1;19361:113;19375:6;19372:1;19369:13;19361:113;;;19451:11;;;19445:18;19432:11;;;19425:39;19397:2;19390:10;19361:113;;;19492:6;19489:1;19486:13;19483:2;;;-1:-1:-1;;19527:1:1;19509:16;;19502:27;19332:205::o;19542:380::-;19627:1;19617:12;;19674:1;19664:12;;;19685:2;;19739:4;19731:6;19727:17;19717:27;;19685:2;19792;19784:6;19781:14;19761:18;19758:38;19755:2;;;19838:10;19833:3;19829:20;19826:1;19819:31;19873:4;19870:1;19863:15;19901:4;19898:1;19891:15;19755:2;;19597:325;;;:::o;19927:135::-;;-1:-1:-1;;19987:17:1;;19984:2;;;20007:18;;:::i;:::-;-1:-1:-1;20054:1:1;20043:13;;19974:88::o;20067:112::-;;20125:1;20115:2;;20130:18;;:::i;:::-;-1:-1:-1;20164:9:1;;20105:74::o;20184:127::-;20245:10;20240:3;20236:20;20233:1;20226:31;20276:4;20273:1;20266:15;20300:4;20297:1;20290:15;20316:127;20377:10;20372:3;20368:20;20365:1;20358:31;20408:4;20405:1;20398:15;20432:4;20429:1;20422:15;20448:127;20509:10;20504:3;20500:20;20497:1;20490:31;20540:4;20537:1;20530:15;20564:4;20561:1;20554:15;20580:131;-1:-1:-1;;;;;;20654:32:1;;20644:43;;20634:2;;20701:1;20698;20691:12
Swarm Source
ipfs://00abe03946605dad932da2ffa51163a4103f64b868bb62b082b0b70419209468
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.