Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 2,666 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Pause | 13628047 | 1315 days ago | IN | 0 ETH | 0.000095173551 | ||||
| Cancel Order | 13595439 | 1315 days ago | IN | 0 ETH | 0.000059169096 | ||||
| Cancel Order | 13052247 | 1321 days ago | IN | 0 ETH | 0.000254083065 | ||||
| Cancel Previous ... | 12442649 | 1326 days ago | IN | 0 ETH | 0.000084928601 | ||||
| Cancel Order | 12441635 | 1326 days ago | IN | 0 ETH | 0.000126955144 | ||||
| Cancel Order | 11210121 | 1335 days ago | IN | 0 ETH | 0.000146966138 | ||||
| Cancel Order | 10918589 | 1338 days ago | IN | 0 ETH | 0.000236122669 | ||||
| Cancel Order | 10918520 | 1338 days ago | IN | 0 ETH | 0.000236122669 | ||||
| Cancel Order | 10804340 | 1339 days ago | IN | 0 ETH | 0.000141115367 | ||||
| Cancel Order | 10724115 | 1340 days ago | IN | 0 ETH | 0.000178970772 | ||||
| Cancel Order | 10640616 | 1341 days ago | IN | 0 ETH | 0.000185942355 | ||||
| Cancel Order | 10560334 | 1342 days ago | IN | 0 ETH | 0.00035547568 | ||||
| Cancel Order | 10525917 | 1342 days ago | IN | 0 ETH | 0.000151460481 | ||||
| Cancel Order | 10327962 | 1344 days ago | IN | 0 ETH | 0.000489041856 | ||||
| Cancel Order | 10226154 | 1344 days ago | IN | 0 ETH | 0.00021234462 | ||||
| Cancel Order | 10008282 | 1345 days ago | IN | 0 ETH | 0.000297061968 | ||||
| Cancel Order | 10007884 | 1345 days ago | IN | 0 ETH | 0.000333065103 | ||||
| Cancel Order | 9798451 | 1345 days ago | IN | 0 ETH | 0.000135424978 | ||||
| Cancel Order | 9797969 | 1345 days ago | IN | 0 ETH | 0.000142534823 | ||||
| Cancel Order | 9797620 | 1345 days ago | IN | 0 ETH | 0.000142534823 | ||||
| Cancel Order | 9797261 | 1345 days ago | IN | 0 ETH | 0.000160220768 | ||||
| Cancel Order | 9796701 | 1345 days ago | IN | 0 ETH | 0.000151486043 | ||||
| Cancel Order | 9795978 | 1345 days ago | IN | 0 ETH | 0.000151139221 | ||||
| Cancel Order | 9795667 | 1345 days ago | IN | 0 ETH | 0.000200245422 | ||||
| Cancel Order | 9795328 | 1345 days ago | IN | 0 ETH | 0.000172966348 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 6939947 | 1375 days ago | 0.00075 ETH | ||||
| 6898350 | 1375 days ago | 0.039 ETH | ||||
| 6898350 | 1375 days ago | 0.001 ETH | ||||
| 6799934 | 1377 days ago | 0.04875 ETH | ||||
| 6799934 | 1377 days ago | 0.00125 ETH | ||||
| 6678412 | 1379 days ago | 0.1425 ETH | ||||
| 6678412 | 1379 days ago | 0.00375 ETH | ||||
| 6678412 | 1379 days ago | 0.00375 ETH | ||||
| 6641471 | 1379 days ago | 0.1045 ETH | ||||
| 6641471 | 1379 days ago | 0.00275 ETH | ||||
| 6641471 | 1379 days ago | 0.00275 ETH | ||||
| 6637107 | 1379 days ago | 0.095 ETH | ||||
| 6637107 | 1379 days ago | 0.0025 ETH | ||||
| 6637107 | 1379 days ago | 0.0025 ETH | ||||
| 6634258 | 1379 days ago | 0.095 ETH | ||||
| 6634258 | 1379 days ago | 0.0025 ETH | ||||
| 6634258 | 1379 days ago | 0.0025 ETH | ||||
| 6633515 | 1379 days ago | 0.095 ETH | ||||
| 6633515 | 1379 days ago | 0.0025 ETH | ||||
| 6633515 | 1379 days ago | 0.0025 ETH | ||||
| 6630040 | 1379 days ago | 0.095 ETH | ||||
| 6630040 | 1379 days ago | 0.0025 ETH | ||||
| 6630040 | 1379 days ago | 0.0025 ETH | ||||
| 6625798 | 1380 days ago | 0.095 ETH | ||||
| 6625798 | 1380 days ago | 0.0025 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2021-12-18 */ // Sources flattened with hardhat v2.7.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.0 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); if (result.length < 32) return false; return success && abi.decode(result, (bool)); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @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. 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. 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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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)); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.0 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File Contracts/Exchange.sol pragma solidity ^0.8.0; contract Exchange is Ownable, Pausable, ReentrancyGuard { using ERC165Checker for address; bytes4 private InterfaceId_ERC721 = 0x80ac58cd; // Magic number that detects 721s mapping(address => address payable) private nftPayoutAddresses; mapping(address => uint256) private payoutPerMille; address payable _makerWallet; uint256 private _makerFeePerMille = 25; uint256 private _maxRoyaltyPerMille = 150; mapping(bytes => bool) orderDeactivations; mapping(address => bool) frozenAddresses; event SellOrderFilled(address indexed seller, address payable buyer, address indexed erc721address, uint256 indexed tokenId, uint256 price); /* This contains all data of the trade */ struct ERC721SellOrder { /* Seller of the NFT */ address payable seller; /* Contract address of NFT */ address erc721address; /* Token id of NFT to sell */ uint256 tokenId; /* Expiration in unix timestamp */ uint256 expiration; /* Price in wei */ uint256 price; } /* * @dev External trade function. This accepts the details of the sell order and signed sell * order (the signature) as a meta-transaction. * * Emits a {SellOrderFilled} event via `_trade`. */ function trade( address payable seller, address erc721address, uint256 tokenId, uint256 expiration, uint256 price, bytes memory signature, address payable buyer ) external payable whenNotPaused nonReentrant { require(msg.value >= price, "You're transaction doesn't have the required payment"); ERC721SellOrder memory sellOrder = ERC721SellOrder( seller, erc721address, tokenId, expiration, price ); _trade(sellOrder, signature, buyer); } /* * @dev Executes a trade given a sell order. * * Emits a {SellOrderFilled} event. */ function _trade(ERC721SellOrder memory sellOrder, bytes memory signature, address payable buyer) internal { /* Make sure the order is not cancelled */ require(!isOrderCancelled(signature), "This order has been cancelled."); /* Make sure the seller address is not frozen */ require(!isAddressFrozen(sellOrder.seller), "The seller address is currently frozen."); /* First check signature */ require(_validateSellerSignature(sellOrder, signature), "Signature is not valid for SellOrder."); /* Check that address is actually ERC721 */ require(sellOrder.erc721address.supportsInterface(InterfaceId_ERC721), "IS_NOT_721_TOKEN"); // Check not expired require((block.timestamp < sellOrder.expiration), "This sell order has expired."); IERC721 erc721 = IERC721(sellOrder.erc721address); /* require seller owns it */ require((erc721.ownerOf(sellOrder.tokenId) == sellOrder.seller), "The seller does not own this NFT"); // Might be unnecessary /* require is approved for all */ require(erc721.isApprovedForAll(sellOrder.seller, address(this)), "The Trading contract is not approved to operate this NFT"); /* Do the trade */ // Step 1: Send the ETH uint256 royaltyPayout = (payoutPerMille[sellOrder.erc721address] * msg.value) / 1000; uint256 makerPayout = (_makerFeePerMille * msg.value) / 1000; uint256 remainingPayout = msg.value - royaltyPayout - makerPayout; if (royaltyPayout > 0) { address payable royaltyPayoutAddress = nftPayoutAddresses[sellOrder.erc721address]; royaltyPayoutAddress.call{value : royaltyPayout}(""); } _makerWallet.call{value : makerPayout}(""); sellOrder.seller.call{value : remainingPayout}(""); // Step 2: Transfer the NFT erc721.safeTransferFrom(sellOrder.seller, buyer, sellOrder.tokenId); orderDeactivations[signature] = true; emit SellOrderFilled(sellOrder.seller, buyer, sellOrder.erc721address, sellOrder.tokenId, sellOrder.price); } /* * @dev Sets the royalty as a int out of 1000 that the creator should receive and the address to pay. */ function setRoyalty(address _erc721address, address payable _payoutAddress, uint256 _payoutPerMille) external { require((_payoutPerMille >= 0 && _payoutPerMille <= _maxRoyaltyPerMille), "Royalty must be between 0 and 15%"); require(_erc721address.supportsInterface(InterfaceId_ERC721), "IS_NOT_721_TOKEN"); Ownable ownableNFTContract = Ownable(_erc721address); require(_msgSender() == ownableNFTContract.owner()); nftPayoutAddresses[_erc721address] = _payoutAddress; payoutPerMille[_erc721address] = _payoutPerMille; } /* * @dev Gets the royalty payout address. */ function getRoyaltyPayoutAddress(address _erc721address) public view returns (address) { return nftPayoutAddresses[_erc721address]; } /* * @dev Gets the royalty as a int out of 1000 that the creator should receive. */ function getRoyaltyPayoutRate(address _erc721address) public view returns (uint256) { return payoutPerMille[_erc721address]; } /* * @dev Sets the wallet for the exchange. */ function setMakerWallet(address payable _newMakerWallet) external onlyOwner { _makerWallet = _newMakerWallet; } /* * @dev Pauses trading on the exchange. To be used for emergencies. */ function pause() external onlyOwner { _pause(); } /* * @dev Resumes trading on the exchange. To be used for emergencies. */ function unpause() external onlyOwner { _unpause(); } /* * @dev Freezes all sell orders for a specific address. Use this if the address is compromised. */ function freezeAddress(address addressToFreeze) external { frozenAddresses[addressToFreeze] = true; } /* * @dev Unfreeze the sell orders for a specific address. */ function unFreezeAddress(address addressToUnFreeze) external { frozenAddresses[addressToUnFreeze] = false; } /* * @dev Check if an address has been frozen. */ function isAddressFrozen(address addressToCheck) public view returns (bool) { return frozenAddresses[addressToCheck]; } /* * @dev Cancels an order. */ function cancelOrder(bytes memory signature) external { orderDeactivations[signature] = true; } /* * @dev Check if an order has been cancelled. */ function isOrderCancelled(bytes memory signature) public view returns (bool) { return orderDeactivations[signature]; } /* * @dev Validate the sell order against the signature of the meta-transaction. */ function _validateSellerSignature(ERC721SellOrder memory sellOrder, bytes memory signature) internal view returns (bool) { bytes32 message = ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked( sellOrder.seller, sellOrder.erc721address, sellOrder.tokenId, sellOrder.expiration, sellOrder.price ))); address recoveredSeller = ECDSA.recover(message, signature); return recoveredSeller == sellOrder.seller; } /* * Withdraw just in case Ether is accidentally sent to this contract. */ function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address payable","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"erc721address","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"SellOrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToFreeze","type":"address"}],"name":"freezeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721address","type":"address"}],"name":"getRoyaltyPayoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721address","type":"address"}],"name":"getRoyaltyPayoutRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToCheck","type":"address"}],"name":"isAddressFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isOrderCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newMakerWallet","type":"address"}],"name":"setMakerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721address","type":"address"},{"internalType":"address payable","name":"_payoutAddress","type":"address"},{"internalType":"uint256","name":"_payoutPerMille","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"erc721address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address payable","name":"buyer","type":"address"}],"name":"trade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToUnFreeze","type":"address"}],"name":"unFreezeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526002805463ffffffff19166380ac58cd1790556019600655609660075534801561002d57600080fd5b506100373361004d565b6000805460ff60a01b191690556001805561009d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611983806100ac6000396000f3fe6080604052600436106100fe5760003560e01c806360f46aee1161009557806395a3e2af1161006457806395a3e2af146102ae578063b910b664146102e7578063d3739d3514610307578063ec4210ff14610343578063f2fde38b1461038757600080fd5b806360f46aee14610253578063715018a6146102665780638456cb591461027b5780638da5cb5b1461029057600080fd5b806351e946d5116100d157806351e946d5146101a557806355c338aa146101e4578063563166a9146102045780635c975abb1461023457600080fd5b80632b812a34146101035780632df5cb23146101255780633ccfd60b1461017b5780633f4ba83a14610190575b600080fd5b34801561010f57600080fd5b5061012361011e3660046116b9565b6103a7565b005b34801561013157600080fd5b5061015e6101403660046116b9565b6001600160a01b039081166000908152600360205260409020541690565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018757600080fd5b506101236103fc565b34801561019c57600080fd5b50610123610459565b3480156101b157600080fd5b506101236101c03660046116b9565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b3480156101f057600080fd5b506101236101ff36600461178e565b61048d565b34801561021057600080fd5b5061022461021f3660046117f1565b610613565b6040519015158152602001610172565b34801561024057600080fd5b50600054600160a01b900460ff16610224565b6101236102613660046116fa565b61063e565b34801561027257600080fd5b5061012361079b565b34801561028757600080fd5b506101236107cf565b34801561029c57600080fd5b506000546001600160a01b031661015e565b3480156102ba57600080fd5b506102246102c93660046116b9565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156102f357600080fd5b506101236103023660046117f1565b610801565b34801561031357600080fd5b506101236103223660046116b9565b6001600160a01b03166000908152600960205260409020805460ff19169055565b34801561034f57600080fd5b5061037961035e3660046116b9565b6001600160a01b031660009081526004602052604090205490565b604051908152602001610172565b34801561039357600080fd5b506101236103a23660046116b9565b610836565b6000546001600160a01b031633146103da5760405162461bcd60e51b81526004016103d190611869565b60405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104265760405162461bcd60e51b81526004016103d190611869565b6040514790339082156108fc029083906000818181858888f19350505050158015610455573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146104835760405162461bcd60e51b81526004016103d190611869565b61048b6108d1565b565b6007548111156104e95760405162461bcd60e51b815260206004820152602160248201527f526f79616c7479206d757374206265206265747765656e203020616e642031356044820152602560f81b60648201526084016103d1565b600254610503906001600160a01b0385169060e01b61096e565b6105425760405162461bcd60e51b815260206004820152601060248201526f24a9afa727aa2f9b9918afaa27a5a2a760811b60448201526064016103d1565b6000839050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561058057600080fd5b505afa158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b891906116dd565b6001600160a01b0316336001600160a01b0316146105d557600080fd5b506001600160a01b03928316600090815260036020908152604080832080546001600160a01b03191695909616949094179094556004909352912055565b6000600882604051610625919061182e565b9081526040519081900360200190205460ff1692915050565b600054600160a01b900460ff161561068b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103d1565b600260015414156106de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103d1565b6002600155348311156107505760405162461bcd60e51b815260206004820152603460248201527f596f75277265207472616e73616374696f6e20646f65736e27742068617665206044820152731d1a19481c995c5d5a5c9959081c185e5b595b9d60621b60648201526084016103d1565b6040805160a0810182526001600160a01b03808a16825288166020820152908101869052606081018590526080810184905261078d818484610993565b505060018055505050505050565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016103d190611869565b61048b6000610fdb565b6000546001600160a01b031633146107f95760405162461bcd60e51b81526004016103d190611869565b61048b61102b565b6001600882604051610813919061182e565b908152604051908190036020019020805491151560ff1990921691909117905550565b6000546001600160a01b031633146108605760405162461bcd60e51b81526004016103d190611869565b6001600160a01b0381166108c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d1565b6108ce81610fdb565b50565b600054600160a01b900460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103d1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000610979836110b3565b801561098a575061098a83836110e6565b90505b92915050565b61099c82610613565b156109e95760405162461bcd60e51b815260206004820152601e60248201527f54686973206f7264657220686173206265656e2063616e63656c6c65642e000060448201526064016103d1565b82516001600160a01b031660009081526009602052604090205460ff1615610a635760405162461bcd60e51b815260206004820152602760248201527f5468652073656c6c657220616464726573732069732063757272656e746c7920604482015266333937bd32b71760c91b60648201526084016103d1565b610a6d83836111cf565b610ac75760405162461bcd60e51b815260206004820152602560248201527f5369676e6174757265206973206e6f742076616c696420666f722053656c6c4f604482015264393232b91760d91b60648201526084016103d1565b6002546020840151610ae7916001600160a01b039091169060e01b61096e565b610b265760405162461bcd60e51b815260206004820152601060248201526f24a9afa727aa2f9b9918afaa27a5a2a760811b60448201526064016103d1565b82606001514210610b795760405162461bcd60e51b815260206004820152601c60248201527f546869732073656c6c206f726465722068617320657870697265642e0000000060448201526064016103d1565b6020830151835160408086015190516331a9108f60e11b815260048101919091526001600160a01b0391821691831690636352211e9060240160206040518083038186803b158015610bca57600080fd5b505afa158015610bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0291906116dd565b6001600160a01b031614610c585760405162461bcd60e51b815260206004820181905260248201527f5468652073656c6c657220646f6573206e6f74206f776e2074686973204e465460448201526064016103d1565b835160405163e985e9c560e01b81526001600160a01b0391821660048201523060248201529082169063e985e9c59060440160206040518083038186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cda91906117cf565b610d4c5760405162461bcd60e51b815260206004820152603860248201527f5468652054726164696e6720636f6e7472616374206973206e6f74206170707260448201527f6f76656420746f206f7065726174652074686973204e4654000000000000000060648201526084016103d1565b6020808501516001600160a01b03166000908152600490915260408120546103e890610d799034906118c0565b610d83919061189e565b905060006103e834600654610d9891906118c0565b610da2919061189e565b9050600081610db184346118df565b610dbb91906118df565b90508215610e2e576020878101516001600160a01b039081166000908152600390925260408083205490519116918291869181818185875af1925050503d8060008114610e24576040519150601f19603f3d011682016040523d82523d6000602084013e610e29565b606091505b505050505b6005546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610e7b576040519150601f19603f3d011682016040523d82523d6000602084013e610e80565b606091505b505087516040516001600160a01b0390911691508290600081818185875af1925050503d8060008114610ecf576040519150601f19603f3d011682016040523d82523d6000602084013e610ed4565b606091505b505087516040808a01519051632142170760e11b81526001600160a01b0392831660048201528883166024820152604481019190915290861691506342842e0e90606401600060405180830381600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506001600887604051610f5c919061182e565b9081526040805160209281900383018120805460ff191694151594909417909355898101518a8301518b5160808d01516001600160a01b038c8116885295870152919490841693909116917f70ba0d31158674eea8365d0f7b9ac70e552cc28b8bb848664e4feb939c6578f8910160405180910390a450505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff16156110785760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103d1565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586109513390565b60006110c6826301ffc9a760e01b6110e6565b801561098d57506110df826001600160e01b03196110e6565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b038716906175309061114d90869061182e565b6000604051808303818686fa925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50915091506020815110156111a9576000935050505061098d565b8180156111c55750808060200190518101906111c591906117cf565b9695505050505050565b60008061129984600001518560200151866040015187606001518860800151604051602001611239959493929190606095861b6bffffffffffffffffffffffff1990811682529490951b909316601485015260288401919091526048830152606882015260880190565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b905060006112a782856112c1565b85516001600160a01b039182169116149250505092915050565b60008060006112d085856112e5565b915091506112dd81611355565b509392505050565b60008082516041141561131c5760208301516040840151606085015160001a61131087828585611510565b9450945050505061134e565b825160401415611346576020830151604084015161133b8683836115fd565b93509350505061134e565b506000905060025b9250929050565b60008160048111156113695761136961190c565b14156113725750565b60018160048111156113865761138661190c565b14156113d45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103d1565b60028160048111156113e8576113e861190c565b14156114365760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016103d1565b600381600481111561144a5761144a61190c565b14156114a35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016103d1565b60048160048111156114b7576114b761190c565b14156108ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016103d1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561154757506000905060036115f4565b8460ff16601b1415801561155f57508460ff16601c14155b1561157057506000905060046115f4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115ed576000600192509250506115f4565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161161e87828885611510565b935093505050935093915050565b600082601f83011261163d57600080fd5b813567ffffffffffffffff8082111561165857611658611922565b604051601f8301601f19908116603f0116810190828211818310171561168057611680611922565b8160405283815286602085880101111561169957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156116cb57600080fd5b81356116d681611938565b9392505050565b6000602082840312156116ef57600080fd5b81516116d681611938565b600080600080600080600060e0888a03121561171557600080fd5b873561172081611938565b9650602088013561173081611938565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561176157600080fd5b61176d8a828b0161162c565b92505060c088013561177e81611938565b8091505092959891949750929550565b6000806000606084860312156117a357600080fd5b83356117ae81611938565b925060208401356117be81611938565b929592945050506040919091013590565b6000602082840312156117e157600080fd5b815180151581146116d657600080fd5b60006020828403121561180357600080fd5b813567ffffffffffffffff81111561181a57600080fd5b6118268482850161162c565b949350505050565b6000825160005b8181101561184f5760208186018101518583015201611835565b8181111561185e576000828501525b509190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000826118bb57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118da576118da6118f6565b500290565b6000828210156118f1576118f16118f6565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108ce57600080fdfea264697066735822122021bcc6fd46c0a3beb0bc95e4142d7c32ecfa72077ae487a38719bb94fa1b438b64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c806360f46aee1161009557806395a3e2af1161006457806395a3e2af146102ae578063b910b664146102e7578063d3739d3514610307578063ec4210ff14610343578063f2fde38b1461038757600080fd5b806360f46aee14610253578063715018a6146102665780638456cb591461027b5780638da5cb5b1461029057600080fd5b806351e946d5116100d157806351e946d5146101a557806355c338aa146101e4578063563166a9146102045780635c975abb1461023457600080fd5b80632b812a34146101035780632df5cb23146101255780633ccfd60b1461017b5780633f4ba83a14610190575b600080fd5b34801561010f57600080fd5b5061012361011e3660046116b9565b6103a7565b005b34801561013157600080fd5b5061015e6101403660046116b9565b6001600160a01b039081166000908152600360205260409020541690565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018757600080fd5b506101236103fc565b34801561019c57600080fd5b50610123610459565b3480156101b157600080fd5b506101236101c03660046116b9565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b3480156101f057600080fd5b506101236101ff36600461178e565b61048d565b34801561021057600080fd5b5061022461021f3660046117f1565b610613565b6040519015158152602001610172565b34801561024057600080fd5b50600054600160a01b900460ff16610224565b6101236102613660046116fa565b61063e565b34801561027257600080fd5b5061012361079b565b34801561028757600080fd5b506101236107cf565b34801561029c57600080fd5b506000546001600160a01b031661015e565b3480156102ba57600080fd5b506102246102c93660046116b9565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156102f357600080fd5b506101236103023660046117f1565b610801565b34801561031357600080fd5b506101236103223660046116b9565b6001600160a01b03166000908152600960205260409020805460ff19169055565b34801561034f57600080fd5b5061037961035e3660046116b9565b6001600160a01b031660009081526004602052604090205490565b604051908152602001610172565b34801561039357600080fd5b506101236103a23660046116b9565b610836565b6000546001600160a01b031633146103da5760405162461bcd60e51b81526004016103d190611869565b60405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104265760405162461bcd60e51b81526004016103d190611869565b6040514790339082156108fc029083906000818181858888f19350505050158015610455573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146104835760405162461bcd60e51b81526004016103d190611869565b61048b6108d1565b565b6007548111156104e95760405162461bcd60e51b815260206004820152602160248201527f526f79616c7479206d757374206265206265747765656e203020616e642031356044820152602560f81b60648201526084016103d1565b600254610503906001600160a01b0385169060e01b61096e565b6105425760405162461bcd60e51b815260206004820152601060248201526f24a9afa727aa2f9b9918afaa27a5a2a760811b60448201526064016103d1565b6000839050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561058057600080fd5b505afa158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b891906116dd565b6001600160a01b0316336001600160a01b0316146105d557600080fd5b506001600160a01b03928316600090815260036020908152604080832080546001600160a01b03191695909616949094179094556004909352912055565b6000600882604051610625919061182e565b9081526040519081900360200190205460ff1692915050565b600054600160a01b900460ff161561068b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103d1565b600260015414156106de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103d1565b6002600155348311156107505760405162461bcd60e51b815260206004820152603460248201527f596f75277265207472616e73616374696f6e20646f65736e27742068617665206044820152731d1a19481c995c5d5a5c9959081c185e5b595b9d60621b60648201526084016103d1565b6040805160a0810182526001600160a01b03808a16825288166020820152908101869052606081018590526080810184905261078d818484610993565b505060018055505050505050565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016103d190611869565b61048b6000610fdb565b6000546001600160a01b031633146107f95760405162461bcd60e51b81526004016103d190611869565b61048b61102b565b6001600882604051610813919061182e565b908152604051908190036020019020805491151560ff1990921691909117905550565b6000546001600160a01b031633146108605760405162461bcd60e51b81526004016103d190611869565b6001600160a01b0381166108c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d1565b6108ce81610fdb565b50565b600054600160a01b900460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103d1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000610979836110b3565b801561098a575061098a83836110e6565b90505b92915050565b61099c82610613565b156109e95760405162461bcd60e51b815260206004820152601e60248201527f54686973206f7264657220686173206265656e2063616e63656c6c65642e000060448201526064016103d1565b82516001600160a01b031660009081526009602052604090205460ff1615610a635760405162461bcd60e51b815260206004820152602760248201527f5468652073656c6c657220616464726573732069732063757272656e746c7920604482015266333937bd32b71760c91b60648201526084016103d1565b610a6d83836111cf565b610ac75760405162461bcd60e51b815260206004820152602560248201527f5369676e6174757265206973206e6f742076616c696420666f722053656c6c4f604482015264393232b91760d91b60648201526084016103d1565b6002546020840151610ae7916001600160a01b039091169060e01b61096e565b610b265760405162461bcd60e51b815260206004820152601060248201526f24a9afa727aa2f9b9918afaa27a5a2a760811b60448201526064016103d1565b82606001514210610b795760405162461bcd60e51b815260206004820152601c60248201527f546869732073656c6c206f726465722068617320657870697265642e0000000060448201526064016103d1565b6020830151835160408086015190516331a9108f60e11b815260048101919091526001600160a01b0391821691831690636352211e9060240160206040518083038186803b158015610bca57600080fd5b505afa158015610bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0291906116dd565b6001600160a01b031614610c585760405162461bcd60e51b815260206004820181905260248201527f5468652073656c6c657220646f6573206e6f74206f776e2074686973204e465460448201526064016103d1565b835160405163e985e9c560e01b81526001600160a01b0391821660048201523060248201529082169063e985e9c59060440160206040518083038186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cda91906117cf565b610d4c5760405162461bcd60e51b815260206004820152603860248201527f5468652054726164696e6720636f6e7472616374206973206e6f74206170707260448201527f6f76656420746f206f7065726174652074686973204e4654000000000000000060648201526084016103d1565b6020808501516001600160a01b03166000908152600490915260408120546103e890610d799034906118c0565b610d83919061189e565b905060006103e834600654610d9891906118c0565b610da2919061189e565b9050600081610db184346118df565b610dbb91906118df565b90508215610e2e576020878101516001600160a01b039081166000908152600390925260408083205490519116918291869181818185875af1925050503d8060008114610e24576040519150601f19603f3d011682016040523d82523d6000602084013e610e29565b606091505b505050505b6005546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610e7b576040519150601f19603f3d011682016040523d82523d6000602084013e610e80565b606091505b505087516040516001600160a01b0390911691508290600081818185875af1925050503d8060008114610ecf576040519150601f19603f3d011682016040523d82523d6000602084013e610ed4565b606091505b505087516040808a01519051632142170760e11b81526001600160a01b0392831660048201528883166024820152604481019190915290861691506342842e0e90606401600060405180830381600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506001600887604051610f5c919061182e565b9081526040805160209281900383018120805460ff191694151594909417909355898101518a8301518b5160808d01516001600160a01b038c8116885295870152919490841693909116917f70ba0d31158674eea8365d0f7b9ac70e552cc28b8bb848664e4feb939c6578f8910160405180910390a450505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff16156110785760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103d1565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586109513390565b60006110c6826301ffc9a760e01b6110e6565b801561098d57506110df826001600160e01b03196110e6565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b038716906175309061114d90869061182e565b6000604051808303818686fa925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50915091506020815110156111a9576000935050505061098d565b8180156111c55750808060200190518101906111c591906117cf565b9695505050505050565b60008061129984600001518560200151866040015187606001518860800151604051602001611239959493929190606095861b6bffffffffffffffffffffffff1990811682529490951b909316601485015260288401919091526048830152606882015260880190565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b905060006112a782856112c1565b85516001600160a01b039182169116149250505092915050565b60008060006112d085856112e5565b915091506112dd81611355565b509392505050565b60008082516041141561131c5760208301516040840151606085015160001a61131087828585611510565b9450945050505061134e565b825160401415611346576020830151604084015161133b8683836115fd565b93509350505061134e565b506000905060025b9250929050565b60008160048111156113695761136961190c565b14156113725750565b60018160048111156113865761138661190c565b14156113d45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103d1565b60028160048111156113e8576113e861190c565b14156114365760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016103d1565b600381600481111561144a5761144a61190c565b14156114a35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016103d1565b60048160048111156114b7576114b761190c565b14156108ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016103d1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561154757506000905060036115f4565b8460ff16601b1415801561155f57508460ff16601c14155b1561157057506000905060046115f4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115ed576000600192509250506115f4565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161161e87828885611510565b935093505050935093915050565b600082601f83011261163d57600080fd5b813567ffffffffffffffff8082111561165857611658611922565b604051601f8301601f19908116603f0116810190828211818310171561168057611680611922565b8160405283815286602085880101111561169957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156116cb57600080fd5b81356116d681611938565b9392505050565b6000602082840312156116ef57600080fd5b81516116d681611938565b600080600080600080600060e0888a03121561171557600080fd5b873561172081611938565b9650602088013561173081611938565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561176157600080fd5b61176d8a828b0161162c565b92505060c088013561177e81611938565b8091505092959891949750929550565b6000806000606084860312156117a357600080fd5b83356117ae81611938565b925060208401356117be81611938565b929592945050506040919091013590565b6000602082840312156117e157600080fd5b815180151581146116d657600080fd5b60006020828403121561180357600080fd5b813567ffffffffffffffff81111561181a57600080fd5b6118268482850161162c565b949350505050565b6000825160005b8181101561184f5760208186018101518583015201611835565b8181111561185e576000828501525b509190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000826118bb57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118da576118da6118f6565b500290565b6000828210156118f1576118f16118f6565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108ce57600080fdfea264697066735822122021bcc6fd46c0a3beb0bc95e4142d7c32ecfa72077ae487a38719bb94fa1b438b64736f6c63430008070033
Deployed Bytecode Sourcemap
31087:7870:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36595:125;;;;;;;;;;-1:-1:-1;36595:125:0;;;;;:::i;:::-;;:::i;:::-;;36129:147;;;;;;;;;;-1:-1:-1;36129:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;36234:34:0;;;36207:7;36234:34;;;:18;:34;;;;;;;;36129:147;;;;-1:-1:-1;;;;;5288:32:1;;;5270:51;;5258:2;5243:18;36129:147:0;;;;;;;;38814:140;;;;;;;;;;;;;:::i;36976:67::-;;;;;;;;;;;;;:::i;37167:115::-;;;;;;;;;;-1:-1:-1;37167:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;37235:32:0;;;;;:15;:32;;;;;:39;;-1:-1:-1;;37235:39:0;37270:4;37235:39;;;37167:115;35477:583;;;;;;;;;;-1:-1:-1;35477:583:0;;;;;:::i;:::-;;:::i;37932:132::-;;;;;;;;;;-1:-1:-1;37932:132:0;;;;;:::i;:::-;;:::i;:::-;;;6505:14:1;;6498:22;6480:41;;6468:2;6453:18;37932:132:0;6340:187:1;27065:86:0;;;;;;;;;;-1:-1:-1;27112:4:0;27136:7;-1:-1:-1;;;27136:7:0;;;;27065:86;;32431:617;;;;;;:::i;:::-;;:::i;2711:103::-;;;;;;;;;;;;;:::i;36816:63::-;;;;;;;;;;;;;:::i;2060:87::-;;;;;;;;;;-1:-1:-1;2106:7:0;2133:6;-1:-1:-1;;;;;2133:6:0;2060:87;;37562:133;;;;;;;;;;-1:-1:-1;37562:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;37656:31:0;37632:4;37656:31;;;:15;:31;;;;;;;;;37562:133;37749:109;;;;;;;;;;-1:-1:-1;37749:109:0;;;;;:::i;:::-;;:::i;37367:122::-;;;;;;;;;;-1:-1:-1;37367:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;37439:34:0;37476:5;37439:34;;;:15;:34;;;;;:42;;-1:-1:-1;;37439:42:0;;;37367:122;36383:140;;;;;;;;;;-1:-1:-1;36383:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;36485:30:0;36458:7;36485:30;;;:14;:30;;;;;;;36383:140;;;;14113:25:1;;;14101:2;14086:18;36383:140:0;13967:177:1;2969:201:0;;;;;;;;;;-1:-1:-1;2969:201:0;;;;;:::i;:::-;;:::i;36595:125::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;;;;;;;;;36682:12:::1;:30:::0;;-1:-1:-1;;;;;;36682:30:0::1;-1:-1:-1::0;;;;;36682:30:0;;;::::1;::::0;;;::::1;::::0;;36595:125::o;38814:140::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;38909:37:::1;::::0;38877:21:::1;::::0;38917:10:::1;::::0;38909:37;::::1;;;::::0;38877:21;;38862:12:::1;38909:37:::0;38862:12;38909:37;38877:21;38917:10;38909:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;38851:103;38814:140::o:0;36976:67::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;37025:10:::1;:8;:10::i;:::-;36976:67::o:0;35477:583::-;35652:19;;35633:15;:38;;35600:110;;;;-1:-1:-1;;;35600:110:0;;10408:2:1;35600:110:0;;;10390:21:1;10447:2;10427:18;;;10420:30;10486:34;10466:18;;;10459:62;-1:-1:-1;;;10537:18:1;;;10530:31;10578:19;;35600:110:0;10206:397:1;35600:110:0;35762:18;;35729:52;;-1:-1:-1;;;;;35729:32:0;;;35762:18;;35729:32;:52::i;:::-;35721:81;;;;-1:-1:-1;;;35721:81:0;;12746:2:1;35721:81:0;;;12728:21:1;12785:2;12765:18;;;12758:30;-1:-1:-1;;;12804:18:1;;;12797:46;12860:18;;35721:81:0;12544:340:1;35721:81:0;35815:26;35852:14;35815:52;;35902:18;-1:-1:-1;;;;;35902:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35886:42:0;860:10;-1:-1:-1;;;;;35886:42:0;;35878:51;;;;;;-1:-1:-1;;;;;;35942:34:0;;;;;;;:18;:34;;;;;;;;:51;;-1:-1:-1;;;;;;35942:51:0;;;;;;;;;;;;36004:14;:30;;;;;:48;35477:583::o;37932:132::-;38003:4;38027:18;38046:9;38027:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37932:132;-1:-1:-1;;37932:132:0:o;32431:617::-;27112:4;27136:7;-1:-1:-1;;;27136:7:0;;;;27390:9;27382:38;;;;-1:-1:-1;;;27382:38:0;;10810:2:1;27382:38:0;;;10792:21:1;10849:2;10829:18;;;10822:30;-1:-1:-1;;;10868:18:1;;;10861:46;10924:18;;27382:38:0;10608:340:1;27382:38:0;30069:1:::1;30667:7;;:19;;30659:63;;;::::0;-1:-1:-1;;;30659:63:0;;13809:2:1;30659:63:0::1;::::0;::::1;13791:21:1::0;13848:2;13828:18;;;13821:30;13887:33;13867:18;;;13860:61;13938:18;;30659:63:0::1;13607:355:1::0;30659:63:0::1;30069:1;30800:7;:18:::0;32727:9:::2;:18:::0;-1:-1:-1;32727:18:0::2;32719:83;;;::::0;-1:-1:-1;;;32719:83:0;;12325:2:1;32719:83:0::2;::::0;::::2;12307:21:1::0;12364:2;12344:18;;;12337:30;12403:34;12383:18;;;12376:62;-1:-1:-1;;;12454:18:1;;;12447:50;12514:19;;32719:83:0::2;12123:416:1::0;32719:83:0::2;32850:142;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;32850:142:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;33005:35:::2;32850:142:::0;33023:9;33034:5;33005:6:::2;:35::i;:::-;-1:-1:-1::0;;30025:1:0::1;30979:22:::0;;-1:-1:-1;;;;;;32431:617:0:o;2711:103::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;2776:30:::1;2803:1;2776:18;:30::i;36816:63::-:0;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;36863:8:::1;:6;:8::i;37749:109::-:0;37846:4;37814:18;37833:9;37814:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;-1:-1:-1;;37814:36:0;;;;;;;;;-1:-1:-1;37749:109:0:o;2969:201::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3058:22:0;::::1;3050:73;;;::::0;-1:-1:-1;;;3050:73:0;;8765:2:1;3050:73:0::1;::::0;::::1;8747:21:1::0;8804:2;8784:18;;;8777:30;8843:34;8823:18;;;8816:62;-1:-1:-1;;;8894:18:1;;;8887:36;8940:19;;3050:73:0::1;8563:402:1::0;3050:73:0::1;3134:28;3153:8;3134:18;:28::i;:::-;2969:201:::0;:::o;28124:120::-;27112:4;27136:7;-1:-1:-1;;;27136:7:0;;;;27660:41;;;;-1:-1:-1;;;27660:41:0;;7697:2:1;27660:41:0;;;7679:21:1;7736:2;7716:18;;;7709:30;-1:-1:-1;;;7755:18:1;;;7748:50;7815:18;;27660:41:0;7495:344:1;27660:41:0;28193:5:::1;28183:15:::0;;-1:-1:-1;;;;28183:15:0::1;::::0;;28214:22:::1;860:10:::0;28223:12:::1;28214:22;::::0;-1:-1:-1;;;;;5288:32:1;;;5270:51;;5258:2;5243:18;28214:22:0::1;;;;;;;28124:120::o:0;10847:277::-;10934:4;11043:23;11058:7;11043:14;:23::i;:::-;:73;;;;;11070:46;11095:7;11104:11;11070:24;:46::i;:::-;11036:80;;10847:277;;;;;:::o;33168:2179::-;33348:27;33365:9;33348:16;:27::i;:::-;33347:28;33339:71;;;;-1:-1:-1;;;33339:71:0;;8406:2:1;33339:71:0;;;8388:21:1;8445:2;8425:18;;;8418:30;8484:32;8464:18;;;8457:60;8534:18;;33339:71:0;8204:354:1;33339:71:0;33506:16;;-1:-1:-1;;;;;37656:31:0;37632:4;37656:31;;;:15;:31;;;;;;;;33489:34;33481:86;;;;-1:-1:-1;;;33481:86:0;;9597:2:1;33481:86:0;;;9579:21:1;9636:2;9616:18;;;9609:30;9675:34;9655:18;;;9648:62;-1:-1:-1;;;9726:18:1;;;9719:37;9773:19;;33481:86:0;9395:403:1;33481:86:0;33625:46;33650:9;33661;33625:24;:46::i;:::-;33617:96;;;;-1:-1:-1;;;33617:96:0;;11155:2:1;33617:96:0;;;11137:21:1;11194:2;11174:18;;;11167:30;11233:34;11213:18;;;11206:62;-1:-1:-1;;;11284:18:1;;;11277:35;11329:19;;33617:96:0;10953:401:1;33617:96:0;33829:18;;33787:23;;;;:61;;-1:-1:-1;;;;;33787:41:0;;;;33829:18;;33787:41;:61::i;:::-;33779:90;;;;-1:-1:-1;;;33779:90:0;;12746:2:1;33779:90:0;;;12728:21:1;12785:2;12765:18;;;12758:30;-1:-1:-1;;;12804:18:1;;;12797:46;12860:18;;33779:90:0;12544:340:1;33779:90:0;33941:9;:20;;;33923:15;:38;33914:81;;;;-1:-1:-1;;;33914:81:0;;13091:2:1;33914:81:0;;;13073:21:1;13130:2;13110:18;;;13103:30;13169;13149:18;;;13142:58;13217:18;;33914:81:0;12889:352:1;33914:81:0;34033:23;;;;34154:16;;34132:17;;;;;34117:33;;-1:-1:-1;;;34117:33:0;;;;;14113:25:1;;;;-1:-1:-1;;;;;34117:53:0;;;;:14;;;;;14086:18:1;;34117:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34117:53:0;;34108:100;;;;-1:-1:-1;;;34108:100:0;;13448:2:1;34108:100:0;;;13430:21:1;;;13467:18;;;13460:30;13526:34;13506:18;;;13499:62;13578:18;;34108:100:0;13246:356:1;34108:100:0;34329:16;;34305:56;;-1:-1:-1;;;34305:56:0;;-1:-1:-1;;;;;5570:15:1;;;34305:56:0;;;5552:34:1;34355:4:0;5602:18:1;;;5595:43;34305:23:0;;;;;;5487:18:1;;34305:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34297:125;;;;-1:-1:-1;;;34297:125:0;;9172:2:1;34297:125:0;;;9154:21:1;9211:2;9191:18;;;9184:30;9250:34;9230:18;;;9223:62;9321:26;9301:18;;;9294:54;9365:19;;34297:125:0;8970:420:1;34297:125:0;34538:23;;;;;-1:-1:-1;;;;;34523:39:0;34498:21;34523:39;;;:14;:39;;;;;;;34578:4;;34523:51;;34565:9;;34523:51;:::i;:::-;34522:60;;;;:::i;:::-;34498:84;;34593:19;34649:4;34636:9;34616:17;;:29;;;;:::i;:::-;34615:38;;;;:::i;:::-;34593:60;-1:-1:-1;34664:23:0;34593:60;34690:25;34702:13;34690:9;:25;:::i;:::-;:39;;;;:::i;:::-;34664:65;-1:-1:-1;34746:17:0;;34742:199;;34838:23;;;;;-1:-1:-1;;;;;34819:43:0;;;34780:36;34819:43;;;:18;:43;;;;;;;;34877:52;;34819:43;;;;;34911:13;;34877:52;34780:36;34877:52;34911:13;34819:43;34877:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34765:176;34742:199;34953:12;;:42;;-1:-1:-1;;;;;34953:12:0;;;;34979:11;;34953:42;;;;34979:11;34953:12;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35006:16:0;;:50;;-1:-1:-1;;;;;35006:21:0;;;;-1:-1:-1;35036:15:0;;35006:16;:50;:16;:50;35036:15;35006:21;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35130:16:0;;35155:17;;;;;35106:67;;-1:-1:-1;;;35106:67:0;;-1:-1:-1;;;;;5923:15:1;;;35106:67:0;;;5905:34:1;5975:15;;;5955:18;;;5948:43;6007:18;;;6000:34;;;;35106:23:0;;;;-1:-1:-1;35106:23:0;;5840:18:1;;35106:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35218:4;35186:18;35205:9;35186:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:36;;-1:-1:-1;;35186:36:0;;;;;;;;;;;35304:17;;;;35279:23;;;;35254:16;;35323:15;;;;-1:-1:-1;;;;;6253:32:1;;;6235:51;;6302:18;;;6295:34;35304:17:0;;35238:101;;;;;;;;;;6208:18:1;35238:101:0;;;;;;;33274:2073;;;;33168:2179;;;:::o;3330:191::-;3404:16;3423:6;;-1:-1:-1;;;;;3440:17:0;;;-1:-1:-1;;;;;;3440:17:0;;;;;;3473:40;;3423:6;;;;;;;3473:40;;3404:16;3473:40;3393:128;3330:191;:::o;27865:118::-;27112:4;27136:7;-1:-1:-1;;;27136:7:0;;;;27390:9;27382:38;;;;-1:-1:-1;;;27382:38:0;;10810:2:1;27382:38:0;;;10792:21:1;10849:2;10829:18;;;10822:30;-1:-1:-1;;;10868:18:1;;;10861:46;10924:18;;27382:38:0;10608:340:1;27382:38:0;27925:7:::1;:14:::0;;-1:-1:-1;;;;27925:14:0::1;-1:-1:-1::0;;;27925:14:0::1;::::0;;27955:20:::1;27962:12;860:10:::0;;780:98;10204:417;10268:4;10479:60;10504:7;-1:-1:-1;;;10479:24:0;:60::i;:::-;:134;;;;-1:-1:-1;10557:56:0;10582:7;-1:-1:-1;;;;;;10557:24:0;:56::i;:::-;10556:57;10459:154;10204:417;-1:-1:-1;;10204:417:0:o;13808:414::-;13947:71;;;-1:-1:-1;;;;;;7097:33:1;;13947:71:0;;;;7079:52:1;;;;13947:71:0;;;;;;;;;;7052:18:1;;;;13947:71:0;;;;;;;-1:-1:-1;;;;;13947:71:0;-1:-1:-1;;;13947:71:0;;;14067:45;;13901:4;;13947:71;13901:4;;;;-1:-1:-1;;;;;14067:18:0;;;14091:5;;14067:45;;13947:71;;14067:45;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14029:83;;;;14143:2;14127:6;:13;:18;14123:36;;;14154:5;14147:12;;;;;;;14123:36;14177:7;:37;;;;;14199:6;14188:26;;;;;;;;;;;;:::i;:::-;14170:44;13808:414;-1:-1:-1;;;;;;13808:414:0:o;38171:545::-;38286:4;38305:15;38323:258;38397:9;:16;;;38432:9;:23;;;38474:9;:17;;;38510:9;:20;;;38549:9;:15;;;38362:217;;;;;;;;;;;3874:2:1;3870:15;;;-1:-1:-1;;3866:24:1;;;3854:37;;3925:15;;;;3921:24;;;3916:2;3907:12;;3900:46;3971:2;3962:12;;3955:28;;;;4008:2;3999:12;;3992:28;4045:3;4036:13;;4029:29;4083:3;4074:13;;3547:546;38362:217:0;;;;-1:-1:-1;;38362:217:0;;;;;;;;;38352:228;;38362:217;38352:228;;;;4771:66:1;24816:58:0;;;4759:79:1;4854:12;;;;4847:28;;;;24816:58:0;;;;;;;;;;4891:12:1;;;;24816:58:0;;;24806:69;;;;;;24614:269;38323:258;38305:276;;38594:23;38620:33;38634:7;38643:9;38620:13;:33::i;:::-;38692:16;;-1:-1:-1;;;;;38673:35:0;;;;;;;-1:-1:-1;;;38171:545:0;;;;:::o;20765:231::-;20843:7;20864:17;20883:18;20905:27;20916:4;20922:9;20905:10;:27::i;:::-;20863:69;;;;20943:18;20955:5;20943:11;:18::i;:::-;-1:-1:-1;20979:9:0;20765:231;-1:-1:-1;;;20765:231:0:o;18655:1308::-;18736:7;18745:12;18970:9;:16;18990:2;18970:22;18966:990;;;19266:4;19251:20;;19245:27;19316:4;19301:20;;19295:27;19374:4;19359:20;;19353:27;19009:9;19345:36;19417:25;19428:4;19345:36;19245:27;19295;19417:10;:25::i;:::-;19410:32;;;;;;;;;18966:990;19464:9;:16;19484:2;19464:22;19460:496;;;19739:4;19724:20;;19718:27;19790:4;19775:20;;19769:27;19832:23;19843:4;19718:27;19769;19832:10;:23::i;:::-;19825:30;;;;;;;;19460:496;-1:-1:-1;19904:1:0;;-1:-1:-1;19908:35:0;19460:496;18655:1308;;;;;:::o;16926:643::-;17004:20;16995:5;:29;;;;;;;;:::i;:::-;;16991:571;;;16926:643;:::o;16991:571::-;17102:29;17093:5;:38;;;;;;;;:::i;:::-;;17089:473;;;17148:34;;-1:-1:-1;;;17148:34:0;;7344:2:1;17148:34:0;;;7326:21:1;7383:2;7363:18;;;7356:30;7422:26;7402:18;;;7395:54;7466:18;;17148:34:0;7142:348:1;17089:473:0;17213:35;17204:5;:44;;;;;;;;:::i;:::-;;17200:362;;;17265:41;;-1:-1:-1;;;17265:41:0;;8046:2:1;17265:41:0;;;8028:21:1;8085:2;8065:18;;;8058:30;8124:33;8104:18;;;8097:61;8175:18;;17265:41:0;7844:355:1;17200:362:0;17337:30;17328:5;:39;;;;;;;;:::i;:::-;;17324:238;;;17384:44;;-1:-1:-1;;;17384:44:0;;10005:2:1;17384:44:0;;;9987:21:1;10044:2;10024:18;;;10017:30;10083:34;10063:18;;;10056:62;-1:-1:-1;;;10134:18:1;;;10127:32;10176:19;;17384:44:0;9803:398:1;17324:238:0;17459:30;17450:5;:39;;;;;;;;:::i;:::-;;17446:116;;;17506:44;;-1:-1:-1;;;17506:44:0;;11561:2:1;17506:44:0;;;11543:21:1;11600:2;11580:18;;;11573:30;11639:34;11619:18;;;11612:62;-1:-1:-1;;;11690:18:1;;;11683:32;11732:19;;17506:44:0;11359:398:1;22264:1632:0;22395:7;;23329:66;23316:79;;23312:163;;;-1:-1:-1;23428:1:0;;-1:-1:-1;23432:30:0;23412:51;;23312:163;23489:1;:7;;23494:2;23489:7;;:18;;;;;23500:1;:7;;23505:2;23500:7;;23489:18;23485:102;;;-1:-1:-1;23540:1:0;;-1:-1:-1;23544:30:0;23524:51;;23485:102;23701:24;;;23684:14;23701:24;;;;;;;;;6759:25:1;;;6832:4;6820:17;;6800:18;;;6793:45;;;;6854:18;;;6847:34;;;6897:18;;;6890:34;;;23701:24:0;;6731:19:1;;23701:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23701:24:0;;-1:-1:-1;;23701:24:0;;;-1:-1:-1;;;;;;;23740:20:0;;23736:103;;23793:1;23797:29;23777:50;;;;;;;23736:103;23859:6;-1:-1:-1;23867:20:0;;-1:-1:-1;22264:1632:0;;;;;;;;:::o;21259:391::-;21373:7;;-1:-1:-1;;;;;21474:75:0;;21576:3;21572:12;;;21586:2;21568:21;21617:25;21628:4;21568:21;21637:1;21474:75;21617:10;:25::i;:::-;21610:32;;;;;;21259:391;;;;;;:::o;14:718:1:-;56:5;109:3;102:4;94:6;90:17;86:27;76:55;;127:1;124;117:12;76:55;163:6;150:20;189:18;226:2;222;219:10;216:36;;;232:18;;:::i;:::-;307:2;301:9;275:2;361:13;;-1:-1:-1;;357:22:1;;;381:2;353:31;349:40;337:53;;;405:18;;;425:22;;;402:46;399:72;;;451:18;;:::i;:::-;491:10;487:2;480:22;526:2;518:6;511:18;572:3;565:4;560:2;552:6;548:15;544:26;541:35;538:55;;;589:1;586;579:12;538:55;653:2;646:4;638:6;634:17;627:4;619:6;615:17;602:54;700:1;693:4;688:2;680:6;676:15;672:26;665:37;720:6;711:15;;;;;;14:718;;;;:::o;737:247::-;796:6;849:2;837:9;828:7;824:23;820:32;817:52;;;865:1;862;855:12;817:52;904:9;891:23;923:31;948:5;923:31;:::i;:::-;973:5;737:247;-1:-1:-1;;;737:247:1:o;989:251::-;1059:6;1112:2;1100:9;1091:7;1087:23;1083:32;1080:52;;;1128:1;1125;1118:12;1080:52;1160:9;1154:16;1179:31;1204:5;1179:31;:::i;1505:961::-;1643:6;1651;1659;1667;1675;1683;1691;1744:3;1732:9;1723:7;1719:23;1715:33;1712:53;;;1761:1;1758;1751:12;1712:53;1800:9;1787:23;1819:31;1844:5;1819:31;:::i;:::-;1869:5;-1:-1:-1;1926:2:1;1911:18;;1898:32;1939:33;1898:32;1939:33;:::i;:::-;1991:7;-1:-1:-1;2045:2:1;2030:18;;2017:32;;-1:-1:-1;2096:2:1;2081:18;;2068:32;;-1:-1:-1;2147:3:1;2132:19;;2119:33;;-1:-1:-1;2203:3:1;2188:19;;2175:33;2231:18;2220:30;;2217:50;;;2263:1;2260;2253:12;2217:50;2286:49;2327:7;2318:6;2307:9;2303:22;2286:49;:::i;:::-;2276:59;;;2387:3;2376:9;2372:19;2359:33;2401;2426:7;2401:33;:::i;:::-;2453:7;2443:17;;;1505:961;;;;;;;;;;:::o;2471:464::-;2556:6;2564;2572;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;2680:9;2667:23;2699:31;2724:5;2699:31;:::i;:::-;2749:5;-1:-1:-1;2806:2:1;2791:18;;2778:32;2819:33;2778:32;2819:33;:::i;:::-;2471:464;;2871:7;;-1:-1:-1;;;2925:2:1;2910:18;;;;2897:32;;2471:464::o;2940:277::-;3007:6;3060:2;3048:9;3039:7;3035:23;3031:32;3028:52;;;3076:1;3073;3066:12;3028:52;3108:9;3102:16;3161:5;3154:13;3147:21;3140:5;3137:32;3127:60;;3183:1;3180;3173:12;3222:320;3290:6;3343:2;3331:9;3322:7;3318:23;3314:32;3311:52;;;3359:1;3356;3349:12;3311:52;3399:9;3386:23;3432:18;3424:6;3421:30;3418:50;;;3464:1;3461;3454:12;3418:50;3487:49;3528:7;3519:6;3508:9;3504:22;3487:49;:::i;:::-;3477:59;3222:320;-1:-1:-1;;;;3222:320:1:o;4098:426::-;4227:3;4265:6;4259:13;4290:1;4300:129;4314:6;4311:1;4308:13;4300:129;;;4412:4;4396:14;;;4392:25;;4386:32;4373:11;;;4366:53;4329:12;4300:129;;;4447:6;4444:1;4441:13;4438:48;;;4482:1;4473:6;4468:3;4464:16;4457:27;4438:48;-1:-1:-1;4502:16:1;;;;;4098:426;-1:-1:-1;;4098:426:1:o;11762:356::-;11964:2;11946:21;;;11983:18;;;11976:30;12042:34;12037:2;12022:18;;12015:62;12109:2;12094:18;;11762:356::o;14149:217::-;14189:1;14215;14205:132;;14259:10;14254:3;14250:20;14247:1;14240:31;14294:4;14291:1;14284:15;14322:4;14319:1;14312:15;14205:132;-1:-1:-1;14351:9:1;;14149:217::o;14371:168::-;14411:7;14477:1;14473;14469:6;14465:14;14462:1;14459:21;14454:1;14447:9;14440:17;14436:45;14433:71;;;14484:18;;:::i;:::-;-1:-1:-1;14524:9:1;;14371:168::o;14544:125::-;14584:4;14612:1;14609;14606:8;14603:34;;;14617:18;;:::i;:::-;-1:-1:-1;14654:9:1;;14544:125::o;14674:127::-;14735:10;14730:3;14726:20;14723:1;14716:31;14766:4;14763:1;14756:15;14790:4;14787:1;14780:15;14806:127;14867:10;14862:3;14858:20;14855:1;14848:31;14898:4;14895:1;14888:15;14922:4;14919:1;14912:15;14938:127;14999:10;14994:3;14990:20;14987:1;14980:31;15030:4;15027:1;15020:15;15054:4;15051:1;15044:15;15070:131;-1:-1:-1;;;;;15145:31:1;;15135:42;;15125:70;;15191:1;15188;15181:12
Swarm Source
ipfs://21bcc6fd46c0a3beb0bc95e4142d7c32ecfa72077ae487a38719bb94fa1b438b
Net Worth in USD
Net Worth in ETH
Token Allocations
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,876.17 | 0.001 | $1.88 |
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.