ERC-20
Overview
Max Total Supply
1,077,283 HAYY
Holders
291
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HAYY
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-04 */ // SPDX-License-Identifier: MIT // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol // 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; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // 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); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface 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); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract 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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be 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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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 a {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 a {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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @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 {} } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: wgg.sol pragma solidity 0.8.7; contract WGG is ERC721Burnable, Ownable { using Strings for uint256; using Counters for Counters.Counter; string public baseURI; string public baseExtension = ".json"; uint8 public maxTx = 3; uint256 public maxSupply = 10000; uint256 public price = 0.08 ether; bool public goatPresaleOpen = true; bool public goatMainsaleOpen = false; Counters.Counter private _tokenIdTracker; mapping (address => bool) whiteListed; mapping (address => uint256) walletMinted; constructor(string memory _initBaseURI) ERC721("Wild Goat Gang", "WGG") { setBaseURI(_initBaseURI); for(uint i=0;i<10;i++) { _tokenIdTracker.increment(); _safeMint(msg.sender, totalToken()); } } modifier isPresaleOpen { require(goatPresaleOpen == true); _; } modifier isMainsaleOpen { require(goatMainsaleOpen == true); _; } function flipPresale() public onlyOwner { goatPresaleOpen = false; goatMainsaleOpen = true; } function changeMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function totalToken() public view returns (uint256) { return _tokenIdTracker.current(); } function addWhiteList(address[] memory whiteListedAddresses) public onlyOwner { for(uint256 i=0; i<whiteListedAddresses.length;i++) { whiteListed[whiteListedAddresses[i]] = true; } } function isAddressWhitelisted(address whitelist) public view returns(bool) { return whiteListed[whitelist]; } function preSale(uint8 mintTotal) public payable isPresaleOpen { uint256 totalMinted = mintTotal + walletMinted[msg.sender]; require(whiteListed[msg.sender] == true, "You are not whitelisted!"); require(totalMinted <= maxTx, "Mint exceeds limitations"); require(mintTotal >= 1 , "Mint Amount Incorrect"); require(msg.value >= price * mintTotal, "Minting a Wild Goat Costs 0.08 Ether Each!"); require(totalToken() < maxSupply, "SOLD OUT!"); for(uint i=0;i<mintTotal;i++) { require(totalToken() < maxSupply, "SOLD OUT!"); _tokenIdTracker.increment(); _safeMint(msg.sender, totalToken()); } } function mainSale(uint8 mintTotal) public payable isMainsaleOpen { uint256 totalMinted = mintTotal + walletMinted[msg.sender]; require(totalMinted <= maxTx, "Mint exceeds limitations"); require(mintTotal >= 1 , "Mint Amount Incorrect"); require(msg.value >= price * mintTotal, "Minting a Wild Goat Costs 0.08 Ether Each!"); require(totalToken() < maxSupply, "SOLD OUT!"); for(uint i=0;i<mintTotal;i++) { require(totalToken() < maxSupply, "SOLD OUT!"); _tokenIdTracker.increment(); _safeMint(msg.sender, totalToken()); } } function withdrawContractEther() external onlyOwner { address payable teamOne = payable(0x9f199f62a1aCb6877AC6C82759Df34B24A484e9C); address payable teamTwo = payable(0x1599f9F775451DBd03a1a951d4D93107900276A4); address payable teamThree = payable(0xEEe7dB024C2c629556Df7F80f528913048f12fbc); address payable teamFour = payable(0xD43763625605fF5894100B24Db41EB19A9c0E65e); uint256 totalSplit = (getBalance() / 4); teamOne.transfer(totalSplit); teamTwo.transfer(totalSplit); teamThree.transfer(totalSplit); teamFour.transfer(totalSplit); } function getBalance() public view returns(uint) { return address(this).balance; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } } // File: ERC20I.sol pragma solidity ^0.8.0; contract ERC20I { // Token Params string public name; string public symbol; constructor(string memory name_, string memory symbol_) { name = name_; symbol = symbol_; } // Decimals uint8 public constant decimals = 18; // Supply uint256 public totalSupply; // Mappings of Balances mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; // Events event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // Internal Functions function _mint(address to_, uint256 amount_) internal virtual { totalSupply += amount_; balanceOf[to_] += amount_; emit Transfer(address(0x0), to_, amount_); } function _burn(address from_, uint256 amount_) internal virtual { balanceOf[from_] -= amount_; totalSupply -= amount_; emit Transfer(from_, address(0x0), amount_); } function _approve(address owner_, address spender_, uint256 amount_) internal virtual { allowance[owner_][spender_] = amount_; emit Approval(owner_, spender_, amount_); } // Public Functions function approve(address spender_, uint256 amount_) public virtual returns (bool) { _approve(msg.sender, spender_, amount_); return true; } function transfer(address to_, uint256 amount_) public virtual returns (bool) { balanceOf[msg.sender] -= amount_; balanceOf[to_] += amount_; emit Transfer(msg.sender, to_, amount_); return true; } function transferFrom(address from_, address to_, uint256 amount_) public virtual returns (bool) { if (allowance[from_][msg.sender] != type(uint256).max) { allowance[from_][msg.sender] -= amount_; } balanceOf[from_] -= amount_; balanceOf[to_] += amount_; emit Transfer(from_, to_, amount_); return true; } // 0xInuarashi Custom Functions function multiTransfer(address[] memory to_, uint256[] memory amounts_) public virtual { require(to_.length == amounts_.length, "ERC20I: To and Amounts length Mismatch!"); for (uint256 i = 0; i < to_.length; i++) { transfer(to_[i], amounts_[i]); } } function multiTransferFrom(address[] memory from_, address[] memory to_, uint256[] memory amounts_) public virtual { require(from_.length == to_.length && from_.length == amounts_.length, "ERC20I: From, To, and Amounts length Mismatch!"); for (uint256 i = 0; i < from_.length; i++) { transferFrom(from_[i], to_[i], amounts_[i]); } } } abstract contract ERC20IBurnable is ERC20I { function burn(uint256 amount_) external virtual { _burn(msg.sender, amount_); } function burnFrom(address from_, uint256 amount_) public virtual { uint256 _currentAllowance = allowance[from_][msg.sender]; require(_currentAllowance >= amount_, "ERC20IBurnable: Burn amount requested exceeds allowance!"); if (allowance[from_][msg.sender] != type(uint256).max) { allowance[from_][msg.sender] -= amount_; } _burn(from_, amount_); } } // File: hayy.sol pragma solidity 0.8.7; contract HAYY is ERC20IBurnable, IERC721Receiver, Ownable { constructor() ERC20I("HAYY", "HAYY") {} using EnumerableSet for EnumerableSet.UintSet; mapping(address => EnumerableSet.UintSet) private _deposits; mapping(address => bool) public addressStaked; mapping(uint256 => uint256) public tokenIDDays; WGG public wildGoat = WGG(0xd151BbC88DB8A7803a2ca7a9722037aBdAca9B8e); uint256 ratePerDay = 10 ether; uint256 lockingPeriod = 1; uint256 tier1Hayy = 600 ether; uint256 tier1Cost = 0.5 ether; uint256 tier2Hayy = 1000 ether; uint256 tier2Cost = 1 ether; uint256 tier3Hayy = 2250 ether; uint256 tier3Cost = 2.5 ether; uint256[] public burnedTokens; function addBurnedTokens(uint256 tokenId) public onlyOwner { burnedTokens.push(tokenId); } function changeTier1(uint256 totalHayy, uint256 hayCost) public onlyOwner { tier1Hayy = (totalHayy * 10 ** 18); tier1Cost = (hayCost * 10 ** 18); } function changeTier2(uint256 totalHayy, uint256 hayCost) public onlyOwner { tier2Hayy = (totalHayy * 10 ** 18); tier2Cost = (hayCost * 10 ** 18); } function changeTier3(uint256 totalHayy, uint256 hayCost) public onlyOwner { tier3Hayy = (totalHayy * 10 ** 18); tier3Cost = (hayCost * 10 ** 18); } function devMint(uint256 amount) public onlyOwner { _mint(msg.sender, (amount * 10 ** 18)); } function setWGGAddress(address incoming) public onlyOwner { wildGoat = WGG(incoming); } function buyHayy(uint256 tierLevel) public payable { require(tierLevel >= 1 && tierLevel <= 3); if(tierLevel == 1) { require(msg.value >= tier1Cost); _mint(msg.sender, tier1Hayy); } else if(tierLevel == 2) { require(msg.value >= tier2Cost); _mint(msg.sender, tier2Hayy); } else if(tierLevel == 3) { require(msg.value >= tier3Cost); _mint(msg.sender, tier3Hayy); } } function changeRatePerDay(uint256 _rate) public onlyOwner { ratePerDay = (_rate * 10 ** 18); } function changeLockingPeriod(uint256 _period) public onlyOwner { lockingPeriod = _period; } function stakeGoat(uint256[] calldata tokenIDs) external { require(wildGoat.isApprovedForAll(msg.sender, address(this)), "You are not Approved!"); for (uint256 i; i < tokenIDs.length; i++) { wildGoat.safeTransferFrom( msg.sender, address(this), tokenIDs[i], '' ); _deposits[msg.sender].add(tokenIDs[i]); addressStaked[msg.sender] = true; tokenIDDays[tokenIDs[i]] = block.timestamp; } } function unstakeGoat(uint256[] calldata tokenIds) external { require(wildGoat.isApprovedForAll(msg.sender, address(this)), "You are not Approved!"); this.claimHayy(); for (uint256 i; i < tokenIds.length; i++) { require( _deposits[msg.sender].contains(tokenIds[i]), 'Token not deposited' ); require(daysStaked(tokenIds[i]) >= lockingPeriod, "You must be staked for at least 3 days!"); _deposits[msg.sender].remove(tokenIds[i]); wildGoat.safeTransferFrom( address(this), msg.sender, tokenIds[i], '' ); } if(_deposits[msg.sender].length() < 1) { addressStaked[msg.sender] = false; } } function returnStakedGoats() public view returns (uint256[] memory) { return _deposits[msg.sender].values(); } function claimHayy() external { uint256 totalReward = 0; for(uint256 i = 0; i < _deposits[msg.sender].length(); i++) { totalReward += rewardsToPay(_deposits[msg.sender].at(i)); tokenIDDays[_deposits[msg.sender].at(i)] = block.timestamp; } _mint(msg.sender, totalReward); } function rewardsToPay(uint256 tokenID) internal view returns(uint256) { uint256 earnedRewards = daysStaked(tokenID) * ratePerDay; return earnedRewards; } function daysStaked(uint256 tokenID) public view returns(uint256) { require( _deposits[msg.sender].contains(tokenID), 'Token not deposited' ); uint256 returndays; uint256 timeCalc = block.timestamp - tokenIDDays[tokenID]; returndays = timeCalc / 86400; return returndays; } function totalYieldEarned() public view returns(uint256) { uint256 totalReward = 0; for(uint256 i = 0; i < _deposits[msg.sender].length(); i++) { totalReward += rewardsToPay(_deposits[msg.sender].at(i)); } return totalReward; } function goatsStaked() public view returns (uint256[] memory) { return _deposits[msg.sender].values(); } function withdrawContractEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function walletOfOwner(address address_) public view returns (uint256[] memory) { uint256 _balance = wildGoat.balanceOf(address_); if (_balance == 0) return new uint256[](0); uint256[] memory _tokens = new uint256[] (_balance); uint256 _index; bool burned = false; for (uint256 i = 1; i <= wildGoat.totalToken(); i++) { burned = false; for(uint256 x=0; x<burnedTokens.length;x++) { if(i == burnedTokens[x]) { burned = true; } } if(!burned) { if (wildGoat.ownerOf(i) == address_) { _tokens[_index] = i; _index++; } } } return _tokens; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"addBurnedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tierLevel","type":"uint256"}],"name":"buyHayy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"changeLockingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"changeRatePerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimHayy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"daysStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goatsStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from_","type":"address[]"},{"internalType":"address[]","name":"to_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"returnStakedGoats","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"incoming","type":"address"}],"name":"setWGGAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"stakeGoat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalYieldEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeGoat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wildGoat","outputs":[{"internalType":"contract WGG","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600980546001600160a01b03191673d151bbc88db8a7803a2ca7a9722037abdaca9b8e179055678ac7230489e80000600a556001600b55682086ac351052600000600c556706f05b59d3b20000600d55683635c9adc5dea00000600e55670de0b6b3a7640000600f556879f905c6fd34e800006010556722b1c8c1227a00006011553480156200009357600080fd5b506040805180820182526004808252634841595960e01b602080840182815285518087019096529285528401528151919291620000d39160009162000162565b508051620000e990600190602084019062000162565b50505062000106620001006200010c60201b60201c565b62000110565b62000245565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001709062000208565b90600052602060002090601f016020900481019282620001945760008555620001df565b82601f10620001af57805160ff1916838001178555620001df565b82800160010185558215620001df579182015b82811115620001df578251825591602001919060010190620001c2565b50620001ed929150620001f1565b5090565b5b80821115620001ed5760008155600101620001f2565b600181811c908216806200021d57607f821691505b602082108114156200023f57634e487b7160e01b600052602260045260246000fd5b50919050565b6124e080620002556000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063a9059cbb116100ab578063d7ca7cc51161006f578063d7ca7cc51461068c578063dd62ed3e146106ac578063e74d059f146106e4578063ec03cfdf14610714578063f2fde38b1461073457600080fd5b8063a9059cbb146105ea578063c9359d151461060a578063cc00967914610637578063ce3d179c1461064c578063d5e7be561461066c57600080fd5b80638313e905116100f25780638313e905146105505780638da5cb5b14610563578063906ca0231461059557806392e47417146105b557806395d89b41146105d557600080fd5b806370a08231146104ae578063715018a6146104db57806371ab145c146104f057806379cc6790146105105780637bde17a31461053057600080fd5b806323c8bcd5116101bc578063438b630011610180578063438b63001461044457806352143d4d146104645780635c77ddab14610479578063642f063b14610290578063671388c01461048e57600080fd5b806323c8bcd51461039d57806328b5ddc7146103bd578063313ce567146103dd578063375a069a1461040457806342966c681461042457600080fd5b8063150b7a0211610203578063150b7a02146102d457806318160ddd146103195780631c348dd31461033d5780631e89d5451461035d57806323b872dd1461037d57600080fd5b806306fdde0314610235578063095ea7b3146102605780630b65d1df1461029057806311d3ed36146102b2575b600080fd5b34801561024157600080fd5b5061024a610754565b604051610257919061227e565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612037565b6107e2565b6040519015158152602001610257565b34801561029c57600080fd5b506102a56107f9565b604051610257919061223a565b3480156102be57600080fd5b506102d26102cd366004612218565b610819565b005b3480156102e057600080fd5b506103006102ef366004611f98565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610257565b34801561032557600080fd5b5061032f60025481565b604051908152602001610257565b34801561034957600080fd5b5061032f6103583660046121e6565b61087a565b34801561036957600080fd5b506102d26103783660046120eb565b61089b565b34801561038957600080fd5b50610280610398366004611f57565b61095c565b3480156103a957600080fd5b506102d26103b836600461214f565b610a62565b3480156103c957600080fd5b506102d26103d83660046121e6565b610c65565b3480156103e957600080fd5b506103f2601281565b60405160ff9091168152602001610257565b34801561041057600080fd5b506102d261041f3660046121e6565b610cc4565b34801561043057600080fd5b506102d261043f3660046121e6565b610d0c565b34801561045057600080fd5b506102a561045f366004611ee4565b610d16565b34801561047057600080fd5b506102d2610fb7565b34801561048557600080fd5b506102d2611056565b34801561049a57600080fd5b506102d26104a93660046121e6565b6110ac565b3480156104ba57600080fd5b5061032f6104c9366004611ee4565b60036020526000908152604090205481565b3480156104e757600080fd5b506102d26110ee565b3480156104fc57600080fd5b506102d261050b366004612218565b611124565b34801561051c57600080fd5b506102d261052b366004612037565b61117c565b34801561053c57600080fd5b506102d261054b366004612063565b611285565b6102d261055e3660046121e6565b611375565b34801561056f57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b3480156105a157600080fd5b506102d26105b0366004612218565b6113fc565b3480156105c157600080fd5b5061032f6105d03660046121e6565b611454565b3480156105e157600080fd5b5061024a6114e1565b3480156105f657600080fd5b50610280610605366004612037565b6114ee565b34801561061657600080fd5b5061032f6106253660046121e6565b60086020526000908152604090205481565b34801561064357600080fd5b5061032f611578565b34801561065857600080fd5b506102d2610667366004611ee4565b6115dd565b34801561067857600080fd5b5060095461057d906001600160a01b031681565b34801561069857600080fd5b506102d26106a73660046121e6565b611629565b3480156106b857600080fd5b5061032f6106c7366004611f1e565b600460209081526000928352604080842090915290825290205481565b3480156106f057600080fd5b506102806106ff366004611ee4565b60076020526000908152604090205460ff1681565b34801561072057600080fd5b506102d261072f36600461214f565b611658565b34801561074057600080fd5b506102d261074f366004611ee4565b611999565b60008054610761906123cd565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906123cd565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b505050505081565b60006107ef338484611a31565b5060015b92915050565b33600090815260066020526040902060609061081490611a92565b905090565b6005546001600160a01b0316331461084c5760405162461bcd60e51b8152600401610843906122d3565b60405180910390fd5b61085e82670de0b6b3a7640000612397565b600e5561087381670de0b6b3a7640000612397565b600f555050565b6012818154811061088a57600080fd5b600091825260209091200154905081565b80518251146108fc5760405162461bcd60e51b815260206004820152602760248201527f4552433230493a20546f20616e6420416d6f756e7473206c656e677468204d69604482015266736d617463682160c81b6064820152608401610843565b60005b82518110156109575761094483828151811061091d5761091d612449565b602002602001015183838151811061093757610937612449565b60200260200101516114ee565b508061094f81612402565b9150506108ff565b505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146109c1576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906109bb9084906123b6565b90915550505b6001600160a01b038416600090815260036020526040812080548492906109e99084906123b6565b90915550506001600160a01b03831660009081526003602052604081208054849290610a1690849061235d565b92505081905550826001600160a01b0316846001600160a01b031660008051602061248b83398151915284604051610a5091815260200190565b60405180910390a35060019392505050565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015610aab57600080fd5b505afa158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae391906121c4565b610b275760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b60005b81811015610957576009546001600160a01b031663b88d4fde3330868686818110610b5757610b57612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b50505050610c07838383818110610be957610be9612449565b33600090815260066020908152604090912093910201359050611aa6565b50336000908152600760205260408120805460ff191660011790554290600890858585818110610c3957610c39612449565b905060200201358152602001908152602001600020819055508080610c5d90612402565b915050610b2a565b6005546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610843906122d3565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b6005546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610843906122d3565b610d0933610d0483670de0b6b3a7640000612397565b611ab2565b50565b610d093382611b2a565b6009546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610d6057600080fd5b505afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9891906121ff565b905080610db5575050604080516000815260208101909152919050565b60008167ffffffffffffffff811115610dd057610dd061245f565b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b50905060008060015b600960009054906101000a90046001600160a01b03166001600160a01b031663626be5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906121ff565b8111610fac576000915060005b601254811015610edb5760128181548110610eb257610eb2612449565b9060005260206000200154821415610ec957600192505b80610ed381612402565b915050610e95565b5081610f9a576009546040516331a9108f60e11b8152600481018390526001600160a01b03898116921690636352211e9060240160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f9190611f01565b6001600160a01b03161415610f9a5780848481518110610f8157610f81612449565b602090810291909101015282610f9681612402565b9350505b80610fa481612402565b915050610e02565b509195945050505050565b6000805b336000908152600660205260409020610fd390611b9c565b81101561104b57336000908152600660205260409020610ffc90610ff79083611ba6565b611bb2565b611006908361235d565b3360009081526006602052604081209193504291600891906110289085611ba6565b81526020810191909152604001600020558061104381612402565b915050610fbb565b50610d093382611ab2565b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610843906122d3565b60405133904780156108fc02916000818181858888f19350505050158015610d09573d6000803e3d6000fd5b6005546001600160a01b031633146110d65760405162461bcd60e51b8152600401610843906122d3565b6110e881670de0b6b3a7640000612397565b600a5550565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610843906122d3565b6111226000611bcb565b565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610843906122d3565b61116082670de0b6b3a7640000612397565b600c5561117581670de0b6b3a7640000612397565b600d555050565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156112165760405162461bcd60e51b815260206004820152603860248201527f4552433230494275726e61626c653a204275726e20616d6f756e74207265717560448201527f6573746564206578636565647320616c6c6f77616e63652100000000000000006064820152608401610843565b6001600160a01b03831660009081526004602090815260408083203384529091529020546000191461127b576001600160a01b0383166000908152600460209081526040808320338452909152812080548492906112759084906123b6565b90915550505b6109578383611b2a565b81518351148015611297575080518351145b6112fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433230493a2046726f6d2c20546f2c20616e6420416d6f756e7473206c6560448201526d6e677468204d69736d617463682160901b6064820152608401610843565b60005b835181101561136f5761135c84828151811061131b5761131b612449565b602002602001015184838151811061133557611335612449565b602002602001015184848151811061134f5761134f612449565b602002602001015161095c565b508061136781612402565b9150506112fd565b50505050565b60018110158015611387575060038111155b61139057600080fd5b80600114156113b457600d543410156113a857600080fd5b610d0933600c54611ab2565b80600214156113d857600f543410156113cc57600080fd5b610d0933600e54611ab2565b8060031415610d09576011543410156113f057600080fd5b610d0933601054611ab2565b6005546001600160a01b031633146114265760405162461bcd60e51b8152600401610843906122d3565b61143882670de0b6b3a7640000612397565b60105561144d81670de0b6b3a7640000612397565b6011555050565b33600090815260066020526040812061146d9083611c1d565b6114af5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b60008281526008602052604081205481906114ca90426123b6565b90506114d96201518082612375565b949350505050565b60018054610761906123cd565b3360009081526003602052604081208054839190839061150f9084906123b6565b90915550506001600160a01b0383166000908152600360205260408120805484929061153c90849061235d565b90915550506040518281526001600160a01b03841690339060008051602061248b8339815191529060200160405180910390a350600192915050565b600080805b33600090815260066020526040902061159590611b9c565b8110156115d7573360009081526006602052604090206115b990610ff79083611ba6565b6115c3908361235d565b9150806115cf81612402565b91505061157d565b50919050565b6005546001600160a01b031633146116075760405162461bcd60e51b8152600401610843906122d3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116535760405162461bcd60e51b8152600401610843906122d3565b600b55565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906121c4565b61171d5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b306001600160a01b03166352143d4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175857600080fd5b505af115801561176c573d6000803e3d6000fd5b5050505060005b8181101561195b576117ae83838381811061179057611790612449565b33600090815260066020908152604090912093910201359050611c1d565b6117f05760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b600b5461181484848481811061180857611808612449565b90506020020135611454565b10156118725760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206265207374616b656420666f72206174206c65617374206044820152663320646179732160c81b6064820152608401610843565b6118a583838381811061188757611887612449565b33600090815260066020908152604090912093910201359050611c35565b506009546001600160a01b031663b88d4fde30338686868181106118cb576118cb612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561193057600080fd5b505af1158015611944573d6000803e3d6000fd5b50505050808061195390612402565b915050611773565b5033600090815260066020526040902060019061197790611b9c565b101561199557336000908152600760205260409020805460ff191690555b5050565b6005546001600160a01b031633146119c35760405162461bcd60e51b8152600401610843906122d3565b6001600160a01b038116611a285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b610d0981611bcb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60606000611a9f83611c41565b9392505050565b6000611a9f8383611c9d565b8060026000828254611ac4919061235d565b90915550506001600160a01b03821660009081526003602052604081208054839290611af190849061235d565b90915550506040518181526001600160a01b0383169060009060008051602061248b833981519152906020015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290611b529084906123b6565b925050819055508060026000828254611b6b91906123b6565b90915550506040518181526000906001600160a01b0384169060008051602061248b83398151915290602001611b1e565b60006107f3825490565b6000611a9f8383611cec565b600080600a54611bc184611454565b611a9f9190612397565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001830160205260408120541515611a9f565b6000611a9f8383611d16565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b815481526020019060010190808311611c7d575b50505050509050919050565b6000818152600183016020526040812054611ce4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107f3565b5060006107f3565b6000826000018281548110611d0357611d03612449565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611dff576000611d3a6001836123b6565b8554909150600090611d4e906001906123b6565b9050818114611db3576000866000018281548110611d6e57611d6e612449565b9060005260206000200154905080876000018481548110611d9157611d91612449565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dc457611dc4612433565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107f3565b60009150506107f3565b600082601f830112611e1a57600080fd5b81356020611e2f611e2a83612339565b612308565b80838252828201915082860187848660051b8901011115611e4f57600080fd5b60005b85811015611e77578135611e6581612475565b84529284019290840190600101611e52565b5090979650505050505050565b600082601f830112611e9557600080fd5b81356020611ea5611e2a83612339565b80838252828201915082860187848660051b8901011115611ec557600080fd5b60005b85811015611e7757813584529284019290840190600101611ec8565b600060208284031215611ef657600080fd5b8135611a9f81612475565b600060208284031215611f1357600080fd5b8151611a9f81612475565b60008060408385031215611f3157600080fd5b8235611f3c81612475565b91506020830135611f4c81612475565b809150509250929050565b600080600060608486031215611f6c57600080fd5b8335611f7781612475565b92506020840135611f8781612475565b929592945050506040919091013590565b600080600080600060808688031215611fb057600080fd5b8535611fbb81612475565b94506020860135611fcb81612475565b935060408601359250606086013567ffffffffffffffff80821115611fef57600080fd5b818801915088601f83011261200357600080fd5b81358181111561201257600080fd5b89602082850101111561202457600080fd5b9699959850939650602001949392505050565b6000806040838503121561204a57600080fd5b823561205581612475565b946020939093013593505050565b60008060006060848603121561207857600080fd5b833567ffffffffffffffff8082111561209057600080fd5b61209c87838801611e09565b945060208601359150808211156120b257600080fd5b6120be87838801611e09565b935060408601359150808211156120d457600080fd5b506120e186828701611e84565b9150509250925092565b600080604083850312156120fe57600080fd5b823567ffffffffffffffff8082111561211657600080fd5b61212286838701611e09565b9350602085013591508082111561213857600080fd5b5061214585828601611e84565b9150509250929050565b6000806020838503121561216257600080fd5b823567ffffffffffffffff8082111561217a57600080fd5b818501915085601f83011261218e57600080fd5b81358181111561219d57600080fd5b8660208260051b85010111156121b257600080fd5b60209290920196919550909350505050565b6000602082840312156121d657600080fd5b81518015158114611a9f57600080fd5b6000602082840312156121f857600080fd5b5035919050565b60006020828403121561221157600080fd5b5051919050565b6000806040838503121561222b57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561227257835183529284019291840191600101612256565b50909695505050505050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123315761233161245f565b604052919050565b600067ffffffffffffffff8211156123535761235361245f565b5060051b60200190565b600082198211156123705761237061241d565b500190565b60008261239257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156123b1576123b161241d565b500290565b6000828210156123c8576123c861241d565b500390565b600181811c908216806123e157607f821691505b602082108114156115d757634e487b7160e01b600052602260045260246000fd5b60006000198214156124165761241661241d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220816d6c8aa17353914141bb5bc30775792f30e335f2b8c5c134178704d0c2efd764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102305760003560e01c806370a082311161012e578063a9059cbb116100ab578063d7ca7cc51161006f578063d7ca7cc51461068c578063dd62ed3e146106ac578063e74d059f146106e4578063ec03cfdf14610714578063f2fde38b1461073457600080fd5b8063a9059cbb146105ea578063c9359d151461060a578063cc00967914610637578063ce3d179c1461064c578063d5e7be561461066c57600080fd5b80638313e905116100f25780638313e905146105505780638da5cb5b14610563578063906ca0231461059557806392e47417146105b557806395d89b41146105d557600080fd5b806370a08231146104ae578063715018a6146104db57806371ab145c146104f057806379cc6790146105105780637bde17a31461053057600080fd5b806323c8bcd5116101bc578063438b630011610180578063438b63001461044457806352143d4d146104645780635c77ddab14610479578063642f063b14610290578063671388c01461048e57600080fd5b806323c8bcd51461039d57806328b5ddc7146103bd578063313ce567146103dd578063375a069a1461040457806342966c681461042457600080fd5b8063150b7a0211610203578063150b7a02146102d457806318160ddd146103195780631c348dd31461033d5780631e89d5451461035d57806323b872dd1461037d57600080fd5b806306fdde0314610235578063095ea7b3146102605780630b65d1df1461029057806311d3ed36146102b2575b600080fd5b34801561024157600080fd5b5061024a610754565b604051610257919061227e565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612037565b6107e2565b6040519015158152602001610257565b34801561029c57600080fd5b506102a56107f9565b604051610257919061223a565b3480156102be57600080fd5b506102d26102cd366004612218565b610819565b005b3480156102e057600080fd5b506103006102ef366004611f98565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610257565b34801561032557600080fd5b5061032f60025481565b604051908152602001610257565b34801561034957600080fd5b5061032f6103583660046121e6565b61087a565b34801561036957600080fd5b506102d26103783660046120eb565b61089b565b34801561038957600080fd5b50610280610398366004611f57565b61095c565b3480156103a957600080fd5b506102d26103b836600461214f565b610a62565b3480156103c957600080fd5b506102d26103d83660046121e6565b610c65565b3480156103e957600080fd5b506103f2601281565b60405160ff9091168152602001610257565b34801561041057600080fd5b506102d261041f3660046121e6565b610cc4565b34801561043057600080fd5b506102d261043f3660046121e6565b610d0c565b34801561045057600080fd5b506102a561045f366004611ee4565b610d16565b34801561047057600080fd5b506102d2610fb7565b34801561048557600080fd5b506102d2611056565b34801561049a57600080fd5b506102d26104a93660046121e6565b6110ac565b3480156104ba57600080fd5b5061032f6104c9366004611ee4565b60036020526000908152604090205481565b3480156104e757600080fd5b506102d26110ee565b3480156104fc57600080fd5b506102d261050b366004612218565b611124565b34801561051c57600080fd5b506102d261052b366004612037565b61117c565b34801561053c57600080fd5b506102d261054b366004612063565b611285565b6102d261055e3660046121e6565b611375565b34801561056f57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b3480156105a157600080fd5b506102d26105b0366004612218565b6113fc565b3480156105c157600080fd5b5061032f6105d03660046121e6565b611454565b3480156105e157600080fd5b5061024a6114e1565b3480156105f657600080fd5b50610280610605366004612037565b6114ee565b34801561061657600080fd5b5061032f6106253660046121e6565b60086020526000908152604090205481565b34801561064357600080fd5b5061032f611578565b34801561065857600080fd5b506102d2610667366004611ee4565b6115dd565b34801561067857600080fd5b5060095461057d906001600160a01b031681565b34801561069857600080fd5b506102d26106a73660046121e6565b611629565b3480156106b857600080fd5b5061032f6106c7366004611f1e565b600460209081526000928352604080842090915290825290205481565b3480156106f057600080fd5b506102806106ff366004611ee4565b60076020526000908152604090205460ff1681565b34801561072057600080fd5b506102d261072f36600461214f565b611658565b34801561074057600080fd5b506102d261074f366004611ee4565b611999565b60008054610761906123cd565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906123cd565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b505050505081565b60006107ef338484611a31565b5060015b92915050565b33600090815260066020526040902060609061081490611a92565b905090565b6005546001600160a01b0316331461084c5760405162461bcd60e51b8152600401610843906122d3565b60405180910390fd5b61085e82670de0b6b3a7640000612397565b600e5561087381670de0b6b3a7640000612397565b600f555050565b6012818154811061088a57600080fd5b600091825260209091200154905081565b80518251146108fc5760405162461bcd60e51b815260206004820152602760248201527f4552433230493a20546f20616e6420416d6f756e7473206c656e677468204d69604482015266736d617463682160c81b6064820152608401610843565b60005b82518110156109575761094483828151811061091d5761091d612449565b602002602001015183838151811061093757610937612449565b60200260200101516114ee565b508061094f81612402565b9150506108ff565b505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146109c1576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906109bb9084906123b6565b90915550505b6001600160a01b038416600090815260036020526040812080548492906109e99084906123b6565b90915550506001600160a01b03831660009081526003602052604081208054849290610a1690849061235d565b92505081905550826001600160a01b0316846001600160a01b031660008051602061248b83398151915284604051610a5091815260200190565b60405180910390a35060019392505050565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015610aab57600080fd5b505afa158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae391906121c4565b610b275760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b60005b81811015610957576009546001600160a01b031663b88d4fde3330868686818110610b5757610b57612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b50505050610c07838383818110610be957610be9612449565b33600090815260066020908152604090912093910201359050611aa6565b50336000908152600760205260408120805460ff191660011790554290600890858585818110610c3957610c39612449565b905060200201358152602001908152602001600020819055508080610c5d90612402565b915050610b2a565b6005546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610843906122d3565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b6005546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610843906122d3565b610d0933610d0483670de0b6b3a7640000612397565b611ab2565b50565b610d093382611b2a565b6009546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610d6057600080fd5b505afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9891906121ff565b905080610db5575050604080516000815260208101909152919050565b60008167ffffffffffffffff811115610dd057610dd061245f565b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b50905060008060015b600960009054906101000a90046001600160a01b03166001600160a01b031663626be5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906121ff565b8111610fac576000915060005b601254811015610edb5760128181548110610eb257610eb2612449565b9060005260206000200154821415610ec957600192505b80610ed381612402565b915050610e95565b5081610f9a576009546040516331a9108f60e11b8152600481018390526001600160a01b03898116921690636352211e9060240160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f9190611f01565b6001600160a01b03161415610f9a5780848481518110610f8157610f81612449565b602090810291909101015282610f9681612402565b9350505b80610fa481612402565b915050610e02565b509195945050505050565b6000805b336000908152600660205260409020610fd390611b9c565b81101561104b57336000908152600660205260409020610ffc90610ff79083611ba6565b611bb2565b611006908361235d565b3360009081526006602052604081209193504291600891906110289085611ba6565b81526020810191909152604001600020558061104381612402565b915050610fbb565b50610d093382611ab2565b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610843906122d3565b60405133904780156108fc02916000818181858888f19350505050158015610d09573d6000803e3d6000fd5b6005546001600160a01b031633146110d65760405162461bcd60e51b8152600401610843906122d3565b6110e881670de0b6b3a7640000612397565b600a5550565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610843906122d3565b6111226000611bcb565b565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610843906122d3565b61116082670de0b6b3a7640000612397565b600c5561117581670de0b6b3a7640000612397565b600d555050565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156112165760405162461bcd60e51b815260206004820152603860248201527f4552433230494275726e61626c653a204275726e20616d6f756e74207265717560448201527f6573746564206578636565647320616c6c6f77616e63652100000000000000006064820152608401610843565b6001600160a01b03831660009081526004602090815260408083203384529091529020546000191461127b576001600160a01b0383166000908152600460209081526040808320338452909152812080548492906112759084906123b6565b90915550505b6109578383611b2a565b81518351148015611297575080518351145b6112fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433230493a2046726f6d2c20546f2c20616e6420416d6f756e7473206c6560448201526d6e677468204d69736d617463682160901b6064820152608401610843565b60005b835181101561136f5761135c84828151811061131b5761131b612449565b602002602001015184838151811061133557611335612449565b602002602001015184848151811061134f5761134f612449565b602002602001015161095c565b508061136781612402565b9150506112fd565b50505050565b60018110158015611387575060038111155b61139057600080fd5b80600114156113b457600d543410156113a857600080fd5b610d0933600c54611ab2565b80600214156113d857600f543410156113cc57600080fd5b610d0933600e54611ab2565b8060031415610d09576011543410156113f057600080fd5b610d0933601054611ab2565b6005546001600160a01b031633146114265760405162461bcd60e51b8152600401610843906122d3565b61143882670de0b6b3a7640000612397565b60105561144d81670de0b6b3a7640000612397565b6011555050565b33600090815260066020526040812061146d9083611c1d565b6114af5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b60008281526008602052604081205481906114ca90426123b6565b90506114d96201518082612375565b949350505050565b60018054610761906123cd565b3360009081526003602052604081208054839190839061150f9084906123b6565b90915550506001600160a01b0383166000908152600360205260408120805484929061153c90849061235d565b90915550506040518281526001600160a01b03841690339060008051602061248b8339815191529060200160405180910390a350600192915050565b600080805b33600090815260066020526040902061159590611b9c565b8110156115d7573360009081526006602052604090206115b990610ff79083611ba6565b6115c3908361235d565b9150806115cf81612402565b91505061157d565b50919050565b6005546001600160a01b031633146116075760405162461bcd60e51b8152600401610843906122d3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116535760405162461bcd60e51b8152600401610843906122d3565b600b55565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906121c4565b61171d5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b306001600160a01b03166352143d4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175857600080fd5b505af115801561176c573d6000803e3d6000fd5b5050505060005b8181101561195b576117ae83838381811061179057611790612449565b33600090815260066020908152604090912093910201359050611c1d565b6117f05760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b600b5461181484848481811061180857611808612449565b90506020020135611454565b10156118725760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206265207374616b656420666f72206174206c65617374206044820152663320646179732160c81b6064820152608401610843565b6118a583838381811061188757611887612449565b33600090815260066020908152604090912093910201359050611c35565b506009546001600160a01b031663b88d4fde30338686868181106118cb576118cb612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561193057600080fd5b505af1158015611944573d6000803e3d6000fd5b50505050808061195390612402565b915050611773565b5033600090815260066020526040902060019061197790611b9c565b101561199557336000908152600760205260409020805460ff191690555b5050565b6005546001600160a01b031633146119c35760405162461bcd60e51b8152600401610843906122d3565b6001600160a01b038116611a285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b610d0981611bcb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60606000611a9f83611c41565b9392505050565b6000611a9f8383611c9d565b8060026000828254611ac4919061235d565b90915550506001600160a01b03821660009081526003602052604081208054839290611af190849061235d565b90915550506040518181526001600160a01b0383169060009060008051602061248b833981519152906020015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290611b529084906123b6565b925050819055508060026000828254611b6b91906123b6565b90915550506040518181526000906001600160a01b0384169060008051602061248b83398151915290602001611b1e565b60006107f3825490565b6000611a9f8383611cec565b600080600a54611bc184611454565b611a9f9190612397565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001830160205260408120541515611a9f565b6000611a9f8383611d16565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b815481526020019060010190808311611c7d575b50505050509050919050565b6000818152600183016020526040812054611ce4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107f3565b5060006107f3565b6000826000018281548110611d0357611d03612449565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611dff576000611d3a6001836123b6565b8554909150600090611d4e906001906123b6565b9050818114611db3576000866000018281548110611d6e57611d6e612449565b9060005260206000200154905080876000018481548110611d9157611d91612449565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dc457611dc4612433565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107f3565b60009150506107f3565b600082601f830112611e1a57600080fd5b81356020611e2f611e2a83612339565b612308565b80838252828201915082860187848660051b8901011115611e4f57600080fd5b60005b85811015611e77578135611e6581612475565b84529284019290840190600101611e52565b5090979650505050505050565b600082601f830112611e9557600080fd5b81356020611ea5611e2a83612339565b80838252828201915082860187848660051b8901011115611ec557600080fd5b60005b85811015611e7757813584529284019290840190600101611ec8565b600060208284031215611ef657600080fd5b8135611a9f81612475565b600060208284031215611f1357600080fd5b8151611a9f81612475565b60008060408385031215611f3157600080fd5b8235611f3c81612475565b91506020830135611f4c81612475565b809150509250929050565b600080600060608486031215611f6c57600080fd5b8335611f7781612475565b92506020840135611f8781612475565b929592945050506040919091013590565b600080600080600060808688031215611fb057600080fd5b8535611fbb81612475565b94506020860135611fcb81612475565b935060408601359250606086013567ffffffffffffffff80821115611fef57600080fd5b818801915088601f83011261200357600080fd5b81358181111561201257600080fd5b89602082850101111561202457600080fd5b9699959850939650602001949392505050565b6000806040838503121561204a57600080fd5b823561205581612475565b946020939093013593505050565b60008060006060848603121561207857600080fd5b833567ffffffffffffffff8082111561209057600080fd5b61209c87838801611e09565b945060208601359150808211156120b257600080fd5b6120be87838801611e09565b935060408601359150808211156120d457600080fd5b506120e186828701611e84565b9150509250925092565b600080604083850312156120fe57600080fd5b823567ffffffffffffffff8082111561211657600080fd5b61212286838701611e09565b9350602085013591508082111561213857600080fd5b5061214585828601611e84565b9150509250929050565b6000806020838503121561216257600080fd5b823567ffffffffffffffff8082111561217a57600080fd5b818501915085601f83011261218e57600080fd5b81358181111561219d57600080fd5b8660208260051b85010111156121b257600080fd5b60209290920196919550909350505050565b6000602082840312156121d657600080fd5b81518015158114611a9f57600080fd5b6000602082840312156121f857600080fd5b5035919050565b60006020828403121561221157600080fd5b5051919050565b6000806040838503121561222b57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561227257835183529284019291840191600101612256565b50909695505050505050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123315761233161245f565b604052919050565b600067ffffffffffffffff8211156123535761235361245f565b5060051b60200190565b600082198211156123705761237061241d565b500190565b60008261239257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156123b1576123b161241d565b500290565b6000828210156123c8576123c861241d565b500390565b600181811c908216806123e157607f821691505b602082108114156115d757634e487b7160e01b600052602260045260246000fd5b60006000198214156124165761241661241d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220816d6c8aa17353914141bb5bc30775792f30e335f2b8c5c134178704d0c2efd764736f6c63430008070033
Deployed Bytecode Sourcemap
60900:6732:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57507:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58781:162;;;;;;;;;;-1:-1:-1;58781:162:0;;;;;:::i;:::-;;:::i;:::-;;;8902:14:1;;8895:22;8877:41;;8865:2;8850:18;58781:162:0;8737:187:1;64858:129:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61950:175::-;;;;;;;;;;-1:-1:-1;61950:175:0;;;;;:::i;:::-;;:::i;:::-;;67408:219;;;;;;;;;;-1:-1:-1;67408:219:0;;;;;:::i;:::-;-1:-1:-1;;;67408:219:0;;;;;;;;;;;-1:-1:-1;;;;;;9091:33:1;;;9073:52;;9061:2;9046:18;67408:219:0;8929:202:1;57757:26:0;;;;;;;;;;;;;;;;;;;13226:25:1;;;13214:2;13199:18;57757:26:0;13080:177:1;61612:29:0;;;;;;;;;;-1:-1:-1;61612:29:0;;;;;:::i;:::-;;:::i;59605:294::-;;;;;;;;;;-1:-1:-1;59605:294:0;;;;;:::i;:::-;;:::i;59192:368::-;;;;;;;;;;-1:-1:-1;59192:368:0;;;;;:::i;:::-;;:::i;63344:604::-;;;;;;;;;;-1:-1:-1;63344:604:0;;;;;:::i;:::-;;:::i;61650:109::-;;;;;;;;;;-1:-1:-1;61650:109:0;;;;;:::i;:::-;;:::i;57698:35::-;;;;;;;;;;;;57731:2;57698:35;;;;;13434:4:1;13422:17;;;13404:36;;13392:2;13377:18;57698:35:0;13262:184:1;62316:112:0;;;;;;;;;;-1:-1:-1;62316:112:0;;;;;:::i;:::-;;:::i;60339:93::-;;;;;;;;;;-1:-1:-1;60339:93:0;;;;;:::i;:::-;;:::i;66532:868::-;;;;;;;;;;-1:-1:-1;66532:868:0;;;;;:::i;:::-;;:::i;64995:353::-;;;;;;;;;;;;;:::i;66397:127::-;;;;;;;;;;;;;:::i;63105:113::-;;;;;;;;;;-1:-1:-1;63105:113:0;;;;;:::i;:::-;;:::i;57825:44::-;;;;;;;;;;-1:-1:-1;57825:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;19070:103;;;;;;;;;;;;;:::i;61767:175::-;;;;;;;;;;-1:-1:-1;61767:175:0;;;;;:::i;:::-;;:::i;60438:406::-;;;;;;;;;;-1:-1:-1;60438:406:0;;;;;:::i;:::-;;:::i;59905:377::-;;;;;;;;;;-1:-1:-1;59905:377:0;;;;;:::i;:::-;;:::i;62550:543::-;;;;;;:::i;:::-;;:::i;18419:87::-;;;;;;;;;;-1:-1:-1;18492:6:0;;-1:-1:-1;;;;;18492:6:0;18419:87;;;-1:-1:-1;;;;;7187:32:1;;;7169:51;;7157:2;7142:18;18419:87:0;7023:203:1;62133:175:0;;;;;;;;;;-1:-1:-1;62133:175:0;;;;;:::i;:::-;;:::i;65563:392::-;;;;;;;;;;-1:-1:-1;65563:392:0;;;;;:::i;:::-;;:::i;57532:20::-;;;;;;;;;;;;;:::i;58949:237::-;;;;;;;;;;-1:-1:-1;58949:237:0;;;;;:::i;:::-;;:::i;61186:46::-;;;;;;;;;;-1:-1:-1;61186:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;65963:295;;;;;;;;;;;;;:::i;62436:106::-;;;;;;;;;;-1:-1:-1;62436:106:0;;;;;:::i;:::-;;:::i;61241:69::-;;;;;;;;;;-1:-1:-1;61241:69:0;;;;-1:-1:-1;;;;;61241:69:0;;;63226:110;;;;;;;;;;-1:-1:-1;63226:110:0;;;;;:::i;:::-;;:::i;57876:64::-;;;;;;;;;;-1:-1:-1;57876:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;61134:45;;;;;;;;;;-1:-1:-1;61134:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63956:894;;;;;;;;;;-1:-1:-1;63956:894:0;;;;;:::i;:::-;;:::i;19328:201::-;;;;;;;;;;-1:-1:-1;19328:201:0;;;;;:::i;:::-;;:::i;57507:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58781:162::-;58857:4;58874:39;58883:10;58895:8;58905:7;58874:8;:39::i;:::-;-1:-1:-1;58931:4:0;58781:162;;;;;:::o;64858:129::-;64959:10;64949:21;;;;:9;:21;;;;;64908:16;;64949:30;;:28;:30::i;:::-;64942:37;;64858:129;:::o;61950:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;;;;;;;;;62053:20:::1;:9:::0;62065:8:::1;62053:20;:::i;:::-;62040:9;:34:::0;62098:18:::1;:7:::0;62108:8:::1;62098:18;:::i;:::-;62085:9;:32:::0;-1:-1:-1;;61950:175:0:o;61612:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61612:29:0;:::o;59605:294::-;59725:8;:15;59711:3;:10;:29;59703:81;;;;-1:-1:-1;;;59703:81:0;;10567:2:1;59703:81:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:37;10743:19;;59703:81:0;10365:403:1;59703:81:0;59800:9;59795:97;59819:3;:10;59815:1;:14;59795:97;;;59851:29;59860:3;59864:1;59860:6;;;;;;;;:::i;:::-;;;;;;;59868:8;59877:1;59868:11;;;;;;;;:::i;:::-;;;;;;;59851:8;:29::i;:::-;-1:-1:-1;59831:3:0;;;;:::i;:::-;;;;59795:97;;;;59605:294;;:::o;59192:368::-;-1:-1:-1;;;;;59304:16:0;;59283:4;59304:16;;;:9;:16;;;;;;;;59321:10;59304:28;;;;;;;;-1:-1:-1;;59304:49:0;59300:112;;-1:-1:-1;;;;;59370:16:0;;;;;;:9;:16;;;;;;;;59387:10;59370:28;;;;;;;:39;;59402:7;;59370:16;:39;;59402:7;;59370:39;:::i;:::-;;;;-1:-1:-1;;59300:112:0;-1:-1:-1;;;;;59422:16:0;;;;;;:9;:16;;;;;:27;;59442:7;;59422:16;:27;;59442:7;;59422:27;:::i;:::-;;;;-1:-1:-1;;;;;;;59460:14:0;;;;;;:9;:14;;;;;:25;;59478:7;;59460:14;:25;;59478:7;;59460:25;:::i;:::-;;;;;;;;59517:3;-1:-1:-1;;;;;59501:29:0;59510:5;-1:-1:-1;;;;;59501:29:0;-1:-1:-1;;;;;;;;;;;59522:7:0;59501:29;;;;13226:25:1;;13214:2;13199:18;;13080:177;59501:29:0;;;;;;;;-1:-1:-1;59548:4:0;59192:368;;;;;:::o;63344:604::-;63430:8;;:52;;-1:-1:-1;;;63430:52:0;;63456:10;63430:52;;;7443:34:1;63476:4:0;7493:18:1;;;7486:43;-1:-1:-1;;;;;63430:8:0;;;;:25;;7378:18:1;;63430:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63422:86;;;;-1:-1:-1;;;63422:86:0;;12092:2:1;63422:86:0;;;12074:21:1;12131:2;12111:18;;;12104:30;-1:-1:-1;;;12150:18:1;;;12143:51;12211:18;;63422:86:0;11890:345:1;63422:86:0;63544:9;63539:392;63555:19;;;63539:392;;;63596:8;;-1:-1:-1;;;;;63596:8:0;:25;63640:10;63677:4;63701:8;;63710:1;63701:11;;;;;;;:::i;:::-;63596:152;;-1:-1:-1;;;;;;63596:152:0;;;;;;;-1:-1:-1;;;;;7863:15:1;;;63596:152:0;;;7845:34:1;7915:15;;;;7895:18;;;7888:43;-1:-1:-1;63701:11:0;;;;;;7947:18:1;;;7940:34;8010:3;7990:18;;;7983:31;-1:-1:-1;8030:19:1;;;8023:30;8070:19;;63596:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63777:38;63803:8;;63812:1;63803:11;;;;;;;:::i;:::-;63787:10;63777:21;;;;:9;63803:11;63777:21;;;;;;;;63803:11;;;;;-1:-1:-1;63777:25:0;:38::i;:::-;-1:-1:-1;63844:10:0;63830:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;63830:32:0;63858:4;63830:32;;;63904:15;;63877:11;;63889:8;;63898:1;63889:11;;;;;;;:::i;:::-;;;;;;;63877:24;;;;;;;;;;;:42;;;;63576:3;;;;;:::i;:::-;;;;63539:392;;61650:109;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;61725:12:::1;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61725:26:0;;;;;::::1;::::0;61650:109::o;62316:112::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62382:38:::1;62388:10;62401:17;:6:::0;62410:8:::1;62401:17;:::i;:::-;62382:5;:38::i;:::-;62316:112:::0;:::o;60339:93::-;60398:26;60404:10;60416:7;60398:5;:26::i;66532:868::-;66642:8;;:28;;-1:-1:-1;;;66642:28:0;;-1:-1:-1;;;;;7187:32:1;;;66642:28:0;;;7169:51:1;66594:16:0;;66623;;66642:8;;;:18;;7142::1;;66642:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66623:47;-1:-1:-1;66685:13:0;66681:42;;-1:-1:-1;;66707:16:0;;;66721:1;66707:16;;;;;;;;;66700:23;-1:-1:-1;66532:868:0:o;66681:42::-;66736:24;66778:8;66763:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66763:24:0;-1:-1:-1;66736:51:0;-1:-1:-1;66798:14:0;;66890:1;66873:495;66898:8;;;;;;;;;-1:-1:-1;;;;;66898:8:0;-1:-1:-1;;;;;66898:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66893:1;:26;66873:495;;66950:5;66941:14;;66988:9;66984:189;67003:12;:19;67001:21;;66984:189;;;67068:12;67081:1;67068:15;;;;;;;;:::i;:::-;;;;;;;;;67063:1;:20;67060:98;;;67134:4;67125:13;;67060:98;67023:3;;;;:::i;:::-;;;;66984:189;;;;67191:6;67187:168;;67235:8;;:19;;-1:-1:-1;;;67235:19:0;;;;;13226:25:1;;;-1:-1:-1;;;;;67235:31:0;;;;:8;;:16;;13199:18:1;;67235:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67235:31:0;;67231:109;;;67309:1;67291:7;67299:6;67291:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;67312:8;;;;:::i;:::-;;;;67231:109;66921:3;;;;:::i;:::-;;;;66873:495;;;-1:-1:-1;67385:7:0;;66532:868;-1:-1:-1;;;;;66532:868:0:o;64995:353::-;65041:19;65079:9;65075:225;65108:10;65098:21;;;;:9;:21;;;;;:30;;:28;:30::i;:::-;65094:1;:34;65075:225;;;65197:10;65187:21;;;;:9;:21;;;;;65174:41;;65187:27;;65212:1;65187:24;:27::i;:::-;65174:12;:41::i;:::-;65159:56;;;;:::i;:::-;65252:10;65230:40;65242:21;;;:9;:21;;;;;65159:56;;-1:-1:-1;65273:15:0;;65230:11;;:40;65242:27;;65267:1;65242:24;:27::i;:::-;65230:40;;;;;;;;;;;-1:-1:-1;65230:40:0;:58;65130:3;;;;:::i;:::-;;;;65075:225;;;;65310:30;65316:10;65328:11;65310:5;:30::i;66397:127::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;66465:51:::1;::::0;66473:10:::1;::::0;66494:21:::1;66465:51:::0;::::1;;;::::0;::::1;::::0;;;66494:21;66473:10;66465:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;63105:113:::0;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;63193:16:::1;:5:::0;63201:8:::1;63193:16;:::i;:::-;63179:10;:31:::0;-1:-1:-1;63105:113:0:o;19070:103::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;19135:30:::1;19162:1;19135:18;:30::i;:::-;19070:103::o:0;61767:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;61870:20:::1;:9:::0;61882:8:::1;61870:20;:::i;:::-;61857:9;:34:::0;61915:18:::1;:7:::0;61925:8:::1;61915:18;:::i;:::-;61902:9;:32:::0;-1:-1:-1;;61767:175:0:o;60438:406::-;-1:-1:-1;;;;;60542:16:0;;60514:25;60542:16;;;:9;:16;;;;;;;;60559:10;60542:28;;;;;;;;60589;;;;60581:97;;;;-1:-1:-1;;;60581:97:0;;12857:2:1;60581:97:0;;;12839:21:1;12896:2;12876:18;;;12869:30;12935:34;12915:18;;;12908:62;13006:26;12986:18;;;12979:54;13050:19;;60581:97:0;12655:420:1;60581:97:0;-1:-1:-1;;;;;60695:16:0;;;;;;:9;:16;;;;;;;;60712:10;60695:28;;;;;;;;-1:-1:-1;;60695:49:0;60691:112;;-1:-1:-1;;;;;60761:16:0;;;;;;:9;:16;;;;;;;;60778:10;60761:28;;;;;;;:39;;60793:7;;60761:16;:39;;60793:7;;60761:39;:::i;:::-;;;;-1:-1:-1;;60691:112:0;60815:21;60821:5;60828:7;60815:5;:21::i;59905:377::-;60055:3;:10;60039:5;:12;:26;:61;;;;;60085:8;:15;60069:5;:12;:31;60039:61;60031:120;;;;-1:-1:-1;;;60031:120:0;;12442:2:1;60031:120:0;;;12424:21:1;12481:2;12461:18;;;12454:30;12520:34;12500:18;;;12493:62;-1:-1:-1;;;12571:18:1;;;12564:44;12625:19;;60031:120:0;12240:410:1;60031:120:0;60167:9;60162:113;60186:5;:12;60182:1;:16;60162:113;;;60220:43;60233:5;60239:1;60233:8;;;;;;;;:::i;:::-;;;;;;;60243:3;60247:1;60243:6;;;;;;;;:::i;:::-;;;;;;;60251:8;60260:1;60251:11;;;;;;;;:::i;:::-;;;;;;;60220:12;:43::i;:::-;-1:-1:-1;60200:3:0;;;;:::i;:::-;;;;60162:113;;;;59905:377;;;:::o;62550:543::-;62638:1;62625:9;:14;;:32;;;;;62656:1;62643:9;:14;;62625:32;62617:41;;;;;;62672:9;62685:1;62672:14;62669:417;;;62733:9;;62720;:22;;62712:31;;;;;;62758:28;62764:10;62776:9;;62758:5;:28::i;62669:417::-;62816:9;62829:1;62816:14;62813:273;;;62877:9;;62864;:22;;62856:31;;;;;;62902:28;62908:10;62920:9;;62902:5;:28::i;62813:273::-;62960:9;62973:1;62960:14;62957:129;;;63021:9;;63008;:22;;63000:31;;;;;;63046:28;63052:10;63064:9;;63046:5;:28::i;62133:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62236:20:::1;:9:::0;62248:8:::1;62236:20;:::i;:::-;62223:9;:34:::0;62281:18:::1;:7:::0;62291:8:::1;62281:18;:::i;:::-;62268:9;:32:::0;-1:-1:-1;;62133:175:0:o;65563:392::-;65687:10;65620:7;65677:21;;;:9;:21;;;;;:39;;65708:7;65677:30;:39::i;:::-;65655:108;;;;-1:-1:-1;;;65655:108:0;;11383:2:1;65655:108:0;;;11365:21:1;11422:2;11402:18;;;11395:30;-1:-1:-1;;;11441:18:1;;;11434:49;11500:18;;65655:108:0;11181:343:1;65655:108:0;65784:18;65850:20;;;:11;:20;;;;;;65784:18;;65832:38;;:15;:38;:::i;:::-;65813:57;-1:-1:-1;65894:16:0;65905:5;65813:57;65894:16;:::i;:::-;65881:29;65563:392;-1:-1:-1;;;;65563:392:0:o;57532:20::-;;;;;;;:::i;58949:237::-;59048:10;59021:4;59038:21;;;:9;:21;;;;;:32;;59063:7;;59038:21;59021:4;;59038:32;;59063:7;;59038:32;:::i;:::-;;;;-1:-1:-1;;;;;;;59081:14:0;;;;;;:9;:14;;;;;:25;;59099:7;;59081:14;:25;;59099:7;;59081:25;:::i;:::-;;;;-1:-1:-1;;59122:34:0;;13226:25:1;;;-1:-1:-1;;;;;59122:34:0;;;59131:10;;-1:-1:-1;;;;;;;;;;;59122:34:0;13214:2:1;13199:18;59122:34:0;;;;;;;-1:-1:-1;59174:4:0;58949:237;;;;:::o;65963:295::-;66011:7;;;66070:152;66103:10;66093:21;;;;:9;:21;;;;;:30;;:28;:30::i;:::-;66089:1;:34;66070:152;;;66192:10;66182:21;;;;:9;:21;;;;;66169:41;;66182:27;;66207:1;66182:24;:27::i;66169:41::-;66154:56;;;;:::i;:::-;;-1:-1:-1;66125:3:0;;;;:::i;:::-;;;;66070:152;;;-1:-1:-1;66239:11:0;65963:295;-1:-1:-1;65963:295:0:o;62436:106::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62510:8:::1;:24:::0;;-1:-1:-1;;;;;;62510:24:0::1;-1:-1:-1::0;;;;;62510:24:0;;;::::1;::::0;;;::::1;::::0;;62436:106::o;63226:110::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;63305:13:::1;:23:::0;63226:110::o;63956:894::-;64044:8;;:52;;-1:-1:-1;;;64044:52:0;;64070:10;64044:52;;;7443:34:1;64090:4:0;7493:18:1;;;7486:43;-1:-1:-1;;;;;64044:8:0;;;;:25;;7378:18:1;;64044:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64036:86;;;;-1:-1:-1;;;64036:86:0;;12092:2:1;64036:86:0;;;12074:21:1;12131:2;12111:18;;;12104:30;-1:-1:-1;;;12150:18:1;;;12143:51;12211:18;;64036:86:0;11890:345:1;64036:86:0;64143:4;-1:-1:-1;;;;;64143:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64177:9;64172:553;64188:19;;;64172:553;;;64255:43;64286:8;;64295:1;64286:11;;;;;;;:::i;:::-;64265:10;64255:21;;;;:9;64286:11;64255:21;;;;;;;;64286:11;;;;;-1:-1:-1;64255:30:0;:43::i;:::-;64229:124;;;;-1:-1:-1;;;64229:124:0;;11383:2:1;64229:124:0;;;11365:21:1;11422:2;11402:18;;;11395:30;-1:-1:-1;;;11441:18:1;;;11434:49;11500:18;;64229:124:0;11181:343:1;64229:124:0;64405:13;;64378:23;64389:8;;64398:1;64389:11;;;;;;;:::i;:::-;;;;;;;64378:10;:23::i;:::-;:40;;64370:92;;;;-1:-1:-1;;;64370:92:0;;10975:2:1;64370:92:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;-1:-1:-1;;;11104:18:1;;;11097:37;11151:19;;64370:92:0;10773:403:1;64370:92:0;64491:41;64520:8;;64529:1;64520:11;;;;;;;:::i;:::-;64501:10;64491:21;;;;:9;64520:11;64491:21;;;;;;;;64520:11;;;;;-1:-1:-1;64491:28:0;:41::i;:::-;-1:-1:-1;64561:8:0;;-1:-1:-1;;;;;64561:8:0;:25;64613:4;64637:10;64666:8;;64675:1;64666:11;;;;;;;:::i;:::-;64561:152;;-1:-1:-1;;;;;;64561:152:0;;;;;;;-1:-1:-1;;;;;7863:15:1;;;64561:152:0;;;7845:34:1;7915:15;;;;7895:18;;;7888:43;-1:-1:-1;64666:11:0;;;;;;7947:18:1;;;7940:34;8010:3;7990:18;;;7983:31;-1:-1:-1;8030:19:1;;;8023:30;8070:19;;64561:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64209:3;;;;;:::i;:::-;;;;64172:553;;;-1:-1:-1;64748:10:0;64738:21;;;;:9;:21;;;;;64771:1;;64738:30;;:28;:30::i;:::-;:34;64735:108;;;64812:10;64826:5;64798:25;;;:13;:25;;;;;:33;;-1:-1:-1;;64798:33:0;;;64735:108;63956:894;;:::o;19328:201::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19417:22:0;::::1;19409:73;;;::::0;-1:-1:-1;;;19409:73:0;;10160:2:1;19409:73:0::1;::::0;::::1;10142:21:1::0;10199:2;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;-1:-1:-1;;;10289:18:1;;;10282:36;10335:19;;19409:73:0::1;9958:402:1::0;19409:73:0::1;19493:28;19512:8;19493:18;:28::i;58555:193::-:0;-1:-1:-1;;;;;58652:17:0;;;;;;;:9;:17;;;;;;;;:27;;;;;;;;;;;;;:37;;;58705:35;;13226:25:1;;;58705:35:0;;13199:18:1;58705:35:0;;;;;;;58555:193;;;:::o;12393:263::-;12453:16;12482:22;12507:19;12515:3;12507:7;:19::i;:::-;12482:44;12393:263;-1:-1:-1;;;12393:263:0:o;10476:131::-;10543:4;10567:32;10572:3;10592:5;10567:4;:32::i;58155:191::-;58243:7;58228:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;58261:14:0;;;;;;:9;:14;;;;;:25;;58279:7;;58261:14;:25;;58279:7;;58261:25;:::i;:::-;;;;-1:-1:-1;;58302:36:0;;13226:25:1;;;-1:-1:-1;;;;;58302:36:0;;;58319:3;;-1:-1:-1;;;;;;;;;;;58302:36:0;13214:2:1;13199:18;58302:36:0;;;;;;;;58155:191;;:::o;58352:197::-;-1:-1:-1;;;;;58427:16:0;;;;;;:9;:16;;;;;:27;;58447:7;;58427:16;:27;;58447:7;;58427:27;:::i;:::-;;;;;;;;58480:7;58465:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;58503:38:0;;13226:25:1;;;58527:3:0;;-1:-1:-1;;;;;58503:38:0;;;-1:-1:-1;;;;;;;;;;;58503:38:0;13214:2:1;13199:18;58503:38:0;13080:177:1;11238:114:0;11298:7;11325:19;11333:3;4267:18;;4184:109;11706:137;11777:7;11812:22;11816:3;11828:5;11812:3;:22::i;65356:199::-;65417:7;65442:21;65488:10;;65466:19;65477:7;65466:10;:19::i;:::-;:32;;;;:::i;19689:191::-;19782:6;;;-1:-1:-1;;;;;19799:17:0;;;-1:-1:-1;;;;;;19799:17:0;;;;;;;19832:40;;19782:6;;;19799:17;19782:6;;19832:40;;19763:16;;19832:40;19752:128;19689:191;:::o;11006:146::-;11083:4;4066:19;;;:12;;;:19;;;;;;:24;;11107:37;3969:129;10783:137;10853:4;10877:35;10885:3;10905:5;10877:7;:35::i;5317:111::-;5373:16;5409:3;:11;;5402:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5317:111;;;:::o;1873:414::-;1936:4;4066:19;;;:12;;;:19;;;;;;1953:327;;-1:-1:-1;1996:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;2179:18;;2157:19;;;:12;;;:19;;;;;;:40;;;;2212:11;;1953:327;-1:-1:-1;2263:5:0;2256:12;;4647:120;4714:7;4741:3;:11;;4753:5;4741:18;;;;;;;;:::i;:::-;;;;;;;;;4734:25;;4647:120;;;;:::o;2463:1420::-;2529:4;2668:19;;;:12;;;:19;;;;;;2704:15;;2700:1176;;3079:21;3103:14;3116:1;3103:10;:14;:::i;:::-;3152:18;;3079:38;;-1:-1:-1;3132:17:0;;3152:22;;3173:1;;3152:22;:::i;:::-;3132:42;;3208:13;3195:9;:26;3191:405;;3242:17;3262:3;:11;;3274:9;3262:22;;;;;;;;:::i;:::-;;;;;;;;;3242:42;;3416:9;3387:3;:11;;3399:13;3387:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3501:23;;;:12;;;:23;;;;;:36;;;3191:405;3677:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3772:3;:12;;:19;3785:5;3772:19;;;;;;;;;;;3765:26;;;3815:4;3808:11;;;;;;;2700:1176;3859:5;3852:12;;;;;14:748:1;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:238;509:2;506:1;503:9;495:238;;;580:3;567:17;597:31;622:5;597:31;:::i;:::-;641:18;;679:12;;;;711;;;;527:1;520:9;495:238;;;-1:-1:-1;751:5:1;;14:748;-1:-1:-1;;;;;;;14:748:1:o;767:673::-;821:5;874:3;867:4;859:6;855:17;851:27;841:55;;892:1;889;882:12;841:55;928:6;915:20;954:4;978:60;994:43;1034:2;994:43;:::i;978:60::-;1060:3;1084:2;1079:3;1072:15;1112:2;1107:3;1103:12;1096:19;;1147:2;1139:6;1135:15;1199:3;1194:2;1188;1185:1;1181:10;1173:6;1169:23;1165:32;1162:41;1159:61;;;1216:1;1213;1206:12;1159:61;1238:1;1248:163;1262:2;1259:1;1256:9;1248:163;;;1319:17;;1307:30;;1357:12;;;;1389;;;;1280:1;1273:9;1248:163;;1445:247;1504:6;1557:2;1545:9;1536:7;1532:23;1528:32;1525:52;;;1573:1;1570;1563:12;1525:52;1612:9;1599:23;1631:31;1656:5;1631:31;:::i;1697:251::-;1767:6;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1868:9;1862:16;1887:31;1912:5;1887:31;:::i;1953:388::-;2021:6;2029;2082:2;2070:9;2061:7;2057:23;2053:32;2050:52;;;2098:1;2095;2088:12;2050:52;2137:9;2124:23;2156:31;2181:5;2156:31;:::i;:::-;2206:5;-1:-1:-1;2263:2:1;2248:18;;2235:32;2276:33;2235:32;2276:33;:::i;:::-;2328:7;2318:17;;;1953:388;;;;;:::o;2346:456::-;2423:6;2431;2439;2492:2;2480:9;2471:7;2467:23;2463:32;2460:52;;;2508:1;2505;2498:12;2460:52;2547:9;2534:23;2566:31;2591:5;2566:31;:::i;:::-;2616:5;-1:-1:-1;2673:2:1;2658:18;;2645:32;2686:33;2645:32;2686:33;:::i;:::-;2346:456;;2738:7;;-1:-1:-1;;;2792:2:1;2777:18;;;;2764:32;;2346:456::o;2807:936::-;2904:6;2912;2920;2928;2936;2989:3;2977:9;2968:7;2964:23;2960:33;2957:53;;;3006:1;3003;2996:12;2957:53;3045:9;3032:23;3064:31;3089:5;3064:31;:::i;:::-;3114:5;-1:-1:-1;3171:2:1;3156:18;;3143:32;3184:33;3143:32;3184:33;:::i;:::-;3236:7;-1:-1:-1;3290:2:1;3275:18;;3262:32;;-1:-1:-1;3345:2:1;3330:18;;3317:32;3368:18;3398:14;;;3395:34;;;3425:1;3422;3415:12;3395:34;3463:6;3452:9;3448:22;3438:32;;3508:7;3501:4;3497:2;3493:13;3489:27;3479:55;;3530:1;3527;3520:12;3479:55;3570:2;3557:16;3596:2;3588:6;3585:14;3582:34;;;3612:1;3609;3602:12;3582:34;3657:7;3652:2;3643:6;3639:2;3635:15;3631:24;3628:37;3625:57;;;3678:1;3675;3668:12;3625:57;2807:936;;;;-1:-1:-1;2807:936:1;;-1:-1:-1;3709:2:1;3701:11;;3731:6;2807:936;-1:-1:-1;;;2807:936:1:o;3748:315::-;3816:6;3824;3877:2;3865:9;3856:7;3852:23;3848:32;3845:52;;;3893:1;3890;3883:12;3845:52;3932:9;3919:23;3951:31;3976:5;3951:31;:::i;:::-;4001:5;4053:2;4038:18;;;;4025:32;;-1:-1:-1;;;3748:315:1:o;4068:821::-;4220:6;4228;4236;4289:2;4277:9;4268:7;4264:23;4260:32;4257:52;;;4305:1;4302;4295:12;4257:52;4345:9;4332:23;4374:18;4415:2;4407:6;4404:14;4401:34;;;4431:1;4428;4421:12;4401:34;4454:61;4507:7;4498:6;4487:9;4483:22;4454:61;:::i;:::-;4444:71;;4568:2;4557:9;4553:18;4540:32;4524:48;;4597:2;4587:8;4584:16;4581:36;;;4613:1;4610;4603:12;4581:36;4636:63;4691:7;4680:8;4669:9;4665:24;4636:63;:::i;:::-;4626:73;;4752:2;4741:9;4737:18;4724:32;4708:48;;4781:2;4771:8;4768:16;4765:36;;;4797:1;4794;4787:12;4765:36;;4820:63;4875:7;4864:8;4853:9;4849:24;4820:63;:::i;:::-;4810:73;;;4068:821;;;;;:::o;4894:595::-;5012:6;5020;5073:2;5061:9;5052:7;5048:23;5044:32;5041:52;;;5089:1;5086;5079:12;5041:52;5129:9;5116:23;5158:18;5199:2;5191:6;5188:14;5185:34;;;5215:1;5212;5205:12;5185:34;5238:61;5291:7;5282:6;5271:9;5267:22;5238:61;:::i;:::-;5228:71;;5352:2;5341:9;5337:18;5324:32;5308:48;;5381:2;5371:8;5368:16;5365:36;;;5397:1;5394;5387:12;5365:36;;5420:63;5475:7;5464:8;5453:9;5449:24;5420:63;:::i;:::-;5410:73;;;4894:595;;;;;:::o;5494:615::-;5580:6;5588;5641:2;5629:9;5620:7;5616:23;5612:32;5609:52;;;5657:1;5654;5647:12;5609:52;5697:9;5684:23;5726:18;5767:2;5759:6;5756:14;5753:34;;;5783:1;5780;5773:12;5753:34;5821:6;5810:9;5806:22;5796:32;;5866:7;5859:4;5855:2;5851:13;5847:27;5837:55;;5888:1;5885;5878:12;5837:55;5928:2;5915:16;5954:2;5946:6;5943:14;5940:34;;;5970:1;5967;5960:12;5940:34;6023:7;6018:2;6008:6;6005:1;6001:14;5997:2;5993:23;5989:32;5986:45;5983:65;;;6044:1;6041;6034:12;5983:65;6075:2;6067:11;;;;;6097:6;;-1:-1:-1;5494:615:1;;-1:-1:-1;;;;5494:615:1:o;6114:277::-;6181:6;6234:2;6222:9;6213:7;6209:23;6205:32;6202:52;;;6250:1;6247;6240:12;6202:52;6282:9;6276:16;6335:5;6328:13;6321:21;6314:5;6311:32;6301:60;;6357:1;6354;6347:12;6396:180;6455:6;6508:2;6496:9;6487:7;6483:23;6479:32;6476:52;;;6524:1;6521;6514:12;6476:52;-1:-1:-1;6547:23:1;;6396:180;-1:-1:-1;6396:180:1:o;6581:184::-;6651:6;6704:2;6692:9;6683:7;6679:23;6675:32;6672:52;;;6720:1;6717;6710:12;6672:52;-1:-1:-1;6743:16:1;;6581:184;-1:-1:-1;6581:184:1:o;6770:248::-;6838:6;6846;6899:2;6887:9;6878:7;6874:23;6870:32;6867:52;;;6915:1;6912;6905:12;6867:52;-1:-1:-1;;6938:23:1;;;7008:2;6993:18;;;6980:32;;-1:-1:-1;6770:248:1:o;8100:632::-;8271:2;8323:21;;;8393:13;;8296:18;;;8415:22;;;8242:4;;8271:2;8494:15;;;;8468:2;8453:18;;;8242:4;8537:169;8551:6;8548:1;8545:13;8537:169;;;8612:13;;8600:26;;8681:15;;;;8646:12;;;;8573:1;8566:9;8537:169;;;-1:-1:-1;8723:3:1;;8100:632;-1:-1:-1;;;;;;8100:632:1:o;9356:597::-;9468:4;9497:2;9526;9515:9;9508:21;9558:6;9552:13;9601:6;9596:2;9585:9;9581:18;9574:34;9626:1;9636:140;9650:6;9647:1;9644:13;9636:140;;;9745:14;;;9741:23;;9735:30;9711:17;;;9730:2;9707:26;9700:66;9665:10;;9636:140;;;9794:6;9791:1;9788:13;9785:91;;;9864:1;9859:2;9850:6;9839:9;9835:22;9831:31;9824:42;9785:91;-1:-1:-1;9937:2:1;9916:15;-1:-1:-1;;9912:29:1;9897:45;;;;9944:2;9893:54;;9356:597;-1:-1:-1;;;9356:597:1:o;11529:356::-;11731:2;11713:21;;;11750:18;;;11743:30;11809:34;11804:2;11789:18;;11782:62;11876:2;11861:18;;11529:356::o;13451:275::-;13522:2;13516:9;13587:2;13568:13;;-1:-1:-1;;13564:27:1;13552:40;;13622:18;13607:34;;13643:22;;;13604:62;13601:88;;;13669:18;;:::i;:::-;13705:2;13698:22;13451:275;;-1:-1:-1;13451:275:1:o;13731:183::-;13791:4;13824:18;13816:6;13813:30;13810:56;;;13846:18;;:::i;:::-;-1:-1:-1;13891:1:1;13887:14;13903:4;13883:25;;13731:183::o;13919:128::-;13959:3;13990:1;13986:6;13983:1;13980:13;13977:39;;;13996:18;;:::i;:::-;-1:-1:-1;14032:9:1;;13919:128::o;14052:217::-;14092:1;14118;14108:132;;14162:10;14157:3;14153:20;14150:1;14143:31;14197:4;14194:1;14187:15;14225:4;14222:1;14215:15;14108:132;-1:-1:-1;14254:9:1;;14052:217::o;14274:168::-;14314:7;14380:1;14376;14372:6;14368:14;14365:1;14362:21;14357:1;14350:9;14343:17;14339:45;14336:71;;;14387:18;;:::i;:::-;-1:-1:-1;14427:9:1;;14274:168::o;14447:125::-;14487:4;14515:1;14512;14509:8;14506:34;;;14520:18;;:::i;:::-;-1:-1:-1;14557:9:1;;14447:125::o;14577:380::-;14656:1;14652:12;;;;14699;;;14720:61;;14774:4;14766:6;14762:17;14752:27;;14720:61;14827:2;14819:6;14816:14;14796:18;14793:38;14790:161;;;14873:10;14868:3;14864:20;14861:1;14854:31;14908:4;14905:1;14898:15;14936:4;14933:1;14926:15;14962:135;15001:3;-1:-1:-1;;15022:17:1;;15019:43;;;15042:18;;:::i;:::-;-1:-1:-1;15089:1:1;15078:13;;14962:135::o;15102:127::-;15163:10;15158:3;15154:20;15151:1;15144:31;15194:4;15191:1;15184:15;15218:4;15215:1;15208:15;15234:127;15295:10;15290:3;15286:20;15283:1;15276:31;15326:4;15323:1;15316:15;15350:4;15347:1;15340:15;15366:127;15427:10;15422:3;15418:20;15415:1;15408:31;15458:4;15455:1;15448:15;15482:4;15479:1;15472:15;15498:127;15559:10;15554:3;15550:20;15547:1;15540:31;15590:4;15587:1;15580:15;15614:4;15611:1;15604:15;15630:131;-1:-1:-1;;;;;15705:31:1;;15695:42;;15685:70;;15751:1;15748;15741:12
Swarm Source
ipfs://816d6c8aa17353914141bb5bc30775792f30e335f2b8c5c134178704d0c2efd7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.