Overview
POL Balance
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 27 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 54583880 | 343 days ago | IN | 0 POL | 0.00473574 | ||||
Transfer From | 51142936 | 432 days ago | IN | 0 POL | 0.00462951 | ||||
Transfer From | 49947249 | 462 days ago | IN | 0 POL | 0.00435695 | ||||
Transfer From | 48046830 | 510 days ago | IN | 0 POL | 0.00278264 | ||||
Transfer From | 47368710 | 528 days ago | IN | 0 POL | 0.00756064 | ||||
Transfer From | 32726866 | 897 days ago | IN | 0 POL | 0.00121449 | ||||
Transfer From | 32726853 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726848 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726838 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726830 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726775 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726762 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726740 | 897 days ago | IN | 0 POL | 0.00135849 | ||||
Transfer From | 32726722 | 897 days ago | IN | 0 POL | 0.00187149 | ||||
Safe Transfer Fr... | 32565510 | 901 days ago | IN | 0 POL | 0.00199474 | ||||
Set Approval For... | 32493423 | 903 days ago | IN | 0 POL | 0.00147468 | ||||
Set Approval For... | 31166415 | 938 days ago | IN | 0 POL | 0.01251971 | ||||
Set Approval For... | 30974890 | 944 days ago | IN | 0 POL | 0.00176686 | ||||
Set Approval For... | 30974718 | 944 days ago | IN | 0 POL | 0.00395009 | ||||
Set Approval For... | 30974273 | 944 days ago | IN | 0 POL | 0.00171054 | ||||
Reveal Collectio... | 30971842 | 944 days ago | IN | 0 POL | 0.00120311 | ||||
Transfer From | 30970823 | 944 days ago | IN | 0 POL | 0.00192171 | ||||
Mint | 30945741 | 944 days ago | IN | 0 POL | 0.28680661 | ||||
Mint | 30945646 | 944 days ago | IN | 0 POL | 0.00435221 | ||||
Mint | 30945547 | 944 days ago | IN | 0 POL | 0.00493677 |
Loading...
Loading
Contract Name:
EveLifetimeNft
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity Multiple files format)
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Counters.sol"; import "./Address.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./ECDSA.sol"; contract EveLifetimeNft is ERC721, Ownable { using Strings for uint256; using SafeMath for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIdTracker; mapping (uint256 => string) private _tokenURIs; address private constant KoalaMintDevAddress = 0xD17237307b93b104c50d6F83CF1e2dB99f7a348a; address private constant CreatorAddress = 0x407553f10725C4FBeCe73E52660D6135590f3d52; address private constant SignerAddress = 0x4AeA7b69ABb482e34BDd1D8C7A6B8dcA44F65775; string private baseURIextended; uint256 private constant min_price = 0 ether; uint256 private maxSupply = 2001; event KoalaMintMinted(uint256 indexed tokenId, address owner, address to, string tokenURI); event KoalaMintTransfered(address to, uint value); constructor(string memory _baseURIextended) ERC721("EVE LIFETIME NFT ", "EVENFT"){ baseURIextended = _baseURIextended; } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function revealCollection(string memory _baseURIextended) public onlyOwner { require(keccak256(bytes(baseURIextended)) != keccak256(bytes(_baseURIextended)), "Collection already revealed"); setBaseURI(_baseURIextended); } function setBaseURI(string memory _baseURIextended) private onlyOwner { baseURIextended = _baseURIextended; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function _baseURI() internal view virtual override returns (string memory) { return baseURIextended; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); return string(abi.encodePacked(base, _tokenURI)); } function signatureSignerMint(address _to, string memory _tokenURI, uint256 _timestamp, uint8 v, bytes32 r, bytes32 s) public view virtual returns (address){ return ECDSA.recover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encode(_to, _tokenURI, _timestamp)))), v, r, s); } function mint(address _to, string[] memory _tokensURI, uint256 _timestamp, uint8 v, bytes32 r, bytes32 s) public payable { require(msg.value >= min_price.mul(_tokensURI.length), "Value below price"); require(maxSupply >= _tokenIdTracker.current() + _tokensURI.length, "SoldOut"); require(_tokensURI.length > 0, "Minimum count"); address signerMint = signatureSignerMint(_to, _tokensURI[0], _timestamp, v, r, s); require(signerMint == SignerAddress, "Not authorized to mint"); require(_timestamp >= block.timestamp - 300, "Out of time"); for (uint8 i = 0; i < _tokensURI.length; i++){ _mintAnElement(_to, _tokensURI[i]); } uint256 _feeCreator = msg.value.mul(5).div(100); transfer(KoalaMintDevAddress, _feeCreator); transfer(CreatorAddress, msg.value - _feeCreator); } function _mintAnElement(address _to, string memory _tokenURI) private { uint256 _tokenId = _tokenIdTracker.current(); _tokenIdTracker.increment(); _tokenId = _tokenId + 1; _mint(_to, _tokenId); _setTokenURI(_tokenId, _tokenURI); emit KoalaMintMinted(_tokenId, CreatorAddress, _to, _tokenURI); } function transfer(address to, uint256 value) private { (bool success, ) = to.call{value: value}(""); require(success, "Transfer failed."); emit KoalaMintTransfered(to, value); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./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 name string private _name; // Token symbol string private _symbol; // 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. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "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); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = 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); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try 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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseURIextended","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"KoalaMintMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"KoalaMintTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string[]","name":"_tokensURI","type":"string[]"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURIextended","type":"string"}],"name":"revealCollection","outputs":[],"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":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"signatureSignerMint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526107d1600a553480156200001757600080fd5b50604051620025da380380620025da8339810160408190526200003a91620001dd565b6040805180820182526011815270022ab22902624a322aa24a6a29027232a1607d1b60208083019182528351808501909452600684526511559153919560d21b908401528151919291620000919160009162000137565b508051620000a790600190602084019062000137565b505050620000c4620000be620000e160201b60201c565b620000e5565b8051620000d990600990602084019062000137565b505062000306565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014590620002b3565b90600052602060002090601f016020900481019282620001695760008555620001b4565b82601f106200018457805160ff1916838001178555620001b4565b82800160010185558215620001b4579182015b82811115620001b457825182559160200191906001019062000197565b50620001c2929150620001c6565b5090565b5b80821115620001c25760008155600101620001c7565b60006020808385031215620001f0578182fd5b82516001600160401b038082111562000207578384fd5b818501915085601f8301126200021b578384fd5b815181811115620002305762000230620002f0565b604051601f8201601f19908116603f011681019083821181831017156200025b576200025b620002f0565b81604052828152888684870101111562000273578687fd5b8693505b8284101562000296578484018601518185018701529285019262000277565b82841115620002a757868684830101525b98975050505050505050565b600281046001821680620002c857607f821691505b60208210811415620002ea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6122c480620003166000396000f3fe60806040526004361061011f5760003560e01c806370a08231116100a0578063a22cb46511610064578063a22cb4651461030a578063b88d4fde1461032a578063c87b56dd1461034a578063e985e9c51461036a578063f2fde38b1461038a5761011f565b806370a082311461027e578063715018a6146102ab57806371ca8bd3146102c05780638da5cb5b146102e057806395d89b41146102f55761011f565b80633f288cb8116100e75780633f288cb8146101eb57806342842e0e146101fe57806350179bae1461021e5780636352211e1461023e5780636f8b44b01461025e5761011f565b806301ffc9a71461012457806306fdde031461015a578063081812fc1461017c578063095ea7b3146101a957806323b872dd146101cb575b600080fd5b34801561013057600080fd5b5061014461013f366004611867565b6103aa565b6040516101519190611ae7565b60405180910390f35b34801561016657600080fd5b5061016f6103f2565b6040516101519190611b10565b34801561018857600080fd5b5061019c6101973660046118d2565b610484565b6040516101519190611a14565b3480156101b557600080fd5b506101c96101c436600461183e565b6104ab565b005b3480156101d757600080fd5b506101c96101e6366004611615565b61054c565b6101c96101f93660046116c9565b610584565b34801561020a57600080fd5b506101c9610219366004611615565b610769565b34801561022a57600080fd5b506101c961023936600461189f565b610784565b34801561024a57600080fd5b5061019c6102593660046118d2565b6107d4565b34801561026a57600080fd5b506101c96102793660046118d2565b610809565b34801561028a57600080fd5b5061029e6102993660046115c9565b610816565b6040516101519190612111565b3480156102b757600080fd5b506101c961085a565b3480156102cc57600080fd5b5061019c6102db3660046117e0565b61086e565b3480156102ec57600080fd5b5061019c6108d7565b34801561030157600080fd5b5061016f6108e6565b34801561031657600080fd5b506101c96103253660046117a6565b6108f5565b34801561033657600080fd5b506101c9610345366004611650565b61090b565b34801561035657600080fd5b5061016f6103653660046118d2565b61094a565b34801561037657600080fd5b506101446103853660046115e3565b610a41565b34801561039657600080fd5b506101c96103a53660046115c9565b610a6f565b60006001600160e01b031982166380ac58cd60e01b14806103db57506001600160e01b03198216635b5e139f60e01b145b806103ea57506103ea82610aa6565b90505b919050565b606060008054610401906121f1565b80601f016020809104026020016040519081016040528092919081815260200182805461042d906121f1565b801561047a5780601f1061044f5761010080835404028352916020019161047a565b820191906000526020600020905b81548152906001019060200180831161045d57829003601f168201915b5050505050905090565b600061048f82610abf565b506000908152600460205260409020546001600160a01b031690565b60006104b6826107d4565b9050806001600160a01b0316836001600160a01b031614156104f35760405162461bcd60e51b81526004016104ea90611fd5565b60405180910390fd5b806001600160a01b0316610505610ae4565b6001600160a01b03161480610521575061052181610385610ae4565b61053d5760405162461bcd60e51b81526004016104ea90611e75565b6105478383610ae8565b505050565b61055d610557610ae4565b82610b56565b6105795760405162461bcd60e51b81526004016104ea9061209c565b610547838383610bb5565b845161059290600090610ce8565b3410156105b15760405162461bcd60e51b81526004016104ea90611f3c565b84516105bd6007610cfb565b6105c79190612157565b600a5410156105e85760405162461bcd60e51b81526004016104ea90611b5a565b60008551116106095760405162461bcd60e51b81526004016104ea906120ea565b6000610641878760008151811061063057634e487b7160e01b600052603260045260246000fd5b60200260200101518787878761086e565b90506001600160a01b038116734aea7b69abb482e34bdd1d8c7a6b8dca44f657751461067f5760405162461bcd60e51b81526004016104ea90611dba565b61068b61012c426121ae565b8510156106aa5760405162461bcd60e51b81526004016104ea9061204d565b60005b86518160ff1610156106ff576106ed88888360ff16815181106106e057634e487b7160e01b600052603260045260246000fd5b6020026020010151610cff565b806106f78161222c565b9150506106ad565b5060006107186064610712346005610ce8565b90610d8d565b905061073873d17237307b93b104c50d6f83cf1e2db99f7a348a82610d99565b61075f73407553f10725c4fbece73e52660d6135590f3d5261075a83346121ae565b610d99565b5050505050505050565b6105478383836040518060200160405280600081525061090b565b61078c610e53565b805160208201206040516107a290600990611916565b604051809103902014156107c85760405162461bcd60e51b81526004016104ea90612016565b6107d181610e92565b50565b6000818152600260205260408120546001600160a01b0316806103ea5760405162461bcd60e51b81526004016104ea90611f9e565b610811610e53565b600a55565b60006001600160a01b03821661083e5760405162461bcd60e51b81526004016104ea90611dea565b506001600160a01b031660009081526003602052604090205490565b610862610e53565b61086c6000610ead565b565b60006108cc87878760405160200161088893929190611a9a565b604051602081830303815290604052805190602001206040516020016108ae91906119e0565b60405160208183030381529060405280519060200120858585610eff565b979650505050505050565b6006546001600160a01b031690565b606060018054610401906121f1565b610907610900610ae4565b8383610f27565b5050565b61091c610916610ae4565b83610b56565b6109385760405162461bcd60e51b81526004016104ea9061209c565b61094484848484610fca565b50505050565b606061095582610ffd565b6109715760405162461bcd60e51b81526004016104ea90611bb2565b6000828152600860205260408120805461098a906121f1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b6906121f1565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b505050505090506000610a1461101a565b90508082604051602001610a299291906119b1565b60405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a77610e53565b6001600160a01b038116610a9d5760405162461bcd60e51b81526004016104ea90611c3b565b6107d181610ead565b6001600160e01b031981166301ffc9a760e01b14919050565b610ac881610ffd565b6107d15760405162461bcd60e51b81526004016104ea90611f9e565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b1d826107d4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b62836107d4565b9050806001600160a01b0316846001600160a01b03161480610b895750610b898185610a41565b80610bad5750836001600160a01b0316610ba284610484565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bc8826107d4565b6001600160a01b031614610bee5760405162461bcd60e51b81526004016104ea90611c81565b6001600160a01b038216610c145760405162461bcd60e51b81526004016104ea90611cfd565b610c1f838383610547565b610c2a600082610ae8565b6001600160a01b0383166000908152600360205260408120805460019290610c539084906121ae565b90915550506001600160a01b0382166000908152600360205260408120805460019290610c81908490612157565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610547838383610547565b6000610cf4828461218f565b9392505050565b5490565b6000610d0b6007610cfb565b9050610d176007611029565b610d22816001612157565b9050610d2e8382611032565b610d388183611119565b807f22f159d78f3070bdaa3a1b6adf066ff0bb90c4c161fb27506307e6af06e18dfa73407553f10725c4fbece73e52660d6135590f3d528585604051610d8093929190611a28565b60405180910390a2505050565b6000610cf4828461216f565b6000826001600160a01b031682604051610db290611a11565b60006040518083038185875af1925050503d8060008114610def576040519150601f19603f3d011682016040523d82523d6000602084013e610df4565b606091505b5050905080610e155760405162461bcd60e51b81526004016104ea90612072565b7fcd90c098a9e93a26c6962609f457d04072f9e433f1e3bfb275e5c54d4398e79c8383604051610e46929190611ace565b60405180910390a1505050565b610e5b610ae4565b6001600160a01b0316610e6c6108d7565b6001600160a01b03161461086c5760405162461bcd60e51b81526004016104ea90611f07565b610e9a610e53565b8051610907906009906020840190611491565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806000610f108787878761115d565b91509150610f1d8161123d565b5095945050505050565b816001600160a01b0316836001600160a01b03161415610f595760405162461bcd60e51b81526004016104ea90611d41565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610fbd908590611ae7565b60405180910390a3505050565b610fd5848484610bb5565b610fe18484848461136a565b6109445760405162461bcd60e51b81526004016104ea90611be9565b6000908152600260205260409020546001600160a01b0316151590565b606060098054610401906121f1565b80546001019055565b6001600160a01b0382166110585760405162461bcd60e51b81526004016104ea90611ed2565b61106181610ffd565b1561107e5760405162461bcd60e51b81526004016104ea90611cc6565b61108a60008383610547565b6001600160a01b03821660009081526003602052604081208054600192906110b3908490612157565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461090760008383610547565b61112282610ffd565b61113e5760405162461bcd60e51b81526004016104ea90611f67565b6000828152600860209081526040909120825161054792840190611491565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111945750600090506003611234565b8460ff16601b141580156111ac57508460ff16601c14155b156111bd5750600090506004611234565b6000600187878787604051600081526020016040526040516111e29493929190611af2565b6020604051602081039080840390855afa158015611204573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661122d57600060019250925050611234565b9150600090505b94509492505050565b600081600481111561125f57634e487b7160e01b600052602160045260246000fd5b141561126a576107d1565b600181600481111561128c57634e487b7160e01b600052602160045260246000fd5b14156112aa5760405162461bcd60e51b81526004016104ea90611b23565b60028160048111156112cc57634e487b7160e01b600052602160045260246000fd5b14156112ea5760405162461bcd60e51b81526004016104ea90611b7b565b600381600481111561130c57634e487b7160e01b600052602160045260246000fd5b141561132a5760405162461bcd60e51b81526004016104ea90611d78565b600481600481111561134c57634e487b7160e01b600052602160045260246000fd5b14156107d15760405162461bcd60e51b81526004016104ea90611e33565b600061137e846001600160a01b0316611482565b1561147a57836001600160a01b031663150b7a0261139a610ae4565b8786866040518563ffffffff1660e01b81526004016113bc9493929190611a5d565b602060405180830381600087803b1580156113d657600080fd5b505af1925050508015611406575060408051601f3d908101601f1916820190925261140391810190611883565b60015b611460573d808015611434576040519150601f19603f3d011682016040523d82523d6000602084013e611439565b606091505b5080516114585760405162461bcd60e51b81526004016104ea90611be9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bad565b506001610bad565b6001600160a01b03163b151590565b82805461149d906121f1565b90600052602060002090601f0160209004810192826114bf5760008555611505565b82601f106114d857805160ff1916838001178555611505565b82800160010185558215611505579182015b828111156115055782518255916020019190600101906114ea565b50611511929150611515565b5090565b5b808211156115115760008155600101611516565b600067ffffffffffffffff83111561154457611544612262565b611557601f8401601f191660200161211a565b905082815283838301111561156b57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146103ed57600080fd5b600082601f8301126115a9578081fd5b610cf48383356020850161152a565b803560ff811681146103ed57600080fd5b6000602082840312156115da578081fd5b610cf482611582565b600080604083850312156115f5578081fd5b6115fe83611582565b915061160c60208401611582565b90509250929050565b600080600060608486031215611629578081fd5b61163284611582565b925061164060208501611582565b9150604084013590509250925092565b60008060008060808587031215611665578081fd5b61166e85611582565b935061167c60208601611582565b925060408501359150606085013567ffffffffffffffff81111561169e578182fd5b8501601f810187136116ae578182fd5b6116bd8782356020840161152a565b91505092959194509250565b60008060008060008060c087890312156116e1578182fd5b6116ea87611582565b955060208088013567ffffffffffffffff80821115611707578485fd5b818a0191508a601f83011261171a578485fd5b81358181111561172c5761172c612262565b611739848583020161211a565b8181528481019250838501875b8381101561176f5761175d8f888435890101611599565b85529386019390860190600101611746565b505080995050505050506040870135935061178c606088016115b8565b92506080870135915060a087013590509295509295509295565b600080604083850312156117b8578182fd5b6117c183611582565b9150602083013580151581146117d5578182fd5b809150509250929050565b60008060008060008060c087890312156117f8578182fd5b61180187611582565b9550602087013567ffffffffffffffff81111561181c578283fd5b61182889828a01611599565b9550506040870135935061178c606088016115b8565b60008060408385031215611850578081fd5b61185983611582565b946020939093013593505050565b600060208284031215611878578081fd5b8135610cf481612278565b600060208284031215611894578081fd5b8151610cf481612278565b6000602082840312156118b0578081fd5b813567ffffffffffffffff8111156118c6578182fd5b610bad84828501611599565b6000602082840312156118e3578081fd5b5035919050565b600081518084526119028160208601602086016121c5565b601f01601f19169290920160200192915050565b815460009081906002810460018083168061193257607f831692505b602080841082141561195257634e487b7160e01b87526022600452602487fd5b8180156119665760018114611977576119a3565b60ff198616895284890196506119a3565b6119808a61214b565b885b8681101561199b5781548b820152908501908301611982565b505084890196505b509498975050505050505050565b600083516119c38184602088016121c5565b8351908301906119d78183602088016121c5565b01949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090611a54908301846118ea565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a90908301846118ea565b9695505050505050565b6001600160a01b0384168152606060208201819052600090611abe908301856118ea565b9050826040830152949350505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610cf460208301846118ea565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526007908201526614dbdb1913dd5d60ca1b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b602080825260169082015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b604082015260600190565b60208082526029908201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616040820152683634b21037bbb732b960b91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252603e908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60408201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527056616c75652062656c6f7720707269636560781b604082015260600190565b6020808252601c908201527f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000604082015260600190565b60208082526018908201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601b908201527f436f6c6c656374696f6e20616c72656164792072657665616c65640000000000604082015260600190565b6020808252600b908201526a4f7574206f662074696d6560a81b604082015260600190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252600d908201526c135a5b9a5b5d5b4818dbdd5b9d609a1b604082015260600190565b90815260200190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561214357612143612262565b604052919050565b60009081526020902090565b6000821982111561216a5761216a61224c565b500190565b60008261218a57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156121a9576121a961224c565b500290565b6000828210156121c0576121c061224c565b500390565b60005b838110156121e05781810151838201526020016121c8565b838111156109445750506000910152565b60028104600182168061220557607f821691505b6020821081141561222657634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff8114156122435761224361224c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107d157600080fdfea2646970667358221220dc79a96608e237bd93b45b12a56f6569f038ba0cf3e2337d72b12b190f2193b364736f6c634300080100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005b68747470733a2f2f6170692e6b6f616c616d696e742e636f6d2f616437373665346435363235623934333861613533386166373264636365623534303332646133653437333263353631663962626631303832653533653836642f0000000000
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806370a08231116100a0578063a22cb46511610064578063a22cb4651461030a578063b88d4fde1461032a578063c87b56dd1461034a578063e985e9c51461036a578063f2fde38b1461038a5761011f565b806370a082311461027e578063715018a6146102ab57806371ca8bd3146102c05780638da5cb5b146102e057806395d89b41146102f55761011f565b80633f288cb8116100e75780633f288cb8146101eb57806342842e0e146101fe57806350179bae1461021e5780636352211e1461023e5780636f8b44b01461025e5761011f565b806301ffc9a71461012457806306fdde031461015a578063081812fc1461017c578063095ea7b3146101a957806323b872dd146101cb575b600080fd5b34801561013057600080fd5b5061014461013f366004611867565b6103aa565b6040516101519190611ae7565b60405180910390f35b34801561016657600080fd5b5061016f6103f2565b6040516101519190611b10565b34801561018857600080fd5b5061019c6101973660046118d2565b610484565b6040516101519190611a14565b3480156101b557600080fd5b506101c96101c436600461183e565b6104ab565b005b3480156101d757600080fd5b506101c96101e6366004611615565b61054c565b6101c96101f93660046116c9565b610584565b34801561020a57600080fd5b506101c9610219366004611615565b610769565b34801561022a57600080fd5b506101c961023936600461189f565b610784565b34801561024a57600080fd5b5061019c6102593660046118d2565b6107d4565b34801561026a57600080fd5b506101c96102793660046118d2565b610809565b34801561028a57600080fd5b5061029e6102993660046115c9565b610816565b6040516101519190612111565b3480156102b757600080fd5b506101c961085a565b3480156102cc57600080fd5b5061019c6102db3660046117e0565b61086e565b3480156102ec57600080fd5b5061019c6108d7565b34801561030157600080fd5b5061016f6108e6565b34801561031657600080fd5b506101c96103253660046117a6565b6108f5565b34801561033657600080fd5b506101c9610345366004611650565b61090b565b34801561035657600080fd5b5061016f6103653660046118d2565b61094a565b34801561037657600080fd5b506101446103853660046115e3565b610a41565b34801561039657600080fd5b506101c96103a53660046115c9565b610a6f565b60006001600160e01b031982166380ac58cd60e01b14806103db57506001600160e01b03198216635b5e139f60e01b145b806103ea57506103ea82610aa6565b90505b919050565b606060008054610401906121f1565b80601f016020809104026020016040519081016040528092919081815260200182805461042d906121f1565b801561047a5780601f1061044f5761010080835404028352916020019161047a565b820191906000526020600020905b81548152906001019060200180831161045d57829003601f168201915b5050505050905090565b600061048f82610abf565b506000908152600460205260409020546001600160a01b031690565b60006104b6826107d4565b9050806001600160a01b0316836001600160a01b031614156104f35760405162461bcd60e51b81526004016104ea90611fd5565b60405180910390fd5b806001600160a01b0316610505610ae4565b6001600160a01b03161480610521575061052181610385610ae4565b61053d5760405162461bcd60e51b81526004016104ea90611e75565b6105478383610ae8565b505050565b61055d610557610ae4565b82610b56565b6105795760405162461bcd60e51b81526004016104ea9061209c565b610547838383610bb5565b845161059290600090610ce8565b3410156105b15760405162461bcd60e51b81526004016104ea90611f3c565b84516105bd6007610cfb565b6105c79190612157565b600a5410156105e85760405162461bcd60e51b81526004016104ea90611b5a565b60008551116106095760405162461bcd60e51b81526004016104ea906120ea565b6000610641878760008151811061063057634e487b7160e01b600052603260045260246000fd5b60200260200101518787878761086e565b90506001600160a01b038116734aea7b69abb482e34bdd1d8c7a6b8dca44f657751461067f5760405162461bcd60e51b81526004016104ea90611dba565b61068b61012c426121ae565b8510156106aa5760405162461bcd60e51b81526004016104ea9061204d565b60005b86518160ff1610156106ff576106ed88888360ff16815181106106e057634e487b7160e01b600052603260045260246000fd5b6020026020010151610cff565b806106f78161222c565b9150506106ad565b5060006107186064610712346005610ce8565b90610d8d565b905061073873d17237307b93b104c50d6f83cf1e2db99f7a348a82610d99565b61075f73407553f10725c4fbece73e52660d6135590f3d5261075a83346121ae565b610d99565b5050505050505050565b6105478383836040518060200160405280600081525061090b565b61078c610e53565b805160208201206040516107a290600990611916565b604051809103902014156107c85760405162461bcd60e51b81526004016104ea90612016565b6107d181610e92565b50565b6000818152600260205260408120546001600160a01b0316806103ea5760405162461bcd60e51b81526004016104ea90611f9e565b610811610e53565b600a55565b60006001600160a01b03821661083e5760405162461bcd60e51b81526004016104ea90611dea565b506001600160a01b031660009081526003602052604090205490565b610862610e53565b61086c6000610ead565b565b60006108cc87878760405160200161088893929190611a9a565b604051602081830303815290604052805190602001206040516020016108ae91906119e0565b60405160208183030381529060405280519060200120858585610eff565b979650505050505050565b6006546001600160a01b031690565b606060018054610401906121f1565b610907610900610ae4565b8383610f27565b5050565b61091c610916610ae4565b83610b56565b6109385760405162461bcd60e51b81526004016104ea9061209c565b61094484848484610fca565b50505050565b606061095582610ffd565b6109715760405162461bcd60e51b81526004016104ea90611bb2565b6000828152600860205260408120805461098a906121f1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b6906121f1565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b505050505090506000610a1461101a565b90508082604051602001610a299291906119b1565b60405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a77610e53565b6001600160a01b038116610a9d5760405162461bcd60e51b81526004016104ea90611c3b565b6107d181610ead565b6001600160e01b031981166301ffc9a760e01b14919050565b610ac881610ffd565b6107d15760405162461bcd60e51b81526004016104ea90611f9e565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b1d826107d4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b62836107d4565b9050806001600160a01b0316846001600160a01b03161480610b895750610b898185610a41565b80610bad5750836001600160a01b0316610ba284610484565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bc8826107d4565b6001600160a01b031614610bee5760405162461bcd60e51b81526004016104ea90611c81565b6001600160a01b038216610c145760405162461bcd60e51b81526004016104ea90611cfd565b610c1f838383610547565b610c2a600082610ae8565b6001600160a01b0383166000908152600360205260408120805460019290610c539084906121ae565b90915550506001600160a01b0382166000908152600360205260408120805460019290610c81908490612157565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610547838383610547565b6000610cf4828461218f565b9392505050565b5490565b6000610d0b6007610cfb565b9050610d176007611029565b610d22816001612157565b9050610d2e8382611032565b610d388183611119565b807f22f159d78f3070bdaa3a1b6adf066ff0bb90c4c161fb27506307e6af06e18dfa73407553f10725c4fbece73e52660d6135590f3d528585604051610d8093929190611a28565b60405180910390a2505050565b6000610cf4828461216f565b6000826001600160a01b031682604051610db290611a11565b60006040518083038185875af1925050503d8060008114610def576040519150601f19603f3d011682016040523d82523d6000602084013e610df4565b606091505b5050905080610e155760405162461bcd60e51b81526004016104ea90612072565b7fcd90c098a9e93a26c6962609f457d04072f9e433f1e3bfb275e5c54d4398e79c8383604051610e46929190611ace565b60405180910390a1505050565b610e5b610ae4565b6001600160a01b0316610e6c6108d7565b6001600160a01b03161461086c5760405162461bcd60e51b81526004016104ea90611f07565b610e9a610e53565b8051610907906009906020840190611491565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806000610f108787878761115d565b91509150610f1d8161123d565b5095945050505050565b816001600160a01b0316836001600160a01b03161415610f595760405162461bcd60e51b81526004016104ea90611d41565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610fbd908590611ae7565b60405180910390a3505050565b610fd5848484610bb5565b610fe18484848461136a565b6109445760405162461bcd60e51b81526004016104ea90611be9565b6000908152600260205260409020546001600160a01b0316151590565b606060098054610401906121f1565b80546001019055565b6001600160a01b0382166110585760405162461bcd60e51b81526004016104ea90611ed2565b61106181610ffd565b1561107e5760405162461bcd60e51b81526004016104ea90611cc6565b61108a60008383610547565b6001600160a01b03821660009081526003602052604081208054600192906110b3908490612157565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461090760008383610547565b61112282610ffd565b61113e5760405162461bcd60e51b81526004016104ea90611f67565b6000828152600860209081526040909120825161054792840190611491565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111945750600090506003611234565b8460ff16601b141580156111ac57508460ff16601c14155b156111bd5750600090506004611234565b6000600187878787604051600081526020016040526040516111e29493929190611af2565b6020604051602081039080840390855afa158015611204573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661122d57600060019250925050611234565b9150600090505b94509492505050565b600081600481111561125f57634e487b7160e01b600052602160045260246000fd5b141561126a576107d1565b600181600481111561128c57634e487b7160e01b600052602160045260246000fd5b14156112aa5760405162461bcd60e51b81526004016104ea90611b23565b60028160048111156112cc57634e487b7160e01b600052602160045260246000fd5b14156112ea5760405162461bcd60e51b81526004016104ea90611b7b565b600381600481111561130c57634e487b7160e01b600052602160045260246000fd5b141561132a5760405162461bcd60e51b81526004016104ea90611d78565b600481600481111561134c57634e487b7160e01b600052602160045260246000fd5b14156107d15760405162461bcd60e51b81526004016104ea90611e33565b600061137e846001600160a01b0316611482565b1561147a57836001600160a01b031663150b7a0261139a610ae4565b8786866040518563ffffffff1660e01b81526004016113bc9493929190611a5d565b602060405180830381600087803b1580156113d657600080fd5b505af1925050508015611406575060408051601f3d908101601f1916820190925261140391810190611883565b60015b611460573d808015611434576040519150601f19603f3d011682016040523d82523d6000602084013e611439565b606091505b5080516114585760405162461bcd60e51b81526004016104ea90611be9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bad565b506001610bad565b6001600160a01b03163b151590565b82805461149d906121f1565b90600052602060002090601f0160209004810192826114bf5760008555611505565b82601f106114d857805160ff1916838001178555611505565b82800160010185558215611505579182015b828111156115055782518255916020019190600101906114ea565b50611511929150611515565b5090565b5b808211156115115760008155600101611516565b600067ffffffffffffffff83111561154457611544612262565b611557601f8401601f191660200161211a565b905082815283838301111561156b57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146103ed57600080fd5b600082601f8301126115a9578081fd5b610cf48383356020850161152a565b803560ff811681146103ed57600080fd5b6000602082840312156115da578081fd5b610cf482611582565b600080604083850312156115f5578081fd5b6115fe83611582565b915061160c60208401611582565b90509250929050565b600080600060608486031215611629578081fd5b61163284611582565b925061164060208501611582565b9150604084013590509250925092565b60008060008060808587031215611665578081fd5b61166e85611582565b935061167c60208601611582565b925060408501359150606085013567ffffffffffffffff81111561169e578182fd5b8501601f810187136116ae578182fd5b6116bd8782356020840161152a565b91505092959194509250565b60008060008060008060c087890312156116e1578182fd5b6116ea87611582565b955060208088013567ffffffffffffffff80821115611707578485fd5b818a0191508a601f83011261171a578485fd5b81358181111561172c5761172c612262565b611739848583020161211a565b8181528481019250838501875b8381101561176f5761175d8f888435890101611599565b85529386019390860190600101611746565b505080995050505050506040870135935061178c606088016115b8565b92506080870135915060a087013590509295509295509295565b600080604083850312156117b8578182fd5b6117c183611582565b9150602083013580151581146117d5578182fd5b809150509250929050565b60008060008060008060c087890312156117f8578182fd5b61180187611582565b9550602087013567ffffffffffffffff81111561181c578283fd5b61182889828a01611599565b9550506040870135935061178c606088016115b8565b60008060408385031215611850578081fd5b61185983611582565b946020939093013593505050565b600060208284031215611878578081fd5b8135610cf481612278565b600060208284031215611894578081fd5b8151610cf481612278565b6000602082840312156118b0578081fd5b813567ffffffffffffffff8111156118c6578182fd5b610bad84828501611599565b6000602082840312156118e3578081fd5b5035919050565b600081518084526119028160208601602086016121c5565b601f01601f19169290920160200192915050565b815460009081906002810460018083168061193257607f831692505b602080841082141561195257634e487b7160e01b87526022600452602487fd5b8180156119665760018114611977576119a3565b60ff198616895284890196506119a3565b6119808a61214b565b885b8681101561199b5781548b820152908501908301611982565b505084890196505b509498975050505050505050565b600083516119c38184602088016121c5565b8351908301906119d78183602088016121c5565b01949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090611a54908301846118ea565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a90908301846118ea565b9695505050505050565b6001600160a01b0384168152606060208201819052600090611abe908301856118ea565b9050826040830152949350505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610cf460208301846118ea565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526007908201526614dbdb1913dd5d60ca1b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b602080825260169082015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b604082015260600190565b60208082526029908201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616040820152683634b21037bbb732b960b91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252603e908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60408201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527056616c75652062656c6f7720707269636560781b604082015260600190565b6020808252601c908201527f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000604082015260600190565b60208082526018908201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601b908201527f436f6c6c656374696f6e20616c72656164792072657665616c65640000000000604082015260600190565b6020808252600b908201526a4f7574206f662074696d6560a81b604082015260600190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252600d908201526c135a5b9a5b5d5b4818dbdd5b9d609a1b604082015260600190565b90815260200190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561214357612143612262565b604052919050565b60009081526020902090565b6000821982111561216a5761216a61224c565b500190565b60008261218a57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156121a9576121a961224c565b500290565b6000828210156121c0576121c061224c565b500390565b60005b838110156121e05781810151838201526020016121c8565b838111156109445750506000910152565b60028104600182168061220557607f821691505b6020821081141561222657634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff8114156122435761224361224c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107d157600080fdfea2646970667358221220dc79a96608e237bd93b45b12a56f6569f038ba0cf3e2337d72b12b190f2193b364736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005b68747470733a2f2f6170692e6b6f616c616d696e742e636f6d2f616437373665346435363235623934333861613533386166373264636365623534303332646133653437333263353631663962626631303832653533653836642f0000000000
-----Decoded View---------------
Arg [0] : _baseURIextended (string): https://api.koalamint.com/ad776e4d5625b9438aa538af72dcceb54032da3e4732c561f9bbf1082e53e86d/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000005b
Arg [2] : 68747470733a2f2f6170692e6b6f616c616d696e742e636f6d2f616437373665
Arg [3] : 3464353632356239343338616135333861663732646363656235343033326461
Arg [4] : 33653437333263353631663962626631303832653533653836642f0000000000
Deployed Bytecode Sourcemap
272:3872:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1505:300:5;;;;;;;;;;-1:-1:-1;1505:300:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2405:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3870:167::-;;;;;;;;;;-1:-1:-1;3870:167:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3402:407::-;;;;;;;;;;-1:-1:-1;3402:407:5;;;;;:::i;:::-;;:::i;:::-;;4547:327;;;;;;;;;;-1:-1:-1;4547:327:5;;;;;:::i;:::-;;:::i;2685:884:6:-;;;;;;:::i;:::-;;:::i;4940:179:5:-;;;;;;;;;;-1:-1:-1;4940:179:5;;;;;:::i;:::-;;:::i;1429:241:6:-;;;;;;;;;;-1:-1:-1;1429:241:6;;;;;:::i;:::-;;:::i;2125:218:5:-;;;;;;;;;;-1:-1:-1;2125:218:5;;;;;:::i;:::-;;:::i;1803:98:6:-;;;;;;;;;;-1:-1:-1;1803:98:6;;;;;:::i;:::-;;:::i;1864:204:5:-;;;;;;;;;;-1:-1:-1;1864:204:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1824:101:11:-;;;;;;;;;;;;;:::i;2362:317:6:-;;;;;;;;;;-1:-1:-1;2362:317:6;;;;;:::i;:::-;;:::i;1194:85:11:-;;;;;;;;;;;;;:::i;2567:102:5:-;;;;;;;;;;;;;:::i;4104:153::-;;;;;;;;;;-1:-1:-1;4104:153:5;;;;;:::i;:::-;;:::i;5185:315::-;;;;;;;;;;-1:-1:-1;5185:315:5;;;;;:::i;:::-;;:::i;2035:321:6:-;;;;;;;;;;-1:-1:-1;2035:321:6;;;;;:::i;:::-;;:::i;4323:162:5:-;;;;;;;;;;-1:-1:-1;4323:162:5;;;;;:::i;:::-;;:::i;2074:198:11:-;;;;;;;;;;-1:-1:-1;2074:198:11;;;;;:::i;:::-;;:::i;1505:300:5:-;1607:4;-1:-1:-1;;;;;;1642:40:5;;-1:-1:-1;;;1642:40:5;;:104;;-1:-1:-1;;;;;;;1698:48:5;;-1:-1:-1;;;1698:48:5;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1623:175;;1505:300;;;;:::o;2405:98::-;2459:13;2491:5;2484:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2405:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;-1:-1:-1;4006:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4006:24:5;;3870:167::o;3402:407::-;3482:13;3498:23;3513:7;3498:14;:23::i;:::-;3482:39;;3545:5;-1:-1:-1;;;;;3539:11:5;:2;-1:-1:-1;;;;;3539:11:5;;;3531:57;;;;-1:-1:-1;;;3531:57:5;;;;;;;:::i;:::-;;;;;;;;;3636:5;-1:-1:-1;;;;;3620:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3620:21:5;;:62;;;;3645:37;3662:5;3669:12;:10;:12::i;3645:37::-;3599:171;;;;-1:-1:-1;;;3599:171:5;;;;;;;:::i;:::-;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3402:407;;;:::o;4547:327::-;4736:41;4755:12;:10;:12::i;:::-;4769:7;4736:18;:41::i;:::-;4728:100;;;;-1:-1:-1;;;4728:100:5;;;;;;;:::i;:::-;4839:28;4849:4;4855:2;4859:7;4839:9;:28::i;2685:884:6:-;2851:17;;2837:32;;877:7;;2837:13;:32::i;:::-;2824:9;:45;;2816:75;;;;-1:-1:-1;;;2816:75:6;;;;;;;:::i;:::-;2950:10;:17;2922:25;:15;:23;:25::i;:::-;:45;;;;:::i;:::-;2909:9;;:58;;2901:78;;;;-1:-1:-1;;;2901:78:6;;;;;;;:::i;:::-;3017:1;2997:10;:17;:21;2989:47;;;;-1:-1:-1;;;2989:47:6;;;;;;;:::i;:::-;3047:18;3068:60;3088:3;3093:10;3104:1;3093:13;;;;;;-1:-1:-1;;;3093:13:6;;;;;;;;;;;;;;;3108:10;3120:1;3123;3126;3068:19;:60::i;:::-;3047:81;-1:-1:-1;;;;;;3146:27:6;;755:42;3146:27;3138:62;;;;-1:-1:-1;;;3138:62:6;;;;;;;:::i;:::-;3233:21;3251:3;3233:15;:21;:::i;:::-;3219:10;:35;;3211:59;;;;-1:-1:-1;;;3211:59:6;;;;;;;:::i;:::-;3286:7;3281:104;3303:10;:17;3299:1;:21;;;3281:104;;;3340:34;3355:3;3360:10;3371:1;3360:13;;;;;;;;-1:-1:-1;;;3360:13:6;;;;;;;;;;;;;;;3340:14;:34::i;:::-;3322:3;;;;:::i;:::-;;;;3281:104;;;-1:-1:-1;3403:19:6;3425:25;3446:3;3425:16;:9;3439:1;3425:13;:16::i;:::-;:20;;:25::i;:::-;3403:47;;3461:42;576;3491:11;3461:8;:42::i;:::-;3513:49;666:42;3538:23;3550:11;3538:9;:23;:::i;:::-;3513:8;:49::i;:::-;2685:884;;;;;;;;:::o;4940:179:5:-;5073:39;5090:4;5096:2;5100:7;5073:39;;;;;;;;;;;;:16;:39::i;1429:241:6:-;1087:13:11;:11;:13::i;:::-;1559:34:6;;::::1;::::0;::::1;::::0;1522:33:::1;::::0;::::1;::::0;1538:15:::1;::::0;1522:33:::1;:::i;:::-;;;;;;;;:71;;1514:111;;;;-1:-1:-1::0;;;1514:111:6::1;;;;;;;:::i;:::-;1635:28;1646:16;1635:10;:28::i;:::-;1429:241:::0;:::o;2125:218:5:-;2197:7;2232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2232:16:5;2266:19;2258:56;;;;-1:-1:-1;;;2258:56:5;;;;;;;:::i;1803:98:6:-;1087:13:11;:11;:13::i;:::-;1872:9:6::1;:22:::0;1803:98::o;1864:204:5:-;1936:7;-1:-1:-1;;;;;1963:19:5;;1955:73;;;;-1:-1:-1;;;1955:73:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2045:16:5;;;;;:9;:16;;;;;;;1864:204::o;1824:101:11:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2362:317:6:-;2509:7;2534:138;2632:3;2637:9;2648:10;2621:38;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2611:49;;;;;;2558:103;;;;;;;;:::i;:::-;;;;;;;;;;;;;2548:114;;;;;;2664:1;2667;2670;2534:13;:138::i;:::-;2527:145;2362:317;-1:-1:-1;;;;;;;2362:317:6:o;1194:85:11:-;1266:6;;-1:-1:-1;;;;;1266:6:11;1194:85;:::o;2567:102:5:-;2623:13;2655:7;2648:14;;;;;:::i;4104:153::-;4198:52;4217:12;:10;:12::i;:::-;4231:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;5185:315::-;5353:41;5372:12;:10;:12::i;:::-;5386:7;5353:18;:41::i;:::-;5345:100;;;;-1:-1:-1;;;5345:100:5;;;;;;;:::i;:::-;5455:38;5469:4;5475:2;5479:7;5488:4;5455:13;:38::i;:::-;5185:315;;;;:::o;2035:321:6:-;2108:13;2141:16;2149:7;2141;:16::i;:::-;2133:60;;;;-1:-1:-1;;;2133:60:6;;;;;;;:::i;:::-;2204:23;2230:19;;;:10;:19;;;;;2204:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2259:18;2280:10;:8;:10::i;:::-;2259:31;;2332:4;2338:9;2315:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2301:48;;;;2035:321;;;:::o;4323:162:5:-;-1:-1:-1;;;;;4443:25:5;;;4420:4;4443:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4323:162::o;2074:198:11:-;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:11;::::1;2154:73;;;;-1:-1:-1::0;;;2154:73:11::1;;;;;;;:::i;:::-;2237:28;2256:8;2237:18;:28::i;829:155:4:-:0;-1:-1:-1;;;;;;937:40:4;;-1:-1:-1;;;937:40:4;829:155;;;:::o;11592:133:5:-;11673:16;11681:7;11673;:16::i;:::-;11665:53;;;;-1:-1:-1;;;11665:53:5;;;;;;;:::i;640:96:1:-;719:10;640:96;:::o;10894:171:5:-;10968:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10968:29:5;-1:-1:-1;;;;;10968:29:5;;;;;;;;:24;;11021:23;10968:24;11021:14;:23::i;:::-;-1:-1:-1;;;;;11012:46:5;;;;;;;;;;;10894:171;;:::o;7252:261::-;7345:4;7361:13;7377:23;7392:7;7377:14;:23::i;:::-;7361:39;;7429:5;-1:-1:-1;;;;;7418:16:5;:7;-1:-1:-1;;;;;7418:16:5;;:52;;;;7438:32;7455:5;7462:7;7438:16;:32::i;:::-;7418:87;;;;7498:7;-1:-1:-1;;;;;7474:31:5;:20;7486:7;7474:11;:20::i;:::-;-1:-1:-1;;;;;7474:31:5;;7418:87;7410:96;7252:261;-1:-1:-1;;;;7252:261:5:o;10177:605::-;10331:4;-1:-1:-1;;;;;10304:31:5;:23;10319:7;10304:14;:23::i;:::-;-1:-1:-1;;;;;10304:31:5;;10296:81;;;;-1:-1:-1;;;10296:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;10395:16:5;;10387:65;;;;-1:-1:-1;;;10387:65:5;;;;;;;:::i;:::-;10463:39;10484:4;10490:2;10494:7;10463:20;:39::i;:::-;10564:29;10581:1;10585:7;10564:8;:29::i;:::-;-1:-1:-1;;;;;10604:15:5;;;;;;:9;:15;;;;;:20;;10623:1;;10604:15;:20;;10623:1;;10604:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10634:13:5;;;;;;:9;:13;;;;;:18;;10651:1;;10634:13;:18;;10651:1;;10634:18;:::i;:::-;;;;-1:-1:-1;;10662:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10662:21:5;-1:-1:-1;;;;;10662:21:5;;;;;;;;;10699:27;;10662:16;;10699:27;;;;;;;10737:38;10757:4;10763:2;10767:7;10737:19;:38::i;3465:96:12:-;3523:7;3549:5;3553:1;3549;:5;:::i;:::-;3542:12;3465:96;-1:-1:-1;;;3465:96:12:o;827:112:2:-;918:14;;827:112::o;3575:356:6:-;3655:16;3674:25;:15;:23;:25::i;:::-;3655:44;;3718:27;:15;:25;:27::i;:::-;3766:12;:8;3777:1;3766:12;:::i;:::-;3755:23;;3788:20;3794:3;3799:8;3788:5;:20::i;:::-;3818:33;3831:8;3841:9;3818:12;:33::i;:::-;3883:8;3867:57;666:42;3909:3;3914:9;3867:57;;;;;;;;:::i;:::-;;;;;;;;3575:356;;;:::o;3850:96:12:-;3908:7;3934:5;3938:1;3934;:5;:::i;3937:205:6:-;4001:12;4019:2;-1:-1:-1;;;;;4019:7:6;4034:5;4019:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4000:44;;;4062:7;4054:36;;;;-1:-1:-1;;;4054:36:6;;;;;;;:::i;:::-;4105:30;4125:2;4129:5;4105:30;;;;;;;:::i;:::-;;;;;;;;3937:205;;;:::o;1352:130:11:-;1426:12;:10;:12::i;:::-;-1:-1:-1;;;;;1415:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1415:23:11;;1407:68;;;;-1:-1:-1;;;1407:68:11;;;;;;;:::i;1676:121:6:-;1087:13:11;:11;:13::i;:::-;1756:34:6;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;2426:187:11:-:0;2518:6;;;-1:-1:-1;;;;;2534:17:11;;;-1:-1:-1;;;;;;2534:17:11;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2426:187;;:::o;7545:270:3:-;7668:7;7688:17;7707:18;7729:25;7740:4;7746:1;7749;7752;7729:10;:25::i;:::-;7687:67;;;;7764:18;7776:5;7764:11;:18::i;:::-;-1:-1:-1;7799:9:3;7545:270;-1:-1:-1;;;;;7545:270:3:o;11201:307:5:-;11351:8;-1:-1:-1;;;;;11342:17:5;:5;-1:-1:-1;;;;;11342:17:5;;;11334:55;;;;-1:-1:-1;;;11334:55:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;11399:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;11399:46:5;;;;;;;11460:41;;;;;11399:46;;11460:41;:::i;:::-;;;;;;;;11201:307;;;:::o;6361:305::-;6511:28;6521:4;6527:2;6531:7;6511:9;:28::i;:::-;6557:47;6580:4;6586:2;6590:7;6599:4;6557:22;:47::i;:::-;6549:110;;;;-1:-1:-1;;;6549:110:5;;;;;;;:::i;6969:125::-;7034:4;7057:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7057:16:5;:30;;;6969:125::o;1911:114:6:-;1971:13;2003:15;1996:22;;;;;:::i;945:123:2:-;1032:19;;1050:1;1032:19;;;945:123::o;8803:427:5:-;-1:-1:-1;;;;;8882:16:5;;8874:61;;;;-1:-1:-1;;;8874:61:5;;;;;;;:::i;:::-;8954:16;8962:7;8954;:16::i;:::-;8953:17;8945:58;;;;-1:-1:-1;;;8945:58:5;;;;;;;:::i;:::-;9014:45;9043:1;9047:2;9051:7;9014:20;:45::i;:::-;-1:-1:-1;;;;;9070:13:5;;;;;;:9;:13;;;;;:18;;9087:1;;9070:13;:18;;9087:1;;9070:18;:::i;:::-;;;;-1:-1:-1;;9098:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9098:21:5;-1:-1:-1;;;;;9098:21:5;;;;;;;;9135:33;;9098:16;;;9135:33;;9098:16;;9135:33;9179:44;9207:1;9211:2;9215:7;9179:19;:44::i;1223:196:6:-;1322:16;1330:7;1322;:16::i;:::-;1314:57;;;;-1:-1:-1;;;1314:57:6;;;;;;;:::i;:::-;1381:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;5809:1603:3:-;5935:7;;6859:66;6846:79;;6842:161;;;-1:-1:-1;6957:1:3;;-1:-1:-1;6961:30:3;6941:51;;6842:161;7016:1;:7;;7021:2;7016:7;;:18;;;;;7027:1;:7;;7032:2;7027:7;;7016:18;7012:100;;;-1:-1:-1;7066:1:3;;-1:-1:-1;7070:30:3;7050:51;;7012:100;7206:14;7223:24;7233:4;7239:1;7242;7245;7223:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7223:24:3;;-1:-1:-1;;7223:24:3;;;-1:-1:-1;;;;;;;7261:20:3;;7257:101;;7313:1;7317:29;7297:50;;;;;;;7257:101;7376:6;-1:-1:-1;7384:20:3;;-1:-1:-1;5809:1603:3;;;;;;;;:::o;547:631::-;624:20;615:5;:29;;;;;;-1:-1:-1;;;615:29:3;;;;;;;;;;611:561;;;660:7;;611:561;720:29;711:5;:38;;;;;;-1:-1:-1;;;711:38:3;;;;;;;;;;707:465;;;765:34;;-1:-1:-1;;;765:34:3;;;;;;;:::i;707:465::-;829:35;820:5;:44;;;;;;-1:-1:-1;;;820:44:3;;;;;;;;;;816:356;;;880:41;;-1:-1:-1;;;880:41:3;;;;;;;:::i;816:356::-;951:30;942:5;:39;;;;;;-1:-1:-1;;;942:39:3;;;;;;;;;;938:234;;;997:44;;-1:-1:-1;;;997:44:3;;;;;;;:::i;938:234::-;1071:30;1062:5;:39;;;;;;-1:-1:-1;;;1062:39:3;;;;;;;;;;1058:114;;;1117:44;;-1:-1:-1;;;1117:44:3;;;;;;;:::i;12277:831:5:-;12426:4;12446:15;:2;-1:-1:-1;;;;;12446:13:5;;:15::i;:::-;12442:660;;;12497:2;-1:-1:-1;;;;;12481:36:5;;12518:12;:10;:12::i;:::-;12532:4;12538:7;12547:4;12481:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12481:71:5;;;;;;;;-1:-1:-1;;12481:71:5;;;;;;;;;;;;:::i;:::-;;;12477:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12719:13:5;;12715:321;;12761:60;;-1:-1:-1;;;12761:60:5;;;;;;;:::i;12715:321::-;12988:6;12982:13;12973:6;12969:2;12965:15;12958:38;12477:573;-1:-1:-1;;;;;;12602:51:5;-1:-1:-1;;;12602:51:5;;-1:-1:-1;12595:58:5;;12442:660;-1:-1:-1;13087:4:5;13080:11;;1175:320:0;-1:-1:-1;;;;;1465:19:0;;:23;;;1175:320::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:408:14;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:57;219:2;198:15;;-1:-1:-1;;194:29:14;225:4;190:40;174:57;:::i;:::-;165:66;;254:6;247:5;240:21;294:3;285:6;280:3;276:16;273:25;270:2;;;311:1;308;301:12;270:2;360:6;355:3;348:4;341:5;337:16;324:43;414:1;407:4;398:6;391:5;387:18;383:29;376:40;90:332;;;;;:::o;427:175::-;497:20;;-1:-1:-1;;;;;546:31:14;;536:42;;526:2;;592:1;589;582:12;607:233;;705:3;698:4;690:6;686:17;682:27;672:2;;727:5;720;713:20;672:2;753:81;830:3;821:6;808:20;801:4;793:6;789:17;753:81;:::i;845:158::-;913:20;;973:4;962:16;;952:27;;942:2;;993:1;990;983:12;1008:198;;1120:2;1108:9;1099:7;1095:23;1091:32;1088:2;;;1141:6;1133;1126:22;1088:2;1169:31;1190:9;1169:31;:::i;1211:274::-;;;1340:2;1328:9;1319:7;1315:23;1311:32;1308:2;;;1361:6;1353;1346:22;1308:2;1389:31;1410:9;1389:31;:::i;:::-;1379:41;;1439:40;1475:2;1464:9;1460:18;1439:40;:::i;:::-;1429:50;;1298:187;;;;;:::o;1490:342::-;;;;1636:2;1624:9;1615:7;1611:23;1607:32;1604:2;;;1657:6;1649;1642:22;1604:2;1685:31;1706:9;1685:31;:::i;:::-;1675:41;;1735:40;1771:2;1760:9;1756:18;1735:40;:::i;:::-;1725:50;;1822:2;1811:9;1807:18;1794:32;1784:42;;1594:238;;;;;:::o;1837:702::-;;;;;2009:3;1997:9;1988:7;1984:23;1980:33;1977:2;;;2031:6;2023;2016:22;1977:2;2059:31;2080:9;2059:31;:::i;:::-;2049:41;;2109:40;2145:2;2134:9;2130:18;2109:40;:::i;:::-;2099:50;;2196:2;2185:9;2181:18;2168:32;2158:42;;2251:2;2240:9;2236:18;2223:32;2278:18;2270:6;2267:30;2264:2;;;2315:6;2307;2300:22;2264:2;2343:22;;2396:4;2388:13;;2384:27;-1:-1:-1;2374:2:14;;2430:6;2422;2415:22;2374:2;2458:75;2525:7;2520:2;2507:16;2502:2;2498;2494:11;2458:75;:::i;:::-;2448:85;;;1967:572;;;;;;;:::o;2544:1323::-;;;;;;;2774:3;2762:9;2753:7;2749:23;2745:33;2742:2;;;2796:6;2788;2781:22;2742:2;2824:31;2845:9;2824:31;:::i;:::-;2814:41;;2874:2;2927;2916:9;2912:18;2899:32;2950:18;2991:2;2983:6;2980:14;2977:2;;;3012:6;3004;2997:22;2977:2;3055:6;3044:9;3040:22;3030:32;;3100:7;3093:4;3089:2;3085:13;3081:27;3071:2;;3127:6;3119;3112:22;3071:2;3168;3155:16;3190:2;3186;3183:10;3180:2;;;3196:18;;:::i;:::-;3236:37;3269:2;3264;3260;3256:11;3252:20;3236:37;:::i;:::-;3307:15;;;3338:12;;;;-1:-1:-1;3370:11:14;;;3399:6;3414:211;3428:2;3425:1;3422:9;3414:211;;;3485:65;3542:7;3537:2;3530:3;3517:17;3513:2;3509:26;3505:35;3485:65;:::i;:::-;3473:78;;3571:12;;;;3603;;;;3446:1;3439:9;3414:211;;;3418:3;;3644:5;3634:15;;;;;;;3696:2;3685:9;3681:18;3668:32;3658:42;;3719:38;3753:2;3742:9;3738:18;3719:38;:::i;:::-;3709:48;;3804:3;3793:9;3789:19;3776:33;3766:43;;3856:3;3845:9;3841:19;3828:33;3818:43;;2732:1135;;;;;;;;:::o;3872:369::-;;;3998:2;3986:9;3977:7;3973:23;3969:32;3966:2;;;4019:6;4011;4004:22;3966:2;4047:31;4068:9;4047:31;:::i;:::-;4037:41;;4128:2;4117:9;4113:18;4100:32;4175:5;4168:13;4161:21;4154:5;4151:32;4141:2;;4202:6;4194;4187:22;4141:2;4230:5;4220:15;;;3956:285;;;;;:::o;4246:699::-;;;;;;;4451:3;4439:9;4430:7;4426:23;4422:33;4419:2;;;4473:6;4465;4458:22;4419:2;4501:31;4522:9;4501:31;:::i;:::-;4491:41;;4583:2;4572:9;4568:18;4555:32;4610:18;4602:6;4599:30;4596:2;;;4647:6;4639;4632:22;4596:2;4675:52;4719:7;4710:6;4699:9;4695:22;4675:52;:::i;:::-;4665:62;;;4774:2;4763:9;4759:18;4746:32;4736:42;;4797:38;4831:2;4820:9;4816:18;4797:38;:::i;4950:266::-;;;5079:2;5067:9;5058:7;5054:23;5050:32;5047:2;;;5100:6;5092;5085:22;5047:2;5128:31;5149:9;5128:31;:::i;:::-;5118:41;5206:2;5191:18;;;;5178:32;;-1:-1:-1;;;5037:179:14:o;5221:257::-;;5332:2;5320:9;5311:7;5307:23;5303:32;5300:2;;;5353:6;5345;5338:22;5300:2;5397:9;5384:23;5416:32;5442:5;5416:32;:::i;5483:261::-;;5605:2;5593:9;5584:7;5580:23;5576:32;5573:2;;;5626:6;5618;5611:22;5573:2;5663:9;5657:16;5682:32;5708:5;5682:32;:::i;5749:344::-;;5871:2;5859:9;5850:7;5846:23;5842:32;5839:2;;;5892:6;5884;5877:22;5839:2;5937:9;5924:23;5970:18;5962:6;5959:30;5956:2;;;6007:6;5999;5992:22;5956:2;6035:52;6079:7;6070:6;6059:9;6055:22;6035:52;:::i;6098:190::-;;6210:2;6198:9;6189:7;6185:23;6181:32;6178:2;;;6231:6;6223;6216:22;6178:2;-1:-1:-1;6259:23:14;;6168:120;-1:-1:-1;6168:120:14:o;6293:259::-;;6374:5;6368:12;6401:6;6396:3;6389:19;6417:63;6473:6;6466:4;6461:3;6457:14;6450:4;6443:5;6439:16;6417:63;:::i;:::-;6534:2;6513:15;-1:-1:-1;;6509:29:14;6500:39;;;;6541:4;6496:50;;6344:208;-1:-1:-1;;6344:208:14:o;6557:1109::-;6745:13;;6557:1109;;;;6818:1;6803:17;;6839:1;6875:18;;;;6902:2;;6956:4;6948:6;6944:17;6934:27;;6902:2;6982;7030;7022:6;7019:14;6999:18;6996:38;6993:2;;;-1:-1:-1;;;7057:33:14;;7113:4;7110:1;7103:15;7143:4;7064:3;7131:17;6993:2;7174:18;7201:104;;;;7319:1;7314:327;;;;7167:474;;7201:104;-1:-1:-1;;7234:24:14;;7222:37;;7279:16;;;;-1:-1:-1;7201:104:14;;7314:327;7350:42;7385:6;7350:42;:::i;:::-;7414:3;7430:165;7444:6;7441:1;7438:13;7430:165;;;7522:14;;7509:11;;;7502:35;7565:16;;;;7459:10;;7430:165;;;7434:3;;7624:6;7619:3;7615:16;7608:23;;7167:474;-1:-1:-1;7657:3:14;;6695:971;-1:-1:-1;;;;;;;;6695:971:14:o;7671:470::-;;7888:6;7882:13;7904:53;7950:6;7945:3;7938:4;7930:6;7926:17;7904:53;:::i;:::-;8020:13;;7979:16;;;;8042:57;8020:13;7979:16;8076:4;8064:17;;8042:57;:::i;:::-;8115:20;;7858:283;-1:-1:-1;;;;7858:283:14:o;8146:380::-;8388:66;8376:79;;8480:2;8471:12;;8464:28;;;;8517:2;8508:12;;8366:160::o;8531:205::-;8731:3;8722:14::o;8741:203::-;-1:-1:-1;;;;;8905:32:14;;;;8887:51;;8875:2;8860:18;;8842:102::o;8949:419::-;-1:-1:-1;;;;;9192:15:14;;;9174:34;;9244:15;;9239:2;9224:18;;9217:43;9296:2;9291;9276:18;;9269:30;;;8949:419;;9316:46;;9343:18;;9335:6;9316:46;:::i;:::-;9308:54;9126:242;-1:-1:-1;;;;;9126:242:14:o;9373:490::-;-1:-1:-1;;;;;9642:15:14;;;9624:34;;9694:15;;9689:2;9674:18;;9667:43;9741:2;9726:18;;9719:34;;;9789:3;9784:2;9769:18;;9762:31;;;9373:490;;9810:47;;9837:19;;9829:6;9810:47;:::i;:::-;9802:55;9576:287;-1:-1:-1;;;;;;9576:287:14:o;9868:389::-;-1:-1:-1;;;;;10073:32:14;;10055:51;;10142:2;10137;10122:18;;10115:30;;;9868:389;;10162:46;;10189:18;;10181:6;10162:46;:::i;:::-;10154:54;;10244:6;10239:2;10228:9;10224:18;10217:34;10045:212;;;;;;:::o;10262:274::-;-1:-1:-1;;;;;10454:32:14;;;;10436:51;;10518:2;10503:18;;10496:34;10424:2;10409:18;;10391:145::o;10541:187::-;10706:14;;10699:22;10681:41;;10669:2;10654:18;;10636:92::o;10733:398::-;10960:25;;;11033:4;11021:17;;;;11016:2;11001:18;;10994:45;11070:2;11055:18;;11048:34;11113:2;11098:18;;11091:34;10947:3;10932:19;;10914:217::o;11136:221::-;;11285:2;11274:9;11267:21;11305:46;11347:2;11336:9;11332:18;11324:6;11305:46;:::i;11362:348::-;11564:2;11546:21;;;11603:2;11583:18;;;11576:30;11642:26;11637:2;11622:18;;11615:54;11701:2;11686:18;;11536:174::o;11715:330::-;11917:2;11899:21;;;11956:1;11936:18;;;11929:29;-1:-1:-1;;;11989:2:14;11974:18;;11967:37;12036:2;12021:18;;11889:156::o;12050:355::-;12252:2;12234:21;;;12291:2;12271:18;;;12264:30;12330:33;12325:2;12310:18;;12303:61;12396:2;12381:18;;12224:181::o;12410:355::-;12612:2;12594:21;;;12651:2;12631:18;;;12624:30;12690:33;12685:2;12670:18;;12663:61;12756:2;12741:18;;12584:181::o;12770:414::-;12972:2;12954:21;;;13011:2;12991:18;;;12984:30;13050:34;13045:2;13030:18;;13023:62;-1:-1:-1;;;13116:2:14;13101:18;;13094:48;13174:3;13159:19;;12944:240::o;13189:402::-;13391:2;13373:21;;;13430:2;13410:18;;;13403:30;13469:34;13464:2;13449:18;;13442:62;-1:-1:-1;;;13535:2:14;13520:18;;13513:36;13581:3;13566:19;;13363:228::o;13596:401::-;13798:2;13780:21;;;13837:2;13817:18;;;13810:30;13876:34;13871:2;13856:18;;13849:62;-1:-1:-1;;;13942:2:14;13927:18;;13920:35;13987:3;13972:19;;13770:227::o;14002:352::-;14204:2;14186:21;;;14243:2;14223:18;;;14216:30;14282;14277:2;14262:18;;14255:58;14345:2;14330:18;;14176:178::o;14359:400::-;14561:2;14543:21;;;14600:2;14580:18;;;14573:30;14639:34;14634:2;14619:18;;14612:62;-1:-1:-1;;;14705:2:14;14690:18;;14683:34;14749:3;14734:19;;14533:226::o;14764:349::-;14966:2;14948:21;;;15005:2;14985:18;;;14978:30;15044:27;15039:2;15024:18;;15017:55;15104:2;15089:18;;14938:175::o;15118:398::-;15320:2;15302:21;;;15359:2;15339:18;;;15332:30;15398:34;15393:2;15378:18;;15371:62;-1:-1:-1;;;15464:2:14;15449:18;;15442:32;15506:3;15491:19;;15292:224::o;15521:346::-;15723:2;15705:21;;;15762:2;15742:18;;;15735:30;-1:-1:-1;;;15796:2:14;15781:18;;15774:52;15858:2;15843:18;;15695:172::o;15872:405::-;16074:2;16056:21;;;16113:2;16093:18;;;16086:30;16152:34;16147:2;16132:18;;16125:62;-1:-1:-1;;;16218:2:14;16203:18;;16196:39;16267:3;16252:19;;16046:231::o;16282:398::-;16484:2;16466:21;;;16523:2;16503:18;;;16496:30;16562:34;16557:2;16542:18;;16535:62;-1:-1:-1;;;16628:2:14;16613:18;;16606:32;16670:3;16655:19;;16456:224::o;16685:426::-;16887:2;16869:21;;;16926:2;16906:18;;;16899:30;16965:34;16960:2;16945:18;;16938:62;17036:32;17031:2;17016:18;;17009:60;17101:3;17086:19;;16859:252::o;17116:356::-;17318:2;17300:21;;;17337:18;;;17330:30;17396:34;17391:2;17376:18;;17369:62;17463:2;17448:18;;17290:182::o;17477:356::-;17679:2;17661:21;;;17698:18;;;17691:30;17757:34;17752:2;17737:18;;17730:62;17824:2;17809:18;;17651:182::o;17838:341::-;18040:2;18022:21;;;18079:2;18059:18;;;18052:30;-1:-1:-1;;;18113:2:14;18098:18;;18091:47;18170:2;18155:18;;18012:167::o;18184:352::-;18386:2;18368:21;;;18425:2;18405:18;;;18398:30;18464;18459:2;18444:18;;18437:58;18527:2;18512:18;;18358:178::o;18541:348::-;18743:2;18725:21;;;18782:2;18762:18;;;18755:30;18821:26;18816:2;18801:18;;18794:54;18880:2;18865:18;;18715:174::o;18894:397::-;19096:2;19078:21;;;19135:2;19115:18;;;19108:30;19174:34;19169:2;19154:18;;19147:62;-1:-1:-1;;;19240:2:14;19225:18;;19218:31;19281:3;19266:19;;19068:223::o;19296:351::-;19498:2;19480:21;;;19537:2;19517:18;;;19510:30;19576:29;19571:2;19556:18;;19549:57;19638:2;19623:18;;19470:177::o;19652:335::-;19854:2;19836:21;;;19893:2;19873:18;;;19866:30;-1:-1:-1;;;19927:2:14;19912:18;;19905:41;19978:2;19963:18;;19826:161::o;19992:340::-;20194:2;20176:21;;;20233:2;20213:18;;;20206:30;-1:-1:-1;;;20267:2:14;20252:18;;20245:46;20323:2;20308:18;;20166:166::o;20337:410::-;20539:2;20521:21;;;20578:2;20558:18;;;20551:30;20617:34;20612:2;20597:18;;20590:62;-1:-1:-1;;;20683:2:14;20668:18;;20661:44;20737:3;20722:19;;20511:236::o;20752:337::-;20954:2;20936:21;;;20993:2;20973:18;;;20966:30;-1:-1:-1;;;21027:2:14;21012:18;;21005:43;21080:2;21065:18;;20926:163::o;21094:177::-;21240:25;;;21228:2;21213:18;;21195:76::o;21276:275::-;21347:2;21341:9;21412:2;21393:13;;-1:-1:-1;;21389:27:14;21377:40;;21447:18;21432:34;;21468:22;;;21429:62;21426:2;;;21494:18;;:::i;:::-;21530:2;21523:22;21321:230;;-1:-1:-1;21321:230:14:o;21556:132::-;;21627:17;;;21677:4;21661:21;;;21617:71::o;21693:128::-;;21764:1;21760:6;21757:1;21754:13;21751:2;;;21770:18;;:::i;:::-;-1:-1:-1;21806:9:14;;21741:80::o;21826:217::-;;21892:1;21882:2;;-1:-1:-1;;;21917:31:14;;21971:4;21968:1;21961:15;21999:4;21924:1;21989:15;21882:2;-1:-1:-1;22028:9:14;;21872:171::o;22048:168::-;;22154:1;22150;22146:6;22142:14;22139:1;22136:21;22131:1;22124:9;22117:17;22113:45;22110:2;;;22161:18;;:::i;:::-;-1:-1:-1;22201:9:14;;22100:116::o;22221:125::-;;22289:1;22286;22283:8;22280:2;;;22294:18;;:::i;:::-;-1:-1:-1;22331:9:14;;22270:76::o;22351:258::-;22423:1;22433:113;22447:6;22444:1;22441:13;22433:113;;;22523:11;;;22517:18;22504:11;;;22497:39;22469:2;22462:10;22433:113;;;22564:6;22561:1;22558:13;22555:2;;;-1:-1:-1;;22599:1:14;22581:16;;22574:27;22404:205::o;22614:380::-;22699:1;22689:12;;22746:1;22736:12;;;22757:2;;22811:4;22803:6;22799:17;22789:27;;22757:2;22864;22856:6;22853:14;22833:18;22830:38;22827:2;;;22910:10;22905:3;22901:20;22898:1;22891:31;22945:4;22942:1;22935:15;22973:4;22970:1;22963:15;22827:2;;22669:325;;;:::o;22999:175::-;;23080:4;23073:5;23069:16;23109:4;23100:7;23097:17;23094:2;;;23117:18;;:::i;:::-;23166:1;23153:15;;23044:130;-1:-1:-1;;23044:130:14:o;23179:127::-;23240:10;23235:3;23231:20;23228:1;23221:31;23271:4;23268:1;23261:15;23295:4;23292:1;23285:15;23311:127;23372:10;23367:3;23363:20;23360:1;23353:31;23403:4;23400:1;23393:15;23427:4;23424:1;23417:15;23443:133;-1:-1:-1;;;;;;23519:32:14;;23509:43;;23499:2;;23566:1;23563;23556:12
Swarm Source
ipfs://dc79a96608e237bd93b45b12a56f6569f038ba0cf3e2337d72b12b190f2193b3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.