Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 24929160 | 835 days ago | IN | Create: NFT | 0 FTM | 0.20408624 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
24929160 | 835 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
NFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-12-16 */ // Dependency file: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) // pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // Dependency file: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // Dependency file: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) // pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // Dependency file: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // Dependency file: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) // pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Dependency file: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) // pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Dependency file: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) // pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // Dependency file: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // Dependency file: contracts/libraries/ERC721.sol // pragma solidity ^0.8.0; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/utils/Address.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/utils/Context.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/utils/Strings.sol'; // import '/Users/chiro/GitHub/infrastructure/node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol'; /** * @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 ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token base URI string internal _uri; // Token name string private _name; // Token symbol string private _symbol; // Initialized bool private _initialized = false; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function _erc721Init( string memory name_, string memory symbol_, string memory uri_ ) internal returns (bool) { require(!_initialized, "ERC721: It's only able to initialize once"); _name = name_; _symbol = symbol_; _uri = uri_; return true; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), 'ERC721: balance query for the zero address'); 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), 'ERC721: owner query for nonexistent token'); 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) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return _uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, 'ERC721: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721: approve caller is not owner nor approved for all' ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), 'ERC721: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), 'ERC721: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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: transfer caller is not 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: transfer caller is not 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) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), 'ERC721: operator query for nonexistent token'); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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), 'ERC721: 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), 'ERC721: mint to the zero address'); require(!_exists(tokenId), 'ERC721: token already minted'); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(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 = ERC721.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); } /** * @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(ERC721.ownerOf(tokenId) == from, 'ERC721: transfer of token that is not own'); require(to != address(0), 'ERC721: 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721: transfer to non ERC721Receiver implementer'); } else { 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 {} } // Dependency file: contracts/interfaces/IRegistry.sol // pragma solidity >=0.8.4 <0.9.0; interface IRegistry { event Registered(bytes32 domain, bytes32 indexed name, address indexed addr); function isExistRecord(bytes32 domain, bytes32 name) external view returns (bool); function set( bytes32 domain, bytes32 name, address addr ) external returns (bool); function batchSet( bytes32[] calldata domains, bytes32[] calldata names, address[] calldata addrs ) external returns (bool); function getAddress(bytes32 domain, bytes32 name) external view returns (address); function getDomainAndName(address addr) external view returns (bytes32, bytes32); } // Dependency file: contracts/libraries/RegistryUser.sol // pragma solidity >=0.8.4 <0.9.0; // import 'contracts/interfaces/IRegistry.sol'; abstract contract RegistryUser { // Registry contract IRegistry internal _registry; // Active domain bytes32 internal _domain; // Initialized bool private _initialized = false; // Allow same domain calls modifier onlyAllowSameDomain(bytes32 name) { require(msg.sender == _registry.getAddress(_domain, name), 'UserRegistry: Only allow call from same domain'); _; } // Allow cross domain call modifier onlyAllowCrossDomain(bytes32 fromDomain, bytes32 name) { require( msg.sender == _registry.getAddress(fromDomain, name), 'UserRegistry: Only allow call from allowed cross domain' ); _; } /******************************************************* * Internal section ********************************************************/ // Constructing with registry address and its active domain function _registryUserInit(address registry_, bytes32 domain_) internal returns (bool) { require(!_initialized, "UserRegistry: It's only able to initialize once"); _registry = IRegistry(registry_); _domain = domain_; _initialized = true; return true; } // Get address in the same domain function _getAddressSameDomain(bytes32 name) internal view returns (address) { return _registry.getAddress(_domain, name); } /******************************************************* * View section ********************************************************/ // Return active domain function getDomain() external view returns (bytes32) { return _domain; } // Return registry address function getRegistry() external view returns (address) { return address(_registry); } } // Root file: contracts/infrastructure/NFT.sol pragma solidity >=0.8.4 <0.9.0; // import 'contracts/libraries/ERC721.sol'; // import 'contracts/libraries/RegistryUser.sol'; /** * Only allow Press to mint new token following domain * Distributor will work with NFT through Press' * Name: NFT * Domain: Infrastructure */ contract NFT is RegistryUser, ERC721 { uint256 private _supply; // This method will replace constructor function init( address registry_, bytes32 domain_, string memory name_, string memory symbol_, string memory uri_ ) external returns (bool) { _erc721Init(name_, symbol_, uri_); _registryUserInit(registry_, domain_); return true; } /******************************************************* * Distributor section ********************************************************/ // Only distributor able to mint new item function mint(address to, uint256 tokenId) external onlyAllowSameDomain('Distributor') returns (bool) { _supply += 1; _mint(to, tokenId); return _exists(tokenId); } function batchMint(address to, uint256[] memory tokenIds) external onlyAllowSameDomain('Distributor') returns (bool) { uint256 beforeBalance = balanceOf(to); for (uint256 i = 0; i < tokenIds.length; i += 1) { _mint(to, tokenIds[i]); } uint256 afterBalance = balanceOf(to); _supply += tokenIds.length; require(afterBalance - beforeBalance == tokenIds.length, 'NFT: Minted amount does not correct'); return true; } // Only distributor able to mint new item function burn(uint256 tokenId) external onlyAllowSameDomain('Distributor') returns (bool) { require(_supply > 0, 'NFT: Underflow detected'); _supply -= 1; _burn(tokenId); return !_exists(tokenId); } function batchBurn(address to, uint256[] memory tokenIds) external onlyAllowSameDomain('Distributor') returns (bool) { require(_supply >= tokenIds.length, 'NFT: Underflow detected'); uint256 beforeBalance = balanceOf(to); for (uint256 i = 0; i < tokenIds.length; i += 1) { _burn(tokenIds[i]); } uint256 afterBalance = balanceOf(to); _supply -= tokenIds.length; require(beforeBalance - afterBalance == tokenIds.length, 'NFT: Burnt amount does not correct'); return true; } // Change the base URI function changeBaseURI(string memory uri_) public onlyAllowSameDomain('Distributor') returns (bool) { _uri = uri_; return true; } /******************************************************* * Swap cross domain section ********************************************************/ // Allow swap to perform transfer function safeTransfer( address from, address to, uint256 tokenId ) external onlyAllowCrossDomain('Infrastructure', 'Swap') returns (bool) { _transfer(from, to, tokenId); return true; } /******************************************************* * View section ********************************************************/ // Get total supply function totalSupply() external view returns (uint256) { return _supply; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"changeBaseURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomain","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registry_","type":"address"},{"internalType":"bytes32","name":"domain_","type":"bytes32"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"name":"init","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002805460ff1990811690915560068054909116905534801561002657600080fd5b50612162806100366000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80635ab1bd53116100c3578063b68d18091161007c578063b68d1809146102b8578063b88d4fde146102c0578063c87b56dd146102d3578063d1660f99146102e6578063e985e9c5146102f9578063f45a9b071461033557600080fd5b80635ab1bd53146102535780636352211e1461026457806370a08231146102775780637bad23801461028a57806395d89b411461029d578063a22cb465146102a557600080fd5b806323b872dd1161011557806323b872dd146101e157806339a0c6f9146101f457806340c10f191461020757806342842e0e1461021a57806342966c681461022d5780634684d7e91461024057600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba57806318160ddd146101cf575b600080fd5b610165610160366004611d7e565b610348565b60405190151581526020015b60405180910390f35b61018261039a565b6040516101719190611e9e565b6101a261019d366004611ded565b61042c565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611d52565b6104b9565b005b600b545b604051908152602001610171565b6101cd6101ef366004611af7565b6105cf565b610165610202366004611db8565b610600565b610165610215366004611d52565b6106e5565b6101cd610228366004611af7565b6107df565b61016561023b366004611ded565b6107fa565b61016561024e366004611bb8565b61093f565b6000546001600160a01b03166101a2565b6101a2610272366004611ded565b610aea565b6101d3610285366004611a84565b610b61565b610165610298366004611bb8565b610be8565b610182610dd2565b6101cd6102b3366004611c7a565b610de1565b6001546101d3565b6101cd6102ce366004611b38565b610ea6565b6101826102e1366004611ded565b610ede565b6101656102f4366004611af7565b610fa9565b610165610307366004611abe565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b610165610343366004611cad565b6110dc565b60006001600160e01b031982166380ac58cd60e01b148061037957506001600160e01b03198216635b5e139f60e01b145b8061039457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600480546103a990612042565b80601f01602080910402602001604051908101604052809291908181526020018280546103d590612042565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b600061043782611101565b61049d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006104c482610aea565b9050806001600160a01b0316836001600160a01b031614156105325760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610494565b336001600160a01b038216148061054e575061054e8133610307565b6105c05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610494565b6105ca838361111e565b505050565b6105d9338261118c565b6105f55760405162461bcd60e51b815260040161049490611f51565b6105ca838383611272565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561065e57600080fd5b505afa158015610672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106969190611aa1565b6001600160a01b0316336001600160a01b0316146106c65760405162461bcd60e51b815260040161049490611f03565b82516106d9906003906020860190611973565b50600191505b50919050565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561074357600080fd5b505afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190611aa1565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260040161049490611f03565b6001600b60008282546107be9190611fd3565b909155506107ce90508484611412565b6107d783611101565b949350505050565b6105ca83838360405180602001604052806000815250610ea6565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561085857600080fd5b505afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108909190611aa1565b6001600160a01b0316336001600160a01b0316146108c05760405162461bcd60e51b815260040161049490611f03565b6000600b541161090c5760405162461bcd60e51b81526020600482015260176024820152761391950e88155b99195c999b1bddc819195d1958dd1959604a1b6044820152606401610494565b6001600b600082825461091f9190611fff565b9091555061092e905083611545565b61093783611101565b159392505050565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561099d57600080fd5b505afa1580156109b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d59190611aa1565b6001600160a01b0316336001600160a01b031614610a055760405162461bcd60e51b815260040161049490611f03565b6000610a1085610b61565b905060005b8451811015610a5357610a4186868381518110610a3457610a346120d2565b6020026020010151611412565b610a4c600182611fd3565b9050610a15565b506000610a5f86610b61565b90508451600b6000828254610a749190611fd3565b90915550508451610a858383611fff565b14610ade5760405162461bcd60e51b815260206004820152602360248201527f4e46543a204d696e74656420616d6f756e7420646f6573206e6f7420636f72726044820152621958dd60ea1b6064820152608401610494565b50600195945050505050565b6000818152600760205260408120546001600160a01b0316806103945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610494565b60006001600160a01b038216610bcc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610494565b506001600160a01b031660009081526008602052604090205490565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b158015610c4657600080fd5b505afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611aa1565b6001600160a01b0316336001600160a01b031614610cae5760405162461bcd60e51b815260040161049490611f03565b8251600b541015610cfb5760405162461bcd60e51b81526020600482015260176024820152761391950e88155b99195c999b1bddc819195d1958dd1959604a1b6044820152606401610494565b6000610d0685610b61565b905060005b8451811015610d4857610d36858281518110610d2957610d296120d2565b6020026020010151611545565b610d41600182611fd3565b9050610d0b565b506000610d5486610b61565b90508451600b6000828254610d699190611fff565b90915550508451610d7a8284611fff565b14610ade5760405162461bcd60e51b815260206004820152602260248201527f4e46543a204275726e7420616d6f756e7420646f6573206e6f7420636f72726560448201526118dd60f21b6064820152608401610494565b6060600580546103a990612042565b6001600160a01b038216331415610e3a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610494565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610eb0338361118c565b610ecc5760405162461bcd60e51b815260040161049490611f51565b610ed8848484846115e0565b50505050565b6060610ee982611101565b610f4d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610494565b6000610f57611613565b90506000815111610f775760405180602001604052806000815250610fa2565b80610f8184611622565b604051602001610f92929190611e32565b6040516020818303038152906040525b9392505050565b600080546040516369d1cb4360e11b81526d496e66726173747275637475726560901b60048201819052630537761760e41b60248301819052909290916001600160a01b039091169063d3a396869060440160206040518083038186803b15801561101357600080fd5b505afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190611aa1565b6001600160a01b0316336001600160a01b0316146110d15760405162461bcd60e51b815260206004820152603760248201527f5573657252656769737472793a204f6e6c7920616c6c6f772063616c6c20667260448201527f6f6d20616c6c6f7765642063726f737320646f6d61696e0000000000000000006064820152608401610494565b610ade868686611272565b60006110e9848484611720565b506110f486866117ce565b5060019695505050505050565b6000908152600760205260409020546001600160a01b0316151590565b600081815260096020526040902080546001600160a01b0319166001600160a01b038416908117909155819061115382610aea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061119782611101565b6111f85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610494565b600061120383610aea565b9050806001600160a01b0316846001600160a01b0316148061123e5750836001600160a01b03166112338461042c565b6001600160a01b0316145b806107d757506001600160a01b038082166000908152600a602090815260408083209388168352929052205460ff166107d7565b826001600160a01b031661128582610aea565b6001600160a01b0316146112ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610494565b6001600160a01b03821661134f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610494565b61135a60008261111e565b6001600160a01b0383166000908152600860205260408120805460019290611383908490611fff565b90915550506001600160a01b03821660009081526008602052604081208054600192906113b1908490611fd3565b909155505060008181526007602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166114685760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610494565b61147181611101565b156114be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610494565b6001600160a01b03821660009081526008602052604081208054600192906114e7908490611fd3565b909155505060008181526007602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061155082610aea565b905061155d60008361111e565b6001600160a01b0381166000908152600860205260408120805460019290611586908490611fff565b909155505060008281526007602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115eb848484611272565b6115f784848484611871565b610ed85760405162461bcd60e51b815260040161049490611eb1565b6060600380546103a990612042565b6060816116465750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611670578061165a81612077565b91506116699050600a83611feb565b915061164a565b60008167ffffffffffffffff81111561168b5761168b6120e8565b6040519080825280601f01601f1916602001820160405280156116b5576020820181803683370190505b5090505b84156107d7576116ca600183611fff565b91506116d7600a86612092565b6116e2906030611fd3565b60f81b8183815181106116f7576116f76120d2565b60200101906001600160f81b031916908160001a905350611719600a86611feb565b94506116b9565b60065460009060ff16156117885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2049742773206f6e6c792061626c6520746f20696e697469616044820152686c697a65206f6e636560b81b6064820152608401610494565b835161179b906004906020870190611973565b5082516117af906005906020860190611973565b5081516117c3906003906020850190611973565b506001949350505050565b60025460009060ff161561183c5760405162461bcd60e51b815260206004820152602f60248201527f5573657252656769737472793a2049742773206f6e6c792061626c6520746f2060448201526e696e697469616c697a65206f6e636560881b6064820152608401610494565b50600080546001600160a01b0384166001600160a01b031990911617905560018181556002805460ff19168217905592915050565b60006001600160a01b0384163b156117c357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118b5903390899088908890600401611e61565b602060405180830381600087803b1580156118cf57600080fd5b505af19250505080156118ff575060408051601f3d908101601f191682019092526118fc91810190611d9b565b60015b611959573d80801561192d576040519150601f19603f3d011682016040523d82523d6000602084013e611932565b606091505b5080516119515760405162461bcd60e51b815260040161049490611eb1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506107d7565b82805461197f90612042565b90600052602060002090601f0160209004810192826119a157600085556119e7565b82601f106119ba57805160ff19168380011785556119e7565b828001600101855582156119e7579182015b828111156119e75782518255916020019190600101906119cc565b506119f39291506119f7565b5090565b5b808211156119f357600081556001016119f8565b600067ffffffffffffffff831115611a2657611a266120e8565b611a39601f8401601f1916602001611fa2565b9050828152838383011115611a4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112611a7557600080fd5b610fa283833560208501611a0c565b600060208284031215611a9657600080fd5b8135610fa2816120fe565b600060208284031215611ab357600080fd5b8151610fa2816120fe565b60008060408385031215611ad157600080fd5b8235611adc816120fe565b91506020830135611aec816120fe565b809150509250929050565b600080600060608486031215611b0c57600080fd5b8335611b17816120fe565b92506020840135611b27816120fe565b929592945050506040919091013590565b60008060008060808587031215611b4e57600080fd5b8435611b59816120fe565b93506020850135611b69816120fe565b925060408501359150606085013567ffffffffffffffff811115611b8c57600080fd5b8501601f81018713611b9d57600080fd5b611bac87823560208401611a0c565b91505092959194509250565b60008060408385031215611bcb57600080fd5b8235611bd6816120fe565b915060208381013567ffffffffffffffff80821115611bf457600080fd5b818601915086601f830112611c0857600080fd5b813581811115611c1a57611c1a6120e8565b8060051b9150611c2b848301611fa2565b8181528481019084860184860187018b1015611c4657600080fd5b600095505b83861015611c69578035835260019590950194918601918601611c4b565b508096505050505050509250929050565b60008060408385031215611c8d57600080fd5b8235611c98816120fe565b915060208301358015158114611aec57600080fd5b600080600080600060a08688031215611cc557600080fd5b8535611cd0816120fe565b945060208601359350604086013567ffffffffffffffff80821115611cf457600080fd5b611d0089838a01611a64565b94506060880135915080821115611d1657600080fd5b611d2289838a01611a64565b93506080880135915080821115611d3857600080fd5b50611d4588828901611a64565b9150509295509295909350565b60008060408385031215611d6557600080fd5b8235611d70816120fe565b946020939093013593505050565b600060208284031215611d9057600080fd5b8135610fa281612116565b600060208284031215611dad57600080fd5b8151610fa281612116565b600060208284031215611dca57600080fd5b813567ffffffffffffffff811115611de157600080fd5b6107d784828501611a64565b600060208284031215611dff57600080fd5b5035919050565b60008151808452611e1e816020860160208601612016565b601f01601f19169290920160200192915050565b60008351611e44818460208801612016565b835190830190611e58818360208801612016565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e9490830184611e06565b9695505050505050565b602081526000610fa26020830184611e06565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f5573657252656769737472793a204f6e6c7920616c6c6f772063616c6c20667260408201526d37b69039b0b6b2903237b6b0b4b760911b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611fcb57611fcb6120e8565b604052919050565b60008219821115611fe657611fe66120a6565b500190565b600082611ffa57611ffa6120bc565b500490565b600082821015612011576120116120a6565b500390565b60005b83811015612031578181015183820152602001612019565b83811115610ed85750506000910152565b600181811c9082168061205657607f821691505b602082108114156106df57634e487b7160e01b600052602260045260246000fd5b600060001982141561208b5761208b6120a6565b5060010190565b6000826120a1576120a16120bc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461211357600080fd5b50565b6001600160e01b03198116811461211357600080fdfea264697066735822122064fc45fc8f45984ae86f60b6376183e383e835c8b57e00519f3e4265f7eca45464736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80635ab1bd53116100c3578063b68d18091161007c578063b68d1809146102b8578063b88d4fde146102c0578063c87b56dd146102d3578063d1660f99146102e6578063e985e9c5146102f9578063f45a9b071461033557600080fd5b80635ab1bd53146102535780636352211e1461026457806370a08231146102775780637bad23801461028a57806395d89b411461029d578063a22cb465146102a557600080fd5b806323b872dd1161011557806323b872dd146101e157806339a0c6f9146101f457806340c10f191461020757806342842e0e1461021a57806342966c681461022d5780634684d7e91461024057600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba57806318160ddd146101cf575b600080fd5b610165610160366004611d7e565b610348565b60405190151581526020015b60405180910390f35b61018261039a565b6040516101719190611e9e565b6101a261019d366004611ded565b61042c565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611d52565b6104b9565b005b600b545b604051908152602001610171565b6101cd6101ef366004611af7565b6105cf565b610165610202366004611db8565b610600565b610165610215366004611d52565b6106e5565b6101cd610228366004611af7565b6107df565b61016561023b366004611ded565b6107fa565b61016561024e366004611bb8565b61093f565b6000546001600160a01b03166101a2565b6101a2610272366004611ded565b610aea565b6101d3610285366004611a84565b610b61565b610165610298366004611bb8565b610be8565b610182610dd2565b6101cd6102b3366004611c7a565b610de1565b6001546101d3565b6101cd6102ce366004611b38565b610ea6565b6101826102e1366004611ded565b610ede565b6101656102f4366004611af7565b610fa9565b610165610307366004611abe565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b610165610343366004611cad565b6110dc565b60006001600160e01b031982166380ac58cd60e01b148061037957506001600160e01b03198216635b5e139f60e01b145b8061039457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600480546103a990612042565b80601f01602080910402602001604051908101604052809291908181526020018280546103d590612042565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b600061043782611101565b61049d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006104c482610aea565b9050806001600160a01b0316836001600160a01b031614156105325760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610494565b336001600160a01b038216148061054e575061054e8133610307565b6105c05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610494565b6105ca838361111e565b505050565b6105d9338261118c565b6105f55760405162461bcd60e51b815260040161049490611f51565b6105ca838383611272565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561065e57600080fd5b505afa158015610672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106969190611aa1565b6001600160a01b0316336001600160a01b0316146106c65760405162461bcd60e51b815260040161049490611f03565b82516106d9906003906020860190611973565b50600191505b50919050565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561074357600080fd5b505afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190611aa1565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260040161049490611f03565b6001600b60008282546107be9190611fd3565b909155506107ce90508484611412565b6107d783611101565b949350505050565b6105ca83838360405180602001604052806000815250610ea6565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561085857600080fd5b505afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108909190611aa1565b6001600160a01b0316336001600160a01b0316146108c05760405162461bcd60e51b815260040161049490611f03565b6000600b541161090c5760405162461bcd60e51b81526020600482015260176024820152761391950e88155b99195c999b1bddc819195d1958dd1959604a1b6044820152606401610494565b6001600b600082825461091f9190611fff565b9091555061092e905083611545565b61093783611101565b159392505050565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b15801561099d57600080fd5b505afa1580156109b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d59190611aa1565b6001600160a01b0316336001600160a01b031614610a055760405162461bcd60e51b815260040161049490611f03565b6000610a1085610b61565b905060005b8451811015610a5357610a4186868381518110610a3457610a346120d2565b6020026020010151611412565b610a4c600182611fd3565b9050610a15565b506000610a5f86610b61565b90508451600b6000828254610a749190611fd3565b90915550508451610a858383611fff565b14610ade5760405162461bcd60e51b815260206004820152602360248201527f4e46543a204d696e74656420616d6f756e7420646f6573206e6f7420636f72726044820152621958dd60ea1b6064820152608401610494565b50600195945050505050565b6000818152600760205260408120546001600160a01b0316806103945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610494565b60006001600160a01b038216610bcc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610494565b506001600160a01b031660009081526008602052604090205490565b600080546001546040516369d1cb4360e11b815260048101919091526a2234b9ba3934b13aba37b960a91b60248201819052916001600160a01b03169063d3a396869060440160206040518083038186803b158015610c4657600080fd5b505afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611aa1565b6001600160a01b0316336001600160a01b031614610cae5760405162461bcd60e51b815260040161049490611f03565b8251600b541015610cfb5760405162461bcd60e51b81526020600482015260176024820152761391950e88155b99195c999b1bddc819195d1958dd1959604a1b6044820152606401610494565b6000610d0685610b61565b905060005b8451811015610d4857610d36858281518110610d2957610d296120d2565b6020026020010151611545565b610d41600182611fd3565b9050610d0b565b506000610d5486610b61565b90508451600b6000828254610d699190611fff565b90915550508451610d7a8284611fff565b14610ade5760405162461bcd60e51b815260206004820152602260248201527f4e46543a204275726e7420616d6f756e7420646f6573206e6f7420636f72726560448201526118dd60f21b6064820152608401610494565b6060600580546103a990612042565b6001600160a01b038216331415610e3a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610494565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610eb0338361118c565b610ecc5760405162461bcd60e51b815260040161049490611f51565b610ed8848484846115e0565b50505050565b6060610ee982611101565b610f4d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610494565b6000610f57611613565b90506000815111610f775760405180602001604052806000815250610fa2565b80610f8184611622565b604051602001610f92929190611e32565b6040516020818303038152906040525b9392505050565b600080546040516369d1cb4360e11b81526d496e66726173747275637475726560901b60048201819052630537761760e41b60248301819052909290916001600160a01b039091169063d3a396869060440160206040518083038186803b15801561101357600080fd5b505afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190611aa1565b6001600160a01b0316336001600160a01b0316146110d15760405162461bcd60e51b815260206004820152603760248201527f5573657252656769737472793a204f6e6c7920616c6c6f772063616c6c20667260448201527f6f6d20616c6c6f7765642063726f737320646f6d61696e0000000000000000006064820152608401610494565b610ade868686611272565b60006110e9848484611720565b506110f486866117ce565b5060019695505050505050565b6000908152600760205260409020546001600160a01b0316151590565b600081815260096020526040902080546001600160a01b0319166001600160a01b038416908117909155819061115382610aea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061119782611101565b6111f85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610494565b600061120383610aea565b9050806001600160a01b0316846001600160a01b0316148061123e5750836001600160a01b03166112338461042c565b6001600160a01b0316145b806107d757506001600160a01b038082166000908152600a602090815260408083209388168352929052205460ff166107d7565b826001600160a01b031661128582610aea565b6001600160a01b0316146112ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610494565b6001600160a01b03821661134f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610494565b61135a60008261111e565b6001600160a01b0383166000908152600860205260408120805460019290611383908490611fff565b90915550506001600160a01b03821660009081526008602052604081208054600192906113b1908490611fd3565b909155505060008181526007602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166114685760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610494565b61147181611101565b156114be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610494565b6001600160a01b03821660009081526008602052604081208054600192906114e7908490611fd3565b909155505060008181526007602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061155082610aea565b905061155d60008361111e565b6001600160a01b0381166000908152600860205260408120805460019290611586908490611fff565b909155505060008281526007602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115eb848484611272565b6115f784848484611871565b610ed85760405162461bcd60e51b815260040161049490611eb1565b6060600380546103a990612042565b6060816116465750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611670578061165a81612077565b91506116699050600a83611feb565b915061164a565b60008167ffffffffffffffff81111561168b5761168b6120e8565b6040519080825280601f01601f1916602001820160405280156116b5576020820181803683370190505b5090505b84156107d7576116ca600183611fff565b91506116d7600a86612092565b6116e2906030611fd3565b60f81b8183815181106116f7576116f76120d2565b60200101906001600160f81b031916908160001a905350611719600a86611feb565b94506116b9565b60065460009060ff16156117885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2049742773206f6e6c792061626c6520746f20696e697469616044820152686c697a65206f6e636560b81b6064820152608401610494565b835161179b906004906020870190611973565b5082516117af906005906020860190611973565b5081516117c3906003906020850190611973565b506001949350505050565b60025460009060ff161561183c5760405162461bcd60e51b815260206004820152602f60248201527f5573657252656769737472793a2049742773206f6e6c792061626c6520746f2060448201526e696e697469616c697a65206f6e636560881b6064820152608401610494565b50600080546001600160a01b0384166001600160a01b031990911617905560018181556002805460ff19168217905592915050565b60006001600160a01b0384163b156117c357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118b5903390899088908890600401611e61565b602060405180830381600087803b1580156118cf57600080fd5b505af19250505080156118ff575060408051601f3d908101601f191682019092526118fc91810190611d9b565b60015b611959573d80801561192d576040519150601f19603f3d011682016040523d82523d6000602084013e611932565b606091505b5080516119515760405162461bcd60e51b815260040161049490611eb1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506107d7565b82805461197f90612042565b90600052602060002090601f0160209004810192826119a157600085556119e7565b82601f106119ba57805160ff19168380011785556119e7565b828001600101855582156119e7579182015b828111156119e75782518255916020019190600101906119cc565b506119f39291506119f7565b5090565b5b808211156119f357600081556001016119f8565b600067ffffffffffffffff831115611a2657611a266120e8565b611a39601f8401601f1916602001611fa2565b9050828152838383011115611a4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112611a7557600080fd5b610fa283833560208501611a0c565b600060208284031215611a9657600080fd5b8135610fa2816120fe565b600060208284031215611ab357600080fd5b8151610fa2816120fe565b60008060408385031215611ad157600080fd5b8235611adc816120fe565b91506020830135611aec816120fe565b809150509250929050565b600080600060608486031215611b0c57600080fd5b8335611b17816120fe565b92506020840135611b27816120fe565b929592945050506040919091013590565b60008060008060808587031215611b4e57600080fd5b8435611b59816120fe565b93506020850135611b69816120fe565b925060408501359150606085013567ffffffffffffffff811115611b8c57600080fd5b8501601f81018713611b9d57600080fd5b611bac87823560208401611a0c565b91505092959194509250565b60008060408385031215611bcb57600080fd5b8235611bd6816120fe565b915060208381013567ffffffffffffffff80821115611bf457600080fd5b818601915086601f830112611c0857600080fd5b813581811115611c1a57611c1a6120e8565b8060051b9150611c2b848301611fa2565b8181528481019084860184860187018b1015611c4657600080fd5b600095505b83861015611c69578035835260019590950194918601918601611c4b565b508096505050505050509250929050565b60008060408385031215611c8d57600080fd5b8235611c98816120fe565b915060208301358015158114611aec57600080fd5b600080600080600060a08688031215611cc557600080fd5b8535611cd0816120fe565b945060208601359350604086013567ffffffffffffffff80821115611cf457600080fd5b611d0089838a01611a64565b94506060880135915080821115611d1657600080fd5b611d2289838a01611a64565b93506080880135915080821115611d3857600080fd5b50611d4588828901611a64565b9150509295509295909350565b60008060408385031215611d6557600080fd5b8235611d70816120fe565b946020939093013593505050565b600060208284031215611d9057600080fd5b8135610fa281612116565b600060208284031215611dad57600080fd5b8151610fa281612116565b600060208284031215611dca57600080fd5b813567ffffffffffffffff811115611de157600080fd5b6107d784828501611a64565b600060208284031215611dff57600080fd5b5035919050565b60008151808452611e1e816020860160208601612016565b601f01601f19169290920160200192915050565b60008351611e44818460208801612016565b835190830190611e58818360208801612016565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e9490830184611e06565b9695505050505050565b602081526000610fa26020830184611e06565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f5573657252656769737472793a204f6e6c7920616c6c6f772063616c6c20667260408201526d37b69039b0b6b2903237b6b0b4b760911b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611fcb57611fcb6120e8565b604052919050565b60008219821115611fe657611fe66120a6565b500190565b600082611ffa57611ffa6120bc565b500490565b600082821015612011576120116120a6565b500390565b60005b83811015612031578181015183820152602001612019565b83811115610ed85750506000910152565b600181811c9082168061205657607f821691505b602082108114156106df57634e487b7160e01b600052602260045260246000fd5b600060001982141561208b5761208b6120a6565b5060010190565b6000826120a1576120a16120bc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461211357600080fd5b50565b6001600160e01b03198116811461211357600080fdfea264697066735822122064fc45fc8f45984ae86f60b6376183e383e835c8b57e00519f3e4265f7eca45464736f6c63430008070033
Deployed Bytecode Sourcemap
36657:2881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22507:281;;;;;;:::i;:::-;;:::i;:::-;;;8222:14:1;;8215:22;8197:41;;8185:2;8170:18;22507:281:0;;;;;;;;23380:94;;;:::i;:::-;;;;;;;:::i;24831:211::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7520:32:1;;;7502:51;;7490:2;7475:18;24831:211:0;7356:203:1;24396:377:0;;;;;;:::i;:::-;;:::i;:::-;;39453:82;39522:7;;39453:82;;;8395:25:1;;;8383:2;8368:18;39453:82:0;8249:177:1;25667:311:0;;;;;;:::i;:::-;;:::i;38725:142::-;;;;;;:::i;:::-;;:::i;37249:182::-;;;;;;:::i;:::-;;:::i;26041:165::-;;;;;;:::i;:::-;;:::i;37945:221::-;;;;;;:::i;:::-;;:::i;37437:457::-;;;;;;:::i;:::-;;:::i;36215:93::-;36261:7;36292:9;-1:-1:-1;;;;;36292:9:0;36215:93;;23096:225;;;;;;:::i;:::-;;:::i;22844:198::-;;;;;;:::i;:::-;;:::i;38172:521::-;;;;;;:::i;:::-;;:::i;23535:98::-;;;:::i;25106:281::-;;;;;;:::i;:::-;;:::i;36099:80::-;36166:7;;36099:80;;26269:300;;;;;;:::i;:::-;;:::i;23696:320::-;;;;;;:::i;:::-;;:::i;39066:215::-;;;;;;:::i;:::-;;:::i;25450:158::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25567:25:0;;;25547:4;25567:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25450:158;36772:276;;;;;;:::i;:::-;;:::i;22507:281::-;22609:4;-1:-1:-1;;;;;;22636:40:0;;-1:-1:-1;;;22636:40:0;;:99;;-1:-1:-1;;;;;;;22687:48:0;;-1:-1:-1;;;22687:48:0;22636:99;:146;;;-1:-1:-1;;;;;;;;;;20111:40:0;;;22746:36;22622:160;22507:281;-1:-1:-1;;22507:281:0:o;23380:94::-;23434:13;23463:5;23456:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23380:94;:::o;24831:211::-;24907:7;24931:16;24939:7;24931;:16::i;:::-;24923:73;;;;-1:-1:-1;;;24923:73:0;;13906:2:1;24923:73:0;;;13888:21:1;13945:2;13925:18;;;13918:30;13984:34;13964:18;;;13957:62;-1:-1:-1;;;14035:18:1;;;14028:42;14087:19;;24923:73:0;;;;;;;;;-1:-1:-1;25012:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25012:24:0;;24831:211::o;24396:377::-;24473:13;24489:23;24504:7;24489:14;:23::i;:::-;24473:39;;24533:5;-1:-1:-1;;;;;24527:11:0;:2;-1:-1:-1;;;;;24527:11:0;;;24519:57;;;;-1:-1:-1;;;24519:57:0;;15901:2:1;24519:57:0;;;15883:21:1;15940:2;15920:18;;;15913:30;15979:34;15959:18;;;15952:62;-1:-1:-1;;;16030:18:1;;;16023:31;16071:19;;24519:57:0;15699:397:1;24519:57:0;16781:10;-1:-1:-1;;;;;24601:21:0;;;;:62;;-1:-1:-1;24626:37:0;24643:5;16781:10;25450:158;:::i;24626:37::-;24585:152;;;;-1:-1:-1;;;24585:152:0;;12299:2:1;24585:152:0;;;12281:21:1;12338:2;12318:18;;;12311:30;12377:34;12357:18;;;12350:62;12448:26;12428:18;;;12421:54;12492:19;;24585:152:0;12097:420:1;24585:152:0;24746:21;24755:2;24759:7;24746:8;:21::i;:::-;24466:307;24396:377;;:::o;25667:311::-;25840:41;16781:10;25873:7;25840:18;:41::i;:::-;25832:103;;;;-1:-1:-1;;;25832:103:0;;;;;;;:::i;:::-;25944:28;25954:4;25960:2;25964:7;25944:9;:28::i;38725:142::-;38819:4;34890:9;;;34911:7;34890:35;;-1:-1:-1;;;34890:35:0;;;;;8605:25:1;;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;34818:172:0;-1:-1:-1;;;;;34890:9:0;;:20;;8578:18:1;;34890:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:49:0;:10;-1:-1:-1;;;;;34876:49:0;;34868:108;;;;-1:-1:-1;;;34868:108:0;;;;;;;:::i;:::-;38832:11;;::::1;::::0;:4:::1;::::0;:11:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38857:4;38850:11;;34983:1;38725:142:::0;;;;:::o;37249:182::-;37345:4;34890:9;;;34911:7;34890:35;;-1:-1:-1;;;34890:35:0;;;;;8605:25:1;;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;34818:172:0;-1:-1:-1;;;;;34890:9:0;;:20;;8578:18:1;;34890:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:49:0;:10;-1:-1:-1;;;;;34876:49:0;;34868:108;;;;-1:-1:-1;;;34868:108:0;;;;;;;:::i;:::-;37369:1:::1;37358:7;;:12;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;37377:18:0::1;::::0;-1:-1:-1;37383:2:0;37387:7;37377:5:::1;:18::i;:::-;37409:16;37417:7;37409;:16::i;:::-;37402:23:::0;37249:182;-1:-1:-1;;;;37249:182:0:o;26041:165::-;26161:39;26178:4;26184:2;26188:7;26161:39;;;;;;;;;;;;:16;:39::i;37945:221::-;38029:4;34890:9;;;34911:7;34890:35;;-1:-1:-1;;;34890:35:0;;;;;8605:25:1;;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;34818:172:0;-1:-1:-1;;;;;34890:9:0;;:20;;8578:18:1;;34890:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:49:0;:10;-1:-1:-1;;;;;34876:49:0;;34868:108;;;;-1:-1:-1;;;34868:108:0;;;;;;;:::i;:::-;38060:1:::1;38050:7;;:11;38042:47;;;::::0;-1:-1:-1;;;38042:47:0;;14319:2:1;38042:47:0::1;::::0;::::1;14301:21:1::0;14358:2;14338:18;;;14331:30;-1:-1:-1;;;14377:18:1;;;14370:53;14440:18;;38042:47:0::1;14117:347:1::0;38042:47:0::1;38107:1;38096:7;;:12;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;38115:14:0::1;::::0;-1:-1:-1;38121:7:0;38115:5:::1;:14::i;:::-;38144:16;38152:7;38144;:16::i;:::-;38143:17;::::0;37945:221;-1:-1:-1;;;37945:221:0:o;37437:457::-;37548:4;34890:9;;;34911:7;34890:35;;-1:-1:-1;;;34890:35:0;;;;;8605:25:1;;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;34818:172:0;-1:-1:-1;;;;;34890:9:0;;:20;;8578:18:1;;34890:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:49:0;:10;-1:-1:-1;;;;;34876:49:0;;34868:108;;;;-1:-1:-1;;;34868:108:0;;;;;;;:::i;:::-;37561:21:::1;37585:13;37595:2;37585:9;:13::i;:::-;37561:37;;37610:9;37605:88;37629:8;:15;37625:1;:19;37605:88;;;37663:22;37669:2;37673:8;37682:1;37673:11;;;;;;;;:::i;:::-;;;;;;;37663:5;:22::i;:::-;37646:6;37651:1;37646:6:::0;::::1;:::i;:::-;;;37605:88;;;;37699:20;37722:13;37732:2;37722:9;:13::i;:::-;37699:36;;37753:8;:15;37742:7;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37815:15:0;;37783:28:::1;37798:13:::0;37783:12;:28:::1;:::i;:::-;:47;37775:95;;;::::0;-1:-1:-1;;;37775:95:0;;14671:2:1;37775:95:0::1;::::0;::::1;14653:21:1::0;14710:2;14690:18;;;14683:30;14749:34;14729:18;;;14722:62;-1:-1:-1;;;14800:18:1;;;14793:33;14843:19;;37775:95:0::1;14469:399:1::0;37775:95:0::1;-1:-1:-1::0;37884:4:0::1;::::0;37437:457;-1:-1:-1;;;;;37437:457:0:o;23096:225::-;23168:7;23200:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23200:16:0;23231:19;23223:73;;;;-1:-1:-1;;;23223:73:0;;13135:2:1;23223:73:0;;;13117:21:1;13174:2;13154:18;;;13147:30;13213:34;13193:18;;;13186:62;-1:-1:-1;;;13264:18:1;;;13257:39;13313:19;;23223:73:0;12933:405:1;22844:198:0;22916:7;-1:-1:-1;;;;;22940:19:0;;22932:74;;;;-1:-1:-1;;;22932:74:0;;12724:2:1;22932:74:0;;;12706:21:1;12763:2;12743:18;;;12736:30;12802:34;12782:18;;;12775:62;-1:-1:-1;;;12853:18:1;;;12846:40;12903:19;;22932:74:0;12522:406:1;22932:74:0;-1:-1:-1;;;;;;23020:16:0;;;;;:9;:16;;;;;;;22844:198::o;38172:521::-;38283:4;34890:9;;;34911:7;34890:35;;-1:-1:-1;;;34890:35:0;;;;;8605:25:1;;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;34818:172:0;-1:-1:-1;;;;;34890:9:0;;:20;;8578:18:1;;34890:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:49:0;:10;-1:-1:-1;;;;;34876:49:0;;34868:108;;;;-1:-1:-1;;;34868:108:0;;;;;;;:::i;:::-;38315:8:::1;:15;38304:7;;:26;;38296:62;;;::::0;-1:-1:-1;;;38296:62:0;;14319:2:1;38296:62:0::1;::::0;::::1;14301:21:1::0;14358:2;14338:18;;;14331:30;-1:-1:-1;;;14377:18:1;;;14370:53;14440:18;;38296:62:0::1;14117:347:1::0;38296:62:0::1;38365:21;38389:13;38399:2;38389:9;:13::i;:::-;38365:37;;38414:9;38409:84;38433:8;:15;38429:1;:19;38409:84;;;38467:18;38473:8;38482:1;38473:11;;;;;;;;:::i;:::-;;;;;;;38467:5;:18::i;:::-;38450:6;38455:1;38450:6:::0;::::1;:::i;:::-;;;38409:84;;;;38499:20;38522:13;38532:2;38522:9;:13::i;:::-;38499:36;;38553:8;:15;38542:7;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38615:15:0;;38583:28:::1;38599:12:::0;38583:13;:28:::1;:::i;:::-;:47;38575:94;;;::::0;-1:-1:-1;;;38575:94:0;;16721:2:1;38575:94:0::1;::::0;::::1;16703:21:1::0;16760:2;16740:18;;;16733:30;16799:34;16779:18;;;16772:62;-1:-1:-1;;;16850:18:1;;;16843:32;16892:19;;38575:94:0::1;16519:398:1::0;23535:98:0;23591:13;23620:7;23613:14;;;;;:::i;25106:281::-;-1:-1:-1;;;;;25205:24:0;;16781:10;25205:24;;25197:62;;;;-1:-1:-1;;;25197:62:0;;10707:2:1;25197:62:0;;;10689:21:1;10746:2;10726:18;;;10719:30;10785:27;10765:18;;;10758:55;10830:18;;25197:62:0;10505:349:1;25197:62:0;16781:10;25268:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25268:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25268:53:0;;;;;;;;;;25333:48;;8197:41:1;;;25268:42:0;;16781:10;25333:48;;8170:18:1;25333:48:0;;;;;;;25106:281;;:::o;26269:300::-;26422:41;16781:10;26455:7;26422:18;:41::i;:::-;26414:103;;;;-1:-1:-1;;;26414:103:0;;;;;;;:::i;:::-;26524:39;26538:4;26544:2;26548:7;26557:5;26524:13;:39::i;:::-;26269:300;;;;:::o;23696:320::-;23769:13;23799:16;23807:7;23799;:16::i;:::-;23791:76;;;;-1:-1:-1;;;23791:76:0;;15485:2:1;23791:76:0;;;15467:21:1;15524:2;15504:18;;;15497:30;15563:34;15543:18;;;15536:62;-1:-1:-1;;;15614:18:1;;;15607:45;15669:19;;23791:76:0;15283:411:1;23791:76:0;23876:21;23900:10;:8;:10::i;:::-;23876:34;;23948:1;23930:7;23924:21;:25;:86;;;;;;;;;;;;;;;;;23976:7;23985:18;:7;:16;:18::i;:::-;23959:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23924:86;23917:93;23696:320;-1:-1:-1;;;23696:320:0:o;39066:215::-;39216:4;35127:9;;:38;;-1:-1:-1;;;35127:38:0;;-1:-1:-1;;;35127:38:0;;;8605:25:1;;;-1:-1:-1;;;8646:18:1;;;8639:34;;;35026:226:0;;;;-1:-1:-1;;;;;35127:9:0;;;;:20;;8578:18:1;;35127:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35113:52:0;:10;-1:-1:-1;;;;;35113:52:0;;35097:141;;;;-1:-1:-1;;;35097:141:0;;17124:2:1;35097:141:0;;;17106:21:1;17163:2;17143:18;;;17136:30;17202:34;17182:18;;;17175:62;17273:25;17253:18;;;17246:53;17316:19;;35097:141:0;16922:419:1;35097:141:0;39229:28:::1;39239:4;39245:2;39249:7;39229:9;:28::i;36772:276::-:0;36934:4;36947:33;36959:5;36966:7;36975:4;36947:11;:33::i;:::-;;36987:37;37005:9;37016:7;36987:17;:37::i;:::-;-1:-1:-1;37038:4:0;;36772:276;-1:-1:-1;;;;;;36772:276:0:o;27995:121::-;28060:4;28080:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28080:16:0;:30;;;27995:121::o;31671:164::-;31742:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31742:29:0;-1:-1:-1;;;;;31742:29:0;;;;;;;;:24;;31792:23;31742:24;31792:14;:23::i;:::-;-1:-1:-1;;;;;31783:46:0;;;;;;;;;;;31671:164;;:::o;28267:334::-;28360:4;28381:16;28389:7;28381;:16::i;:::-;28373:73;;;;-1:-1:-1;;;28373:73:0;;11471:2:1;28373:73:0;;;11453:21:1;11510:2;11490:18;;;11483:30;11549:34;11529:18;;;11522:62;-1:-1:-1;;;11600:18:1;;;11593:42;11652:19;;28373:73:0;11269:408:1;28373:73:0;28453:13;28469:23;28484:7;28469:14;:23::i;:::-;28453:39;;28518:5;-1:-1:-1;;;;;28507:16:0;:7;-1:-1:-1;;;;;28507:16:0;;:51;;;;28551:7;-1:-1:-1;;;;;28527:31:0;:20;28539:7;28527:11;:20::i;:::-;-1:-1:-1;;;;;28527:31:0;;28507:51;:87;;;-1:-1:-1;;;;;;25567:25:0;;;25547:4;25567:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28562:32;25450:158;31039:526;31180:4;-1:-1:-1;;;;;31153:31:0;:23;31168:7;31153:14;:23::i;:::-;-1:-1:-1;;;;;31153:31:0;;31145:85;;;;-1:-1:-1;;;31145:85:0;;15075:2:1;31145:85:0;;;15057:21:1;15114:2;15094:18;;;15087:30;15153:34;15133:18;;;15126:62;-1:-1:-1;;;15204:18:1;;;15197:39;15253:19;;31145:85:0;14873:405:1;31145:85:0;-1:-1:-1;;;;;31245:16:0;;31237:65;;;;-1:-1:-1;;;31237:65:0;;10302:2:1;31237:65:0;;;10284:21:1;10341:2;10321:18;;;10314:30;10380:34;10360:18;;;10353:62;-1:-1:-1;;;10431:18:1;;;10424:34;10475:19;;31237:65:0;10100:400:1;31237:65:0;31407:29;31424:1;31428:7;31407:8;:29::i;:::-;-1:-1:-1;;;;;31445:15:0;;;;;;:9;:15;;;;;:20;;31464:1;;31445:15;:20;;31464:1;;31445:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31472:13:0;;;;;;:9;:13;;;;;:18;;31489:1;;31472:13;:18;;31489:1;;31472:18;:::i;:::-;;;;-1:-1:-1;;31497:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31497:21:0;-1:-1:-1;;;;;31497:21:0;;;;;;;;;31532:27;;31497:16;;31532:27;;;;;;;31039:526;;;:::o;29833:356::-;-1:-1:-1;;;;;29909:16:0;;29901:61;;;;-1:-1:-1;;;29901:61:0;;13545:2:1;29901:61:0;;;13527:21:1;;;13564:18;;;13557:30;13623:34;13603:18;;;13596:62;13675:18;;29901:61:0;13343:356:1;29901:61:0;29978:16;29986:7;29978;:16::i;:::-;29977:17;29969:58;;;;-1:-1:-1;;;29969:58:0;;9529:2:1;29969:58:0;;;9511:21:1;9568:2;9548:18;;;9541:30;9607;9587:18;;;9580:58;9655:18;;29969:58:0;9327:352:1;29969:58:0;-1:-1:-1;;;;;30090:13:0;;;;;;:9;:13;;;;;:18;;30107:1;;30090:13;:18;;30107:1;;30090:18;:::i;:::-;;;;-1:-1:-1;;30115:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30115:21:0;-1:-1:-1;;;;;30115:21:0;;;;;;;;30150:33;;30115:16;;;30150:33;;30115:16;;30150:33;29833:356;;:::o;30396:330::-;30452:13;30468:23;30483:7;30468:14;:23::i;:::-;30452:39;;30581:29;30598:1;30602:7;30581:8;:29::i;:::-;-1:-1:-1;;;;;30619:16:0;;;;;;:9;:16;;;;;:21;;30639:1;;30619:16;:21;;30639:1;;30619:21;:::i;:::-;;;;-1:-1:-1;;30654:16:0;;;;:7;:16;;;;;;30647:23;;-1:-1:-1;;;;;;30647:23:0;;;30684:36;30662:7;;30654:16;-1:-1:-1;;;;;30684:36:0;;;;;30654:16;;30684:36;30445:281;30396:330;:::o;27413:287::-;27548:28;27558:4;27564:2;27568:7;27548:9;:28::i;:::-;27591:48;27614:4;27620:2;27624:7;27633:5;27591:22;:48::i;:::-;27583:111;;;;-1:-1:-1;;;27583:111:0;;;;;;;:::i;24252:90::-;24303:13;24332:4;24325:11;;;;;:::i;17294:723::-;17350:13;17571:10;17567:53;;-1:-1:-1;;17598:10:0;;;;;;;;;;;;-1:-1:-1;;;17598:10:0;;;;;17294:723::o;17567:53::-;17645:5;17630:12;17686:78;17693:9;;17686:78;;17719:8;;;;:::i;:::-;;-1:-1:-1;17742:10:0;;-1:-1:-1;17750:2:0;17742:10;;:::i;:::-;;;17686:78;;;17774:19;17806:6;17796:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17796:17:0;;17774:39;;17824:154;17831:10;;17824:154;;17858:11;17868:1;17858:11;;:::i;:::-;;-1:-1:-1;17927:10:0;17935:2;17927:5;:10;:::i;:::-;17914:24;;:2;:24;:::i;:::-;17901:39;;17884:6;17891;17884:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17884:56:0;;;;;;;;-1:-1:-1;17955:11:0;17964:2;17955:11;;:::i;:::-;;;17824:154;;22154:289;22299:12;;22277:4;;22299:12;;22298:13;22290:67;;;;-1:-1:-1;;;22290:67:0;;11061:2:1;22290:67:0;;;11043:21:1;11100:2;11080:18;;;11073:30;11139:34;11119:18;;;11112:62;-1:-1:-1;;;11190:18:1;;;11183:39;11239:19;;22290:67:0;10859:405:1;22290:67:0;22364:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;22384:17:0;;;;:7;;:17;;;;;:::i;:::-;-1:-1:-1;22408:11:0;;;;:4;;:11;;;;;:::i;:::-;-1:-1:-1;22433:4:0;;22154:289;-1:-1:-1;;;;22154:289:0:o;35468:280::-;35571:12;;35549:4;;35571:12;;35570:13;35562:73;;;;-1:-1:-1;;;35562:73:0;;9886:2:1;35562:73:0;;;9868:21:1;9925:2;9905:18;;;9898:30;9964:34;9944:18;;;9937:62;-1:-1:-1;;;10015:18:1;;;10008:45;10070:19;;35562:73:0;9684:411:1;35562:73:0;-1:-1:-1;35642:9:0;:32;;-1:-1:-1;;;;;35642:32:0;;-1:-1:-1;;;;;;35642:32:0;;;;;;;35681:17;;;35705:12;:19;;-1:-1:-1;;35705:19:0;;;;;35468:280;;;;:::o;32378:669::-;32515:4;-1:-1:-1;;;;;32532:13:0;;9000:20;9048:8;32528:514;;32562:72;;-1:-1:-1;;;32562:72:0;;-1:-1:-1;;;;;32562:36:0;;;;;:72;;16781:10;;32613:4;;32619:7;;32628:5;;32562:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32562:72:0;;;;;;;;-1:-1:-1;;32562:72:0;;;;;;;;;;;;:::i;:::-;;;32558:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32782:13:0;;32778:214;;32815:60;;-1:-1:-1;;;32815:60:0;;;;;;;:::i;32778:214::-;32960:6;32954:13;32945:6;32941:2;32937:15;32930:38;32558:443;-1:-1:-1;;;;;;32677:51:0;-1:-1:-1;;;32677:51:0;;-1:-1:-1;32670:58:0;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:221::-;468:5;521:3;514:4;506:6;502:17;498:27;488:55;;539:1;536;529:12;488:55;561:79;636:3;627:6;614:20;607:4;599:6;595:17;561:79;:::i;651:247::-;710:6;763:2;751:9;742:7;738:23;734:32;731:52;;;779:1;776;769:12;731:52;818:9;805:23;837:31;862:5;837:31;:::i;903:251::-;973:6;1026:2;1014:9;1005:7;1001:23;997:32;994:52;;;1042:1;1039;1032:12;994:52;1074:9;1068:16;1093:31;1118:5;1093:31;:::i;1159:388::-;1227:6;1235;1288:2;1276:9;1267:7;1263:23;1259:32;1256:52;;;1304:1;1301;1294:12;1256:52;1343:9;1330:23;1362:31;1387:5;1362:31;:::i;:::-;1412:5;-1:-1:-1;1469:2:1;1454:18;;1441:32;1482:33;1441:32;1482:33;:::i;:::-;1534:7;1524:17;;;1159:388;;;;;:::o;1552:456::-;1629:6;1637;1645;1698:2;1686:9;1677:7;1673:23;1669:32;1666:52;;;1714:1;1711;1704:12;1666:52;1753:9;1740:23;1772:31;1797:5;1772:31;:::i;:::-;1822:5;-1:-1:-1;1879:2:1;1864:18;;1851:32;1892:33;1851:32;1892:33;:::i;:::-;1552:456;;1944:7;;-1:-1:-1;;;1998:2:1;1983:18;;;;1970:32;;1552:456::o;2013:794::-;2108:6;2116;2124;2132;2185:3;2173:9;2164:7;2160:23;2156:33;2153:53;;;2202:1;2199;2192:12;2153:53;2241:9;2228:23;2260:31;2285:5;2260:31;:::i;:::-;2310:5;-1:-1:-1;2367:2:1;2352:18;;2339:32;2380:33;2339:32;2380:33;:::i;:::-;2432:7;-1:-1:-1;2486:2:1;2471:18;;2458:32;;-1:-1:-1;2541:2:1;2526:18;;2513:32;2568:18;2557:30;;2554:50;;;2600:1;2597;2590:12;2554:50;2623:22;;2676:4;2668:13;;2664:27;-1:-1:-1;2654:55:1;;2705:1;2702;2695:12;2654:55;2728:73;2793:7;2788:2;2775:16;2770:2;2766;2762:11;2728:73;:::i;:::-;2718:83;;;2013:794;;;;;;;:::o;2812:1092::-;2905:6;2913;2966:2;2954:9;2945:7;2941:23;2937:32;2934:52;;;2982:1;2979;2972:12;2934:52;3021:9;3008:23;3040:31;3065:5;3040:31;:::i;:::-;3090:5;-1:-1:-1;3114:2:1;3152:18;;;3139:32;3190:18;3220:14;;;3217:34;;;3247:1;3244;3237:12;3217:34;3285:6;3274:9;3270:22;3260:32;;3330:7;3323:4;3319:2;3315:13;3311:27;3301:55;;3352:1;3349;3342:12;3301:55;3388:2;3375:16;3410:2;3406;3403:10;3400:36;;;3416:18;;:::i;:::-;3462:2;3459:1;3455:10;3445:20;;3485:28;3509:2;3505;3501:11;3485:28;:::i;:::-;3547:15;;;3578:12;;;;3610:11;;;3640;;;3636:20;;3633:33;-1:-1:-1;3630:53:1;;;3679:1;3676;3669:12;3630:53;3701:1;3692:10;;3711:163;3725:2;3722:1;3719:9;3711:163;;;3782:17;;3770:30;;3743:1;3736:9;;;;;3820:12;;;;3852;;3711:163;;;3715:3;3893:5;3883:15;;;;;;;;2812:1092;;;;;:::o;3909:416::-;3974:6;3982;4035:2;4023:9;4014:7;4010:23;4006:32;4003:52;;;4051:1;4048;4041:12;4003:52;4090:9;4077:23;4109:31;4134:5;4109:31;:::i;:::-;4159:5;-1:-1:-1;4216:2:1;4201:18;;4188:32;4258:15;;4251:23;4239:36;;4229:64;;4289:1;4286;4279:12;4330:948;4455:6;4463;4471;4479;4487;4540:3;4528:9;4519:7;4515:23;4511:33;4508:53;;;4557:1;4554;4547:12;4508:53;4596:9;4583:23;4615:31;4640:5;4615:31;:::i;:::-;4665:5;-1:-1:-1;4717:2:1;4702:18;;4689:32;;-1:-1:-1;4772:2:1;4757:18;;4744:32;4795:18;4825:14;;;4822:34;;;4852:1;4849;4842:12;4822:34;4875:50;4917:7;4908:6;4897:9;4893:22;4875:50;:::i;:::-;4865:60;;4978:2;4967:9;4963:18;4950:32;4934:48;;5007:2;4997:8;4994:16;4991:36;;;5023:1;5020;5013:12;4991:36;5046:52;5090:7;5079:8;5068:9;5064:24;5046:52;:::i;:::-;5036:62;;5151:3;5140:9;5136:19;5123:33;5107:49;;5181:2;5171:8;5168:16;5165:36;;;5197:1;5194;5187:12;5165:36;;5220:52;5264:7;5253:8;5242:9;5238:24;5220:52;:::i;:::-;5210:62;;;4330:948;;;;;;;;:::o;5283:315::-;5351:6;5359;5412:2;5400:9;5391:7;5387:23;5383:32;5380:52;;;5428:1;5425;5418:12;5380:52;5467:9;5454:23;5486:31;5511:5;5486:31;:::i;:::-;5536:5;5588:2;5573:18;;;;5560:32;;-1:-1:-1;;;5283:315:1:o;5603:245::-;5661:6;5714:2;5702:9;5693:7;5689:23;5685:32;5682:52;;;5730:1;5727;5720:12;5682:52;5769:9;5756:23;5788:30;5812:5;5788:30;:::i;5853:249::-;5922:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:52;;;5991:1;5988;5981:12;5943:52;6023:9;6017:16;6042:30;6066:5;6042:30;:::i;6107:322::-;6176:6;6229:2;6217:9;6208:7;6204:23;6200:32;6197:52;;;6245:1;6242;6235:12;6197:52;6285:9;6272:23;6318:18;6310:6;6307:30;6304:50;;;6350:1;6347;6340:12;6304:50;6373;6415:7;6406:6;6395:9;6391:22;6373:50;:::i;6434:180::-;6493:6;6546:2;6534:9;6525:7;6521:23;6517:32;6514:52;;;6562:1;6559;6552:12;6514:52;-1:-1:-1;6585:23:1;;6434:180;-1:-1:-1;6434:180:1:o;6619:257::-;6660:3;6698:5;6692:12;6725:6;6720:3;6713:19;6741:63;6797:6;6790:4;6785:3;6781:14;6774:4;6767:5;6763:16;6741:63;:::i;:::-;6858:2;6837:15;-1:-1:-1;;6833:29:1;6824:39;;;;6865:4;6820:50;;6619:257;-1:-1:-1;;6619:257:1:o;6881:470::-;7060:3;7098:6;7092:13;7114:53;7160:6;7155:3;7148:4;7140:6;7136:17;7114:53;:::i;:::-;7230:13;;7189:16;;;;7252:57;7230:13;7189:16;7286:4;7274:17;;7252:57;:::i;:::-;7325:20;;6881:470;-1:-1:-1;;;;6881:470:1:o;7564:488::-;-1:-1:-1;;;;;7833:15:1;;;7815:34;;7885:15;;7880:2;7865:18;;7858:43;7932:2;7917:18;;7910:34;;;7980:3;7975:2;7960:18;;7953:31;;;7758:4;;8001:45;;8026:19;;8018:6;8001:45;:::i;:::-;7993:53;7564:488;-1:-1:-1;;;;;;7564:488:1:o;8684:219::-;8833:2;8822:9;8815:21;8796:4;8853:44;8893:2;8882:9;8878:18;8870:6;8853:44;:::i;8908:414::-;9110:2;9092:21;;;9149:2;9129:18;;;9122:30;9188:34;9183:2;9168:18;;9161:62;-1:-1:-1;;;9254:2:1;9239:18;;9232:48;9312:3;9297:19;;8908:414::o;11682:410::-;11884:2;11866:21;;;11923:2;11903:18;;;11896:30;11962:34;11957:2;11942:18;;11935:62;-1:-1:-1;;;12028:2:1;12013:18;;12006:44;12082:3;12067:19;;11682:410::o;16101:413::-;16303:2;16285:21;;;16342:2;16322:18;;;16315:30;16381:34;16376:2;16361:18;;16354:62;-1:-1:-1;;;16447:2:1;16432:18;;16425:47;16504:3;16489:19;;16101:413::o;17528:275::-;17599:2;17593:9;17664:2;17645:13;;-1:-1:-1;;17641:27:1;17629:40;;17699:18;17684:34;;17720:22;;;17681:62;17678:88;;;17746:18;;:::i;:::-;17782:2;17775:22;17528:275;;-1:-1:-1;17528:275:1:o;17808:128::-;17848:3;17879:1;17875:6;17872:1;17869:13;17866:39;;;17885:18;;:::i;:::-;-1:-1:-1;17921:9:1;;17808:128::o;17941:120::-;17981:1;18007;17997:35;;18012:18;;:::i;:::-;-1:-1:-1;18046:9:1;;17941:120::o;18066:125::-;18106:4;18134:1;18131;18128:8;18125:34;;;18139:18;;:::i;:::-;-1:-1:-1;18176:9:1;;18066:125::o;18196:258::-;18268:1;18278:113;18292:6;18289:1;18286:13;18278:113;;;18368:11;;;18362:18;18349:11;;;18342:39;18314:2;18307:10;18278:113;;;18409:6;18406:1;18403:13;18400:48;;;-1:-1:-1;;18444:1:1;18426:16;;18419:27;18196:258::o;18459:380::-;18538:1;18534:12;;;;18581;;;18602:61;;18656:4;18648:6;18644:17;18634:27;;18602:61;18709:2;18701:6;18698:14;18678:18;18675:38;18672:161;;;18755:10;18750:3;18746:20;18743:1;18736:31;18790:4;18787:1;18780:15;18818:4;18815:1;18808:15;18844:135;18883:3;-1:-1:-1;;18904:17:1;;18901:43;;;18924:18;;:::i;:::-;-1:-1:-1;18971:1:1;18960:13;;18844:135::o;18984:112::-;19016:1;19042;19032:35;;19047:18;;:::i;:::-;-1:-1:-1;19081:9:1;;18984:112::o;19101:127::-;19162:10;19157:3;19153:20;19150:1;19143:31;19193:4;19190:1;19183:15;19217:4;19214:1;19207:15;19233:127;19294:10;19289:3;19285:20;19282:1;19275:31;19325:4;19322:1;19315:15;19349:4;19346:1;19339:15;19365:127;19426:10;19421:3;19417:20;19414:1;19407:31;19457:4;19454:1;19447:15;19481:4;19478:1;19471:15;19497:127;19558:10;19553:3;19549:20;19546:1;19539:31;19589:4;19586:1;19579:15;19613:4;19610:1;19603:15;19629:131;-1:-1:-1;;;;;19704:31:1;;19694:42;;19684:70;;19750:1;19747;19740:12;19684:70;19629:131;:::o;19765:::-;-1:-1:-1;;;;;;19839:32:1;;19829:43;;19819:71;;19886:1;19883;19876:12
Swarm Source
ipfs://64fc45fc8f45984ae86f60b6376183e383e835c8b57e00519f3e4265f7eca454
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.