More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 46,179 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21241058 | 18 hrs ago | IN | 0 ETH | 0.00047308 | ||||
Safe Transfer Fr... | 21237623 | 30 hrs ago | IN | 0 ETH | 0.00172145 | ||||
Change Name | 21232683 | 46 hrs ago | IN | 0 ETH | 0.00110405 | ||||
Set Approval For... | 21230859 | 2 days ago | IN | 0 ETH | 0.00097534 | ||||
Set Approval For... | 21230260 | 2 days ago | IN | 0 ETH | 0.00122808 | ||||
Set Approval For... | 21228236 | 2 days ago | IN | 0 ETH | 0.00049513 | ||||
Set Approval For... | 21227852 | 2 days ago | IN | 0 ETH | 0.00041679 | ||||
Set Approval For... | 21223784 | 3 days ago | IN | 0 ETH | 0.00103378 | ||||
Safe Transfer Fr... | 21219462 | 3 days ago | IN | 0 ETH | 0.00106416 | ||||
Set Approval For... | 21219019 | 3 days ago | IN | 0 ETH | 0.00047042 | ||||
Set Approval For... | 21218590 | 3 days ago | IN | 0 ETH | 0.00051033 | ||||
Set Approval For... | 21218404 | 3 days ago | IN | 0 ETH | 0.0005113 | ||||
Set Approval For... | 21212471 | 4 days ago | IN | 0 ETH | 0.00049043 | ||||
Set Approval For... | 21210892 | 4 days ago | IN | 0 ETH | 0.00048789 | ||||
Set Approval For... | 21210861 | 4 days ago | IN | 0 ETH | 0.00041304 | ||||
Safe Transfer Fr... | 21210281 | 5 days ago | IN | 0 ETH | 0.00143631 | ||||
Set Approval For... | 21209956 | 5 days ago | IN | 0 ETH | 0.00052914 | ||||
Transfer From | 21207609 | 5 days ago | IN | 0 ETH | 0.00108912 | ||||
Set Approval For... | 21205411 | 5 days ago | IN | 0 ETH | 0.00045407 | ||||
Set Approval For... | 21183497 | 8 days ago | IN | 0 ETH | 0.0007705 | ||||
Set Approval For... | 21182159 | 9 days ago | IN | 0 ETH | 0.00089075 | ||||
Set Approval For... | 21182158 | 9 days ago | IN | 0 ETH | 0.00154058 | ||||
Set Approval For... | 21178942 | 9 days ago | IN | 0 ETH | 0.00166284 | ||||
Set Approval For... | 21173147 | 10 days ago | IN | 0 ETH | 0.00205233 | ||||
Set Approval For... | 21168954 | 10 days ago | IN | 0 ETH | 0.00108155 |
Loading...
Loading
Contract Name:
KongzVX
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-15 */ // SPDX-License-Identifier: NONE pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/Context /* * @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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // Part: OpenZeppelin/[email protected]/EnumerableMap /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { return _get(map, key, "EnumerableMap: nonexistent key"); } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint256(value))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key)))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key), errorMessage))); } } // Part: OpenZeppelin/[email protected]/EnumerableSet /** * @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.0.0, only sets of type `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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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(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(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(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(uint256(_at(set._inner, index))); } // 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)); } } // Part: OpenZeppelin/[email protected]/IERC165 /** * @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); } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/IERC721Receiver /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // Part: OpenZeppelin/[email protected]/SafeMath /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: OpenZeppelin/[email protected]/Strings /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // Part: OpenZeppelin/[email protected]/ERC165 /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // Part: OpenZeppelin/[email protected]/IERC721 /** * @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; } // Part: OpenZeppelin/[email protected]/Ownable /** * @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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Part: OpenZeppelin/[email protected]/IERC721Enumerable /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // Part: OpenZeppelin/[email protected]/IERC721Metadata /** * @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); } // Part: OpenZeppelin/[email protected]/ERC721 /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(_baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(_baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseURI, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = 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 override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view 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 returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 { } } // Part: ERC721Namable contract ERC721Namable is ERC721 { uint256 public nameChangePrice = 10 ether; // uint256 constant public BIO_CHANGE_PRICE = 100 ether; // mapping(uint256 => string) public bio; // Mapping from token ID to name mapping (uint256 => string) private _tokenName; // Mapping if certain name string has already been reserved mapping (string => bool) private _nameReserved; event NameChange (uint256 indexed tokenId, string newName); event BioChange (uint256 indexed tokenId, string bio); constructor(string memory _name, string memory _symbol, string[] memory _names, uint256[] memory _ids) public ERC721(_name, _symbol) { for (uint256 i = 0; i < _ids.length; i++) { toggleReserveName(_names[i], true); _tokenName[_ids[i]] = _names[i]; emit NameChange(_ids[i], _names[i]); } } // function changeBio(uint256 _tokenId, string memory _bio) public virtual { // address owner = ownerOf(_tokenId); // require(_msgSender() == owner, "ERC721: caller is not the owner"); // bio[_tokenId] = _bio; // emit BioChange(_tokenId, _bio); // } function changeName(uint256 tokenId, string memory newName) public virtual { address owner = ownerOf(tokenId); require(_msgSender() == owner, "ERC721: caller is not the owner"); require(validateName(newName) == true, "Not a valid new name"); require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "New name is same as the current one"); require(isNameReserved(newName) == false, "Name already reserved"); // If already named, dereserve old name if (bytes(_tokenName[tokenId]).length > 0) { toggleReserveName(_tokenName[tokenId], false); } toggleReserveName(newName, true); _tokenName[tokenId] = newName; emit NameChange(tokenId, newName); } /** * @dev Reserves the name if isReserve is set to true, de-reserves if set to false */ function toggleReserveName(string memory str, bool isReserve) internal { _nameReserved[toLower(str)] = isReserve; } /** * @dev Returns name of the NFT at index. */ function tokenNameByIndex(uint256 index) public view returns (string memory) { return _tokenName[index]; } /** * @dev Returns if the name has been reserved. */ function isNameReserved(string memory nameString) public view returns (bool) { return _nameReserved[toLower(nameString)]; } function validateName(string memory str) public pure returns (bool){ bytes memory b = bytes(str); if(b.length < 1) return false; if(b.length > 25) return false; // Cannot be longer than 25 characters if(b[0] == 0x20) return false; // Leading space if (b[b.length - 1] == 0x20) return false; // Trailing space bytes1 lastChar = b[0]; for(uint i; i<b.length; i++){ bytes1 char = b[i]; if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces if( !(char >= 0x30 && char <= 0x39) && //9-0 !(char >= 0x41 && char <= 0x5A) && //A-Z !(char >= 0x61 && char <= 0x7A) && //a-z !(char == 0x20) //space ) return false; lastChar = char; } return true; } /** * @dev Converts the string to lowercase */ function toLower(string memory str) public pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } } // File: KongzVx.sol contract KongzVX is ERC721Namable, Ownable { address constant public KONGZ = address(0x57a204AA1042f6E66DD7730813f4024114d74f37); uint256 constant public CAP = 15000; uint256 constant public MINTABLE = 14000; uint256 constant public BUYABLE = 10000; uint256 constant public PRICE = 7 ether / 100; uint256[MINTABLE] internal availableIds; uint256 public sold; uint256 public minted; address public banana; uint256 public startTime; mapping(uint256 => uint256) public bebeClaimBitMask; constructor(address _banana, string memory _name, string memory _symbol, string[] memory _names, uint256[] memory _ids) public ERC721Namable(_name, _symbol, _names, _ids) { _setBaseURI("http://kongz.herokuapp.com/api/metadata-vx"); banana = _banana; } function setStartTime(uint256 _start) external onlyOwner { require(block.timestamp < startTime || startTime == 0); require(_start > block.timestamp); startTime = _start; } function updateURI(string memory newURI) public onlyOwner { _setBaseURI(newURI); } function setBanana(address _banana) external onlyOwner { banana = _banana; } function changeNamePrice(uint256 _price) external onlyOwner { nameChangePrice = _price; } function _isContract(address _addr) internal view returns (bool) { uint32 _size; assembly { _size:= extcodesize(_addr) } return (_size > 0); } function isClaimed(uint256 _tokenId) public view returns (bool) { uint256 wordIndex = _tokenId / 256; uint256 bitIndex = _tokenId % 256; uint256 mask = 1 << bitIndex; return bebeClaimBitMask[wordIndex] & mask == mask; } function _setClaimed(uint256 _tokenId) internal{ uint256 wordIndex = _tokenId / 256; uint256 bitIndex = _tokenId % 256; uint256 mask = 1 << bitIndex; bebeClaimBitMask[wordIndex] |= mask; } function _getNewId(uint256 _totalMinted) internal returns(uint256 value) { uint256 remaining = MINTABLE - _totalMinted; uint rand = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp, remaining))) % remaining; value = 0; // if array value exists, use, otherwise, use generated random value if (availableIds[rand] != 0) value = availableIds[rand]; else value = rand; // store remaining - 1 in used ID to create mapping if (availableIds[remaining - 1] == 0) availableIds[rand] = remaining - 1; else availableIds[rand] = availableIds[remaining - 1]; value += 1001; } // function claim(uint256[] calldata _tokenIds) external { // uint256 currentMinted = sold + minted; // uint256 bebeIndex = 0; // for (uint256 i = 0; i < _tokenIds.length; i++) { // require(IERC721(KONGZ).ownerOf(_tokenIds[i]) == msg.sender, "KongzVX: !owner of token"); // if (_tokenIds[i] < 1004) { // require(!_exists(_tokenIds[i]), "KongzVX: Genesis claimed already"); // _mint(msg.sender, _tokenIds[i]); // } // else { // require(!isClaimed(_tokenIds[i]), "KongzVX: Bebe claimed already"); // _setClaimed(_tokenIds[i]); // _mint(msg.sender, _getNewId(currentMinted + bebeIndex)); // bebeIndex++; // } // } // minted += bebeIndex; // } function claim(uint256 _tokenId) external { require(block.timestamp >= startTime && startTime != 0, "KongzVX: Claiming not started"); require(IERC721(KONGZ).ownerOf(_tokenId) == msg.sender, "KongzVX: !owner of token"); if (_tokenId < 1001) { require(!_exists(_tokenId), "KongzVX: Genesis claimed already"); _mint(msg.sender, _tokenId); } else { uint256 currentMinted = sold + minted; require(!isClaimed(_tokenId), "KongzVX: Bebe claimed already"); _setClaimed(_tokenId); _mint(msg.sender, _getNewId(currentMinted)); minted++; } } function mint(uint256 _amount) external payable { require(block.timestamp >= startTime && startTime != 0, "KongzVX: Minting not started"); require(sold + _amount <= BUYABLE, "KongzVX: Buyable amount has been reached"); require(_amount < 4, "KongzVX: Buy limit is 3"); require(msg.value == PRICE * _amount, "KongzVX: incorrect price"); require(!_isContract(msg.sender), "KongzVX: Caller cannot be contract"); uint256 currentMinted = sold + minted; for (uint256 i = 0; i < _amount; i++) _mint(msg.sender, _getNewId(currentMinted + i)); sold += _amount; } function changeName(uint256 tokenId, string memory newName) public override { IERC20(banana).transferFrom(msg.sender, owner(), nameChangePrice); super.changeName(tokenId, newName); } function fetchSaleFunds() external onlyOwner { msg.sender.transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_banana","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string[]","name":"_names","type":"string[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"bio","type":"string"}],"name":"BioChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUYABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KONGZ","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"banana","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bebeClaimBitMask","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changeNamePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fetchSaleFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_banana","type":"address"}],"name":"setBanana","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
6080604052678ac7230489e80000600a553480156200001d57600080fd5b5060405162003b0838038062003b08833981016040819052620000409162000632565b838383838383620000586301ffc9a760e01b62000263565b81516200006d90600690602085019062000452565b5080516200008390600790602084019062000452565b50620000966380ac58cd60e01b62000263565b620000a8635b5e139f60e01b62000263565b620000ba63780e9d6360e01b62000263565b505060005b8151811015620001ad57620000f0838281518110620000da57fe5b60200260200101516001620002be60201b60201c565b828181518110620000fd57fe5b6020026020010151600b60008484815181106200011657fe5b6020026020010151815260200190815260200160002090805190602001906200014192919062000452565b508181815181106200014f57fe5b60200260200101517f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b8483815181106200018557fe5b60200260200101516040516200019c919062000724565b60405180910390a2600101620000bf565b50505050506000620001c4620002ff60201b60201c565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002366040518060600160405280602a815260200162003ade602a913962000303565b50506136c080546001600160a01b0319166001600160a01b039490941693909317909255506200080a9050565b6001600160e01b03198082161415620002995760405162461bcd60e51b8152600401620002909062000759565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80600c620002cc846200031c565b604051620002db919062000706565b908152604051908190036020019020805491151560ff199092169190911790555050565b3390565b80516200031890600990602084019062000452565b5050565b606080829050606081516001600160401b03811180156200033c57600080fd5b506040519080825280601f01601f19166020018201604052801562000368576020820181803683370190505b50905060005b82518110156200044a5760418382815181106200038757fe5b016020015160f81c10801590620003b35750605a838281518110620003a857fe5b016020015160f81c11155b156200040457828181518110620003c657fe5b602001015160f81c60f81b60f81c60200160f81b828281518110620003e757fe5b60200101906001600160f81b031916908160001a90535062000441565b8281815181106200041157fe5b602001015160f81c60f81b8282815181106200042957fe5b60200101906001600160f81b031916908160001a9053505b6001016200036e565b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200049557805160ff1916838001178555620004c5565b82800160010185558215620004c5579182015b82811115620004c5578251825591602001919060010190620004a8565b50620004d3929150620004d7565b5090565b5b80821115620004d35760008155600101620004d8565b600082601f830112620004ff578081fd5b8151620005166200051082620007b7565b62000790565b818152915060208083019084810160005b84811015620005545762000541888484518a0101620005c4565b8452928201929082019060010162000527565b505050505092915050565b600082601f83011262000570578081fd5b8151620005816200051082620007b7565b818152915060208083019084810181840286018201871015620005a357600080fd5b60005b848110156200055457815184529282019290820190600101620005a6565b600082601f830112620005d5578081fd5b81516001600160401b03811115620005eb578182fd5b62000600601f8201601f191660200162000790565b91508082528360208285010111156200061857600080fd5b6200062b816020840160208601620007d7565b5092915050565b600080600080600060a086880312156200064a578081fd5b85516001600160a01b038116811462000661578182fd5b60208701519095506001600160401b03808211156200067e578283fd5b6200068c89838a01620005c4565b95506040880151915080821115620006a2578283fd5b620006b089838a01620005c4565b94506060880151915080821115620006c6578283fd5b620006d489838a01620004ee565b93506080880151915080821115620006ea578283fd5b50620006f9888289016200055f565b9150509295509295909350565b600082516200071a818460208701620007d7565b9190910192915050565b600060208252825180602084015262000745816040850160208701620007d7565b601f01601f19169190910160400192915050565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6040518181016001600160401b0381118282101715620007af57600080fd5b604052919050565b60006001600160401b03821115620007cd578081fd5b5060209081020190565b60005b83811015620007f4578181015183820152602001620007da565b8381111562000804576000848401525b50505050565b6132c4806200081a6000396000f3fe6080604052600436106102675760003560e01c80638d859f3e11610144578063c30f4a5a116100b6578063d7a7d5ed1161007a578063d7a7d5ed146106cf578063e985e9c5146106e4578063ec81b48314610704578063ef75fdc114610719578063f2fde38b1461072e578063f30ec0ec1461074e57610267565b8063c30f4a5a1461063a578063c39cbef11461065a578063c3cafc6f1461067a578063c87b56dd1461068f578063cc371bf3146106af57610267565b806396ecc7091161010857806396ecc709146105875780639e34070f146105a75780639ffdb65a146105c7578063a0712d68146105e7578063a22cb465146105fa578063b88d4fde1461061a57610267565b80638d859f3e146105085780638da5cb5b1461051d57806390668ec6146105325780639416b4231461055257806395d89b411461057257610267565b806342842e0e116101dd5780636352211e116101a15780636352211e146104695780636c0360eb146104895780636d5224181461049e57806370a08231146104be578063715018a6146104de57806378e97925146104f357610267565b806342842e0e146103ea57806345ca77381461040a5780634f02c4201461041f5780634f6ccce71461043457806354292ffe1461045457610267565b806315b56d101161022f57806315b56d101461033557806318160ddd1461035557806323b872dd1461036a5780632f745c591461038a578063379607f5146103aa5780633e0a322d146103ca57610267565b806301ffc9a71461026c57806302c7e7af146102a257806306fdde03146102c4578063081812fc146102e6578063095ea7b314610313575b600080fd5b34801561027857600080fd5b5061028c61028736600461274a565b610763565b60405161029991906129ef565b60405180910390f35b3480156102ae57600080fd5b506102b7610786565b60405161029991906131c5565b3480156102d057600080fd5b506102d961078d565b60405161029991906129fa565b3480156102f257600080fd5b506103066103013660046127b5565b610823565b604051610299919061297a565b34801561031f57600080fd5b5061033361032e3660046126eb565b61086f565b005b34801561034157600080fd5b5061028c610350366004612782565b610907565b34801561036157600080fd5b506102b761093b565b34801561037657600080fd5b50610333610385366004612614565b61094c565b34801561039657600080fd5b506102b76103a53660046126eb565b610984565b3480156103b657600080fd5b506103336103c53660046127b5565b6109af565b3480156103d657600080fd5b506103336103e53660046127b5565b610b27565b3480156103f657600080fd5b50610333610405366004612614565b610b89565b34801561041657600080fd5b506102b7610ba4565b34801561042b57600080fd5b506102b7610baa565b34801561044057600080fd5b506102b761044f3660046127b5565b610bb1565b34801561046057600080fd5b506102b7610bc7565b34801561047557600080fd5b506103066104843660046127b5565b610bcd565b34801561049557600080fd5b506102d9610bf5565b3480156104aa57600080fd5b506102d96104b93660046127b5565b610c56565b3480156104ca57600080fd5b506102b76104d93660046125a4565b610cf7565b3480156104ea57600080fd5b50610333610d40565b3480156104ff57600080fd5b506102b7610dbf565b34801561051457600080fd5b506102b7610dc6565b34801561052957600080fd5b50610306610dd1565b34801561053e57600080fd5b5061033361054d3660046125a4565b610de0565b34801561055e57600080fd5b506102d961056d366004612782565b610e38565b34801561057e57600080fd5b506102d9610f5a565b34801561059357600080fd5b506102b76105a23660046127b5565b610fbb565b3480156105b357600080fd5b5061028c6105c23660046127b5565b610fce565b3480156105d357600080fd5b5061028c6105e2366004612782565b610ff5565b6103336105f53660046127b5565b6111e0565b34801561060657600080fd5b506103336106153660046126be565b6112df565b34801561062657600080fd5b50610333610635366004612654565b6113ad565b34801561064657600080fd5b50610333610655366004612782565b6113ec565b34801561066657600080fd5b506103336106753660046127cd565b61142a565b34801561068657600080fd5b506103066114c7565b34801561069b57600080fd5b506102d96106aa3660046127b5565b6114d7565b3480156106bb57600080fd5b506103336106ca3660046127b5565b611621565b3480156106db57600080fd5b5061030661165b565b3480156106f057600080fd5b5061028c6106ff3660046125dc565b611673565b34801561071057600080fd5b506102b76116a1565b34801561072557600080fd5b506103336116a7565b34801561073a57600080fd5b506103336107493660046125a4565b611708565b34801561075a57600080fd5b506102b76117bf565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6136be5481565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b820191906000526020600020905b8154815290600101906020018083116107fc57829003601f168201915b5050505050905090565b600061082e826117c5565b6108535760405162461bcd60e51b815260040161084a90612e7a565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087a82610bcd565b9050806001600160a01b0316836001600160a01b031614156108ae5760405162461bcd60e51b815260040161084a90612fd6565b806001600160a01b03166108c06117d2565b6001600160a01b031614806108dc57506108dc816106ff6117d2565b6108f85760405162461bcd60e51b815260040161084a90612d2d565b61090283836117d6565b505050565b6000600c61091483610e38565b604051610921919061286d565b9081526040519081900360200190205460ff169050919050565b60006109476002611844565b905090565b61095d6109576117d2565b8261184f565b6109795760405162461bcd60e51b815260040161084a90613096565b6109028383836118d4565b6001600160a01b03821660009081526001602052604081206109a690836119e2565b90505b92915050565b6136c15442101580156109c457506136c15415155b6109e05760405162461bcd60e51b815260040161084a90612cbf565b6040516331a9108f60e11b815233907357a204aa1042f6e66dd7730813f4024114d74f3790636352211e90610a199085906004016131c5565b60206040518083038186803b158015610a3157600080fd5b505afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6991906125c0565b6001600160a01b031614610a8f5760405162461bcd60e51b815260040161084a90613017565b6103e9811015610ace57610aa2816117c5565b15610abf5760405162461bcd60e51b815260040161084a90612c8a565b610ac933826119ee565b610b24565b6136bf546136be5401610ae082610fce565b15610afd5760405162461bcd60e51b815260040161084a90612cf6565b610b0682611ab2565b610b1833610b1383611ada565b6119ee565b506136bf805460010190555b50565b610b2f6117d2565b600d546001600160a01b03908116911614610b5c5760405162461bcd60e51b815260040161084a90612ec6565b6136c154421080610b6e57506136c154155b610b7757600080fd5b428111610b8357600080fd5b6136c155565b610902838383604051806020016040528060008152506113ad565b600a5481565b6136bf5481565b600080610bbf600284611bb4565b509392505050565b61271081565b60006109a9826040518060600160405280602981526020016132666029913960029190611bd0565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b6000818152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b50505050509050919050565b60006001600160a01b038216610d1f5760405162461bcd60e51b815260040161084a90612d8a565b6001600160a01b03821660009081526001602052604090206109a990611844565b610d486117d2565b600d546001600160a01b03908116911614610d755760405162461bcd60e51b815260040161084a90612ec6565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b6136c15481565b66f8b0a10e47000081565b600d546001600160a01b031690565b610de86117d2565b600d546001600160a01b03908116911614610e155760405162461bcd60e51b815260040161084a90612ec6565b6136c080546001600160a01b0319166001600160a01b0392909216919091179055565b6060808290506060815167ffffffffffffffff81118015610e5857600080fd5b506040519080825280601f01601f191660200182016040528015610e83576020820181803683370190505b50905060005b8251811015610bbf576041838281518110610ea057fe5b016020015160f81c10801590610eca5750605a838281518110610ebf57fe5b016020015160f81c11155b15610f1757828181518110610edb57fe5b602001015160f81c60f81b60f81c60200160f81b828281518110610efb57fe5b60200101906001600160f81b031916908160001a905350610f52565b828181518110610f2357fe5b602001015160f81c60f81b828281518110610f3a57fe5b60200101906001600160f81b031916908160001a9053505b600101610e89565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b6136c26020526000908152604090205481565b610100810460009081526136c26020526040902054600160ff9092169190911b9081161490565b60006060829050600181511015611010576000915050610781565b601981511115611024576000915050610781565b8060008151811061103157fe5b6020910101516001600160f81b031916600160fd1b1415611056576000915050610781565b8060018251038151811061106657fe5b6020910101516001600160f81b031916600160fd1b141561108b576000915050610781565b60008160008151811061109a57fe5b01602001516001600160f81b031916905060005b82518110156111d55760008382815181106110c557fe5b01602001516001600160f81b0319169050600160fd1b811480156110f65750600160fd1b6001600160f81b03198416145b15611108576000945050505050610781565b600360fc1b6001600160f81b03198216108015906111345750603960f81b6001600160f81b0319821611155b15801561116a5750604160f81b6001600160f81b03198216108015906111685750602d60f91b6001600160f81b0319821611155b155b801561119f5750606160f81b6001600160f81b031982161080159061119d5750603d60f91b6001600160f81b0319821611155b155b80156111b95750600160fd1b6001600160f81b0319821614155b156111cb576000945050505050610781565b91506001016110ae565b506001949350505050565b6136c15442101580156111f557506136c15415155b6112115760405162461bcd60e51b815260040161084a90612c07565b612710816136be540111156112385760405162461bcd60e51b815260040161084a9061304e565b600481106112585760405162461bcd60e51b815260040161084a9061311e565b8066f8b0a10e4700000234146112805760405162461bcd60e51b815260040161084a90612ad8565b61128933611be7565b156112a65760405162461bcd60e51b815260040161084a90613183565b6136bf546136be540160005b828110156112d1576112c933610b13838501611ada565b6001016112b2565b50506136be80549091019055565b6112e76117d2565b6001600160a01b0316826001600160a01b031614156113185760405162461bcd60e51b815260040161084a90612bd0565b80600560006113256117d2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113696117d2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a191906129ef565b60405180910390a35050565b6113be6113b86117d2565b8361184f565b6113da5760405162461bcd60e51b815260040161084a90613096565b6113e684848484611bf3565b50505050565b6113f46117d2565b600d546001600160a01b039081169116146114215760405162461bcd60e51b815260040161084a90612ec6565b610b2481611c26565b6136c0546001600160a01b03166323b872dd33611445610dd1565b600a546040518463ffffffff1660e01b81526004016114669392919061298e565b602060405180830381600087803b15801561148057600080fd5b505af1158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190612716565b506114c38282611c39565b5050565b6136c0546001600160a01b031681565b60606114e2826117c5565b6114fe5760405162461bcd60e51b815260040161084a90612f44565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115935780601f1061156857610100808354040283529160200191611593565b820191906000526020600020905b81548152906001019060200180831161157657829003601f168201915b5050600954939450505050600260001961010060018416150201909116046115bc579050610781565b8051156115ee576009816040516020016115d79291906128f9565b604051602081830303815290604052915050610781565b60096115f984611ecb565b60405160200161160a9291906128f9565b604051602081830303815290604052915050919050565b6116296117d2565b600d546001600160a01b039081169116146116565760405162461bcd60e51b815260040161084a90612ec6565b600a55565b7357a204aa1042f6e66dd7730813f4024114d74f3781565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b613a9881565b6116af6117d2565b600d546001600160a01b039081169116146116dc5760405162461bcd60e51b815260040161084a90612ec6565b60405133904780156108fc02916000818181858888f19350505050158015610b24573d6000803e3d6000fd5b6117106117d2565b600d546001600160a01b0390811691161461173d5760405162461bcd60e51b815260040161084a90612ec6565b6001600160a01b0381166117635760405162461bcd60e51b815260040161084a90612b0f565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6136b081565b60006109a9600283611fa6565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180b82610bcd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006109a982611fb2565b600061185a826117c5565b6118765760405162461bcd60e51b815260040161084a90612c3e565b600061188183610bcd565b9050806001600160a01b0316846001600160a01b031614806118bc5750836001600160a01b03166118b184610823565b6001600160a01b0316145b806118cc57506118cc8185611673565b949350505050565b826001600160a01b03166118e782610bcd565b6001600160a01b03161461190d5760405162461bcd60e51b815260040161084a90612efb565b6001600160a01b0382166119335760405162461bcd60e51b815260040161084a90612b8c565b61193e838383610902565b6119496000826117d6565b6001600160a01b038316600090815260016020526040902061196b9082611fb6565b506001600160a01b038216600090815260016020526040902061198e9082611fc2565b5061199b60028284611fce565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006109a68383611fe4565b6001600160a01b038216611a145760405162461bcd60e51b815260040161084a90612e16565b611a1d816117c5565b15611a3a5760405162461bcd60e51b815260040161084a90612b55565b611a4660008383610902565b6001600160a01b0382166000908152600160205260409020611a689082611fc2565b50611a7560028284611fce565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610100810460009081526136c2602052604090208054600160ff9093169290921b9091179055565b600080826136b003905060008133444285604051602001611afe949392919061283e565b6040516020818303038152906040528051906020012060001c81611b1e57fe5b06905060009250600e816136b08110611b3357fe5b015415611b5157600e816136b08110611b4857fe5b01549250611b55565b8092505b600e600183036136b08110611b6657fe5b0154611b855760018203600e826136b08110611b7e57fe5b0155611ba9565b600e600183036136b08110611b9657fe5b0154600e826136b08110611ba657fe5b01555b50506103e901919050565b6000808080611bc38686612029565b9097909650945050505050565b6000611bdd848484612085565b90505b9392505050565b3b63ffffffff16151590565b611bfe8484846118d4565b611c0a848484846120e4565b6113e65760405162461bcd60e51b815260040161084a90612a86565b80516114c3906009906020840190612493565b6000611c4483610bcd565b9050806001600160a01b0316611c586117d2565b6001600160a01b031614611c7e5760405162461bcd60e51b815260040161084a90612a4f565b611c8782610ff5565b1515600114611ca85760405162461bcd60e51b815260040161084a90613155565b6000838152600b6020526040908190209051600291611cc691612889565b602060405180830381855afa158015611ce3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d069190612732565b600283604051611d16919061286d565b602060405180830381855afa158015611d33573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d569190612732565b1415611d745760405162461bcd60e51b815260040161084a90612f93565b611d7d82610907565b15611d9a5760405162461bcd60e51b815260040161084a90612e4b565b6000838152600b60205260409020546002600019610100600184161502019091160415611e63576000838152600b602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452611e639392830182828015611e575780601f10611e2c57610100808354040283529160200191611e57565b820191906000526020600020905b815481529060010190602001808311611e3a57829003601f168201915b505050505060006121c3565b611e6e8260016121c3565b6000838152600b602090815260409091208351611e8d92850190612493565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b83604051611ebe91906129fa565b60405180910390a2505050565b606081611ef057506040805180820190915260018152600360fc1b6020820152610781565b8160005b8115611f0857600101600a82049150611ef4565b60608167ffffffffffffffff81118015611f2157600080fd5b506040519080825280601f01601f191660200182016040528015611f4c576020820181803683370190505b50859350905060001982015b8315611f9d57600a840660300160f81b82828060019003935081518110611f7b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611f58565b50949350505050565b60006109a68383612200565b5490565b60006109a68383612218565b60006109a683836122de565b6000611bdd84846001600160a01b038516612328565b815460009082106120075760405162461bcd60e51b815260040161084a90612a0d565b82600001828154811061201657fe5b9060005260206000200154905092915050565b81546000908190831061204e5760405162461bcd60e51b815260040161084a90612dd4565b600084600001848154811061205f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816120b55760405162461bcd60e51b815260040161084a91906129fa565b508460000160018203815481106120c857fe5b9060005260206000209060020201600101549150509392505050565b60006120f8846001600160a01b03166123bf565b612104575060016118cc565b606061218c630a85bd0160e11b6121196117d2565b88878760405160240161212f94939291906129b2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613234603291396001600160a01b03881691906123c5565b90506000818060200190518101906121a49190612766565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b80600c6121cf84610e38565b6040516121dc919061286d565b908152604051908190036020019020805491151560ff199092169190911790555050565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156122d4578354600019808301919081019060009087908390811061224b57fe5b906000526020600020015490508087600001848154811061226857fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061229857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109a9565b60009150506109a9565b60006122ea8383612200565b612320575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109a9565b5060006109a9565b60008281526001840160205260408120548061238d575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611be0565b828560000160018303815481106123a057fe5b9060005260206000209060020201600101819055506000915050611be0565b3b151590565b6060611bdd848460008560606123da856123bf565b6123f65760405162461bcd60e51b815260040161084a906130e7565b60006060866001600160a01b03168587604051612413919061286d565b60006040518083038185875af1925050503d8060008114612450576040519150601f19603f3d011682016040523d82523d6000602084013e612455565b606091505b509150915081156124695791506118cc9050565b8051156124795780518082602001fd5b8360405162461bcd60e51b815260040161084a91906129fa565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106124d457805160ff1916838001178555612501565b82800160010185558215612501579182015b828111156125015782518255916020019190600101906124e6565b5061250d929150612511565b5090565b5b8082111561250d5760008155600101612512565b600082601f830112612536578081fd5b813567ffffffffffffffff8082111561254d578283fd5b604051601f8301601f19168101602001828111828210171561256d578485fd5b60405282815292508284830160200186101561258857600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156125b5578081fd5b8135611be0816131fa565b6000602082840312156125d1578081fd5b8151611be0816131fa565b600080604083850312156125ee578081fd5b82356125f9816131fa565b91506020830135612609816131fa565b809150509250929050565b600080600060608486031215612628578081fd5b8335612633816131fa565b92506020840135612643816131fa565b929592945050506040919091013590565b60008060008060808587031215612669578081fd5b8435612674816131fa565b93506020850135612684816131fa565b925060408501359150606085013567ffffffffffffffff8111156126a6578182fd5b6126b287828801612526565b91505092959194509250565b600080604083850312156126d0578182fd5b82356126db816131fa565b915060208301356126098161320f565b600080604083850312156126fd578182fd5b8235612708816131fa565b946020939093013593505050565b600060208284031215612727578081fd5b8151611be08161320f565b600060208284031215612743578081fd5b5051919050565b60006020828403121561275b578081fd5b8135611be08161321d565b600060208284031215612777578081fd5b8151611be08161321d565b600060208284031215612793578081fd5b813567ffffffffffffffff8111156127a9578182fd5b6118cc84828501612526565b6000602082840312156127c6578081fd5b5035919050565b600080604083850312156127df578182fd5b82359150602083013567ffffffffffffffff8111156127fc578182fd5b61280885828601612526565b9150509250929050565b6000815180845261282a8160208601602086016131ce565b601f01601f19169290920160200192915050565b60609490941b6bffffffffffffffffffffffff1916845260148401929092526034830152605482015260740190565b6000825161287f8184602087016131ce565b9190910192915050565b60008083546001808216600081146128a857600181146128bf576128ee565b60ff198316865260028304607f16860193506128ee565b600283048786526020808720875b838110156128e65781548a8201529085019082016128cd565b505050860193505b509195945050505050565b6000808454600180821660008114612918576001811461292f5761295e565b60ff198316865260028304607f168601935061295e565b600283048886526020808720875b838110156129565781548a82015290850190820161293d565b505050860193505b50505083516129718183602088016131ce565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129e590830184612812565b9695505050505050565b901515815260200190565b6000602082526109a66020830184612812565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601f908201527f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4b6f6e677a56583a20696e636f72726563742070726963650000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601c908201527f4b6f6e677a56583a204d696e74696e67206e6f74207374617274656400000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4b6f6e677a56583a2047656e6573697320636c61696d656420616c7265616479604082015260600190565b6020808252601d908201527f4b6f6e677a56583a20436c61696d696e67206e6f742073746172746564000000604082015260600190565b6020808252601d908201527f4b6f6e677a56583a204265626520636c61696d656420616c7265616479000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526015908201527413985b5948185b1c9958591e481c995cd95c9d9959605a1b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526018908201527f4b6f6e677a56583a20216f776e6572206f6620746f6b656e0000000000000000604082015260600190565b60208082526028908201527f4b6f6e677a56583a2042757961626c6520616d6f756e7420686173206265656e604082015267081c995858da195960c21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526017908201527f4b6f6e677a56583a20427579206c696d69742069732033000000000000000000604082015260600190565b6020808252601490820152734e6f7420612076616c6964206e6577206e616d6560601b604082015260600190565b60208082526022908201527f4b6f6e677a56583a2043616c6c65722063616e6e6f7420626520636f6e74726160408201526118dd60f21b606082015260800190565b90815260200190565b60005b838110156131e95781810151838201526020016131d1565b838111156113e65750506000910152565b6001600160a01b0381168114610b2457600080fd5b8015158114610b2457600080fd5b6001600160e01b031981168114610b2457600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220194bb9ea2d6b9b6c69f4de8ab616d2ffdf42282ad94b648bdb9c574bf06b163c64736f6c634300060c0033687474703a2f2f6b6f6e677a2e6865726f6b756170702e636f6d2f6170692f6d657461646174612d7678000000000000000000000000e2311ae37502105b442bbef831e9b53c5d2e9b3b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d43796265724b6f6e677a2056580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084b4f4e475a205658000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102675760003560e01c80638d859f3e11610144578063c30f4a5a116100b6578063d7a7d5ed1161007a578063d7a7d5ed146106cf578063e985e9c5146106e4578063ec81b48314610704578063ef75fdc114610719578063f2fde38b1461072e578063f30ec0ec1461074e57610267565b8063c30f4a5a1461063a578063c39cbef11461065a578063c3cafc6f1461067a578063c87b56dd1461068f578063cc371bf3146106af57610267565b806396ecc7091161010857806396ecc709146105875780639e34070f146105a75780639ffdb65a146105c7578063a0712d68146105e7578063a22cb465146105fa578063b88d4fde1461061a57610267565b80638d859f3e146105085780638da5cb5b1461051d57806390668ec6146105325780639416b4231461055257806395d89b411461057257610267565b806342842e0e116101dd5780636352211e116101a15780636352211e146104695780636c0360eb146104895780636d5224181461049e57806370a08231146104be578063715018a6146104de57806378e97925146104f357610267565b806342842e0e146103ea57806345ca77381461040a5780634f02c4201461041f5780634f6ccce71461043457806354292ffe1461045457610267565b806315b56d101161022f57806315b56d101461033557806318160ddd1461035557806323b872dd1461036a5780632f745c591461038a578063379607f5146103aa5780633e0a322d146103ca57610267565b806301ffc9a71461026c57806302c7e7af146102a257806306fdde03146102c4578063081812fc146102e6578063095ea7b314610313575b600080fd5b34801561027857600080fd5b5061028c61028736600461274a565b610763565b60405161029991906129ef565b60405180910390f35b3480156102ae57600080fd5b506102b7610786565b60405161029991906131c5565b3480156102d057600080fd5b506102d961078d565b60405161029991906129fa565b3480156102f257600080fd5b506103066103013660046127b5565b610823565b604051610299919061297a565b34801561031f57600080fd5b5061033361032e3660046126eb565b61086f565b005b34801561034157600080fd5b5061028c610350366004612782565b610907565b34801561036157600080fd5b506102b761093b565b34801561037657600080fd5b50610333610385366004612614565b61094c565b34801561039657600080fd5b506102b76103a53660046126eb565b610984565b3480156103b657600080fd5b506103336103c53660046127b5565b6109af565b3480156103d657600080fd5b506103336103e53660046127b5565b610b27565b3480156103f657600080fd5b50610333610405366004612614565b610b89565b34801561041657600080fd5b506102b7610ba4565b34801561042b57600080fd5b506102b7610baa565b34801561044057600080fd5b506102b761044f3660046127b5565b610bb1565b34801561046057600080fd5b506102b7610bc7565b34801561047557600080fd5b506103066104843660046127b5565b610bcd565b34801561049557600080fd5b506102d9610bf5565b3480156104aa57600080fd5b506102d96104b93660046127b5565b610c56565b3480156104ca57600080fd5b506102b76104d93660046125a4565b610cf7565b3480156104ea57600080fd5b50610333610d40565b3480156104ff57600080fd5b506102b7610dbf565b34801561051457600080fd5b506102b7610dc6565b34801561052957600080fd5b50610306610dd1565b34801561053e57600080fd5b5061033361054d3660046125a4565b610de0565b34801561055e57600080fd5b506102d961056d366004612782565b610e38565b34801561057e57600080fd5b506102d9610f5a565b34801561059357600080fd5b506102b76105a23660046127b5565b610fbb565b3480156105b357600080fd5b5061028c6105c23660046127b5565b610fce565b3480156105d357600080fd5b5061028c6105e2366004612782565b610ff5565b6103336105f53660046127b5565b6111e0565b34801561060657600080fd5b506103336106153660046126be565b6112df565b34801561062657600080fd5b50610333610635366004612654565b6113ad565b34801561064657600080fd5b50610333610655366004612782565b6113ec565b34801561066657600080fd5b506103336106753660046127cd565b61142a565b34801561068657600080fd5b506103066114c7565b34801561069b57600080fd5b506102d96106aa3660046127b5565b6114d7565b3480156106bb57600080fd5b506103336106ca3660046127b5565b611621565b3480156106db57600080fd5b5061030661165b565b3480156106f057600080fd5b5061028c6106ff3660046125dc565b611673565b34801561071057600080fd5b506102b76116a1565b34801561072557600080fd5b506103336116a7565b34801561073a57600080fd5b506103336107493660046125a4565b611708565b34801561075a57600080fd5b506102b76117bf565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6136be5481565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b820191906000526020600020905b8154815290600101906020018083116107fc57829003601f168201915b5050505050905090565b600061082e826117c5565b6108535760405162461bcd60e51b815260040161084a90612e7a565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087a82610bcd565b9050806001600160a01b0316836001600160a01b031614156108ae5760405162461bcd60e51b815260040161084a90612fd6565b806001600160a01b03166108c06117d2565b6001600160a01b031614806108dc57506108dc816106ff6117d2565b6108f85760405162461bcd60e51b815260040161084a90612d2d565b61090283836117d6565b505050565b6000600c61091483610e38565b604051610921919061286d565b9081526040519081900360200190205460ff169050919050565b60006109476002611844565b905090565b61095d6109576117d2565b8261184f565b6109795760405162461bcd60e51b815260040161084a90613096565b6109028383836118d4565b6001600160a01b03821660009081526001602052604081206109a690836119e2565b90505b92915050565b6136c15442101580156109c457506136c15415155b6109e05760405162461bcd60e51b815260040161084a90612cbf565b6040516331a9108f60e11b815233907357a204aa1042f6e66dd7730813f4024114d74f3790636352211e90610a199085906004016131c5565b60206040518083038186803b158015610a3157600080fd5b505afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6991906125c0565b6001600160a01b031614610a8f5760405162461bcd60e51b815260040161084a90613017565b6103e9811015610ace57610aa2816117c5565b15610abf5760405162461bcd60e51b815260040161084a90612c8a565b610ac933826119ee565b610b24565b6136bf546136be5401610ae082610fce565b15610afd5760405162461bcd60e51b815260040161084a90612cf6565b610b0682611ab2565b610b1833610b1383611ada565b6119ee565b506136bf805460010190555b50565b610b2f6117d2565b600d546001600160a01b03908116911614610b5c5760405162461bcd60e51b815260040161084a90612ec6565b6136c154421080610b6e57506136c154155b610b7757600080fd5b428111610b8357600080fd5b6136c155565b610902838383604051806020016040528060008152506113ad565b600a5481565b6136bf5481565b600080610bbf600284611bb4565b509392505050565b61271081565b60006109a9826040518060600160405280602981526020016132666029913960029190611bd0565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b6000818152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b50505050509050919050565b60006001600160a01b038216610d1f5760405162461bcd60e51b815260040161084a90612d8a565b6001600160a01b03821660009081526001602052604090206109a990611844565b610d486117d2565b600d546001600160a01b03908116911614610d755760405162461bcd60e51b815260040161084a90612ec6565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b6136c15481565b66f8b0a10e47000081565b600d546001600160a01b031690565b610de86117d2565b600d546001600160a01b03908116911614610e155760405162461bcd60e51b815260040161084a90612ec6565b6136c080546001600160a01b0319166001600160a01b0392909216919091179055565b6060808290506060815167ffffffffffffffff81118015610e5857600080fd5b506040519080825280601f01601f191660200182016040528015610e83576020820181803683370190505b50905060005b8251811015610bbf576041838281518110610ea057fe5b016020015160f81c10801590610eca5750605a838281518110610ebf57fe5b016020015160f81c11155b15610f1757828181518110610edb57fe5b602001015160f81c60f81b60f81c60200160f81b828281518110610efb57fe5b60200101906001600160f81b031916908160001a905350610f52565b828181518110610f2357fe5b602001015160f81c60f81b828281518110610f3a57fe5b60200101906001600160f81b031916908160001a9053505b600101610e89565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108195780601f106107ee57610100808354040283529160200191610819565b6136c26020526000908152604090205481565b610100810460009081526136c26020526040902054600160ff9092169190911b9081161490565b60006060829050600181511015611010576000915050610781565b601981511115611024576000915050610781565b8060008151811061103157fe5b6020910101516001600160f81b031916600160fd1b1415611056576000915050610781565b8060018251038151811061106657fe5b6020910101516001600160f81b031916600160fd1b141561108b576000915050610781565b60008160008151811061109a57fe5b01602001516001600160f81b031916905060005b82518110156111d55760008382815181106110c557fe5b01602001516001600160f81b0319169050600160fd1b811480156110f65750600160fd1b6001600160f81b03198416145b15611108576000945050505050610781565b600360fc1b6001600160f81b03198216108015906111345750603960f81b6001600160f81b0319821611155b15801561116a5750604160f81b6001600160f81b03198216108015906111685750602d60f91b6001600160f81b0319821611155b155b801561119f5750606160f81b6001600160f81b031982161080159061119d5750603d60f91b6001600160f81b0319821611155b155b80156111b95750600160fd1b6001600160f81b0319821614155b156111cb576000945050505050610781565b91506001016110ae565b506001949350505050565b6136c15442101580156111f557506136c15415155b6112115760405162461bcd60e51b815260040161084a90612c07565b612710816136be540111156112385760405162461bcd60e51b815260040161084a9061304e565b600481106112585760405162461bcd60e51b815260040161084a9061311e565b8066f8b0a10e4700000234146112805760405162461bcd60e51b815260040161084a90612ad8565b61128933611be7565b156112a65760405162461bcd60e51b815260040161084a90613183565b6136bf546136be540160005b828110156112d1576112c933610b13838501611ada565b6001016112b2565b50506136be80549091019055565b6112e76117d2565b6001600160a01b0316826001600160a01b031614156113185760405162461bcd60e51b815260040161084a90612bd0565b80600560006113256117d2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113696117d2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a191906129ef565b60405180910390a35050565b6113be6113b86117d2565b8361184f565b6113da5760405162461bcd60e51b815260040161084a90613096565b6113e684848484611bf3565b50505050565b6113f46117d2565b600d546001600160a01b039081169116146114215760405162461bcd60e51b815260040161084a90612ec6565b610b2481611c26565b6136c0546001600160a01b03166323b872dd33611445610dd1565b600a546040518463ffffffff1660e01b81526004016114669392919061298e565b602060405180830381600087803b15801561148057600080fd5b505af1158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190612716565b506114c38282611c39565b5050565b6136c0546001600160a01b031681565b60606114e2826117c5565b6114fe5760405162461bcd60e51b815260040161084a90612f44565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115935780601f1061156857610100808354040283529160200191611593565b820191906000526020600020905b81548152906001019060200180831161157657829003601f168201915b5050600954939450505050600260001961010060018416150201909116046115bc579050610781565b8051156115ee576009816040516020016115d79291906128f9565b604051602081830303815290604052915050610781565b60096115f984611ecb565b60405160200161160a9291906128f9565b604051602081830303815290604052915050919050565b6116296117d2565b600d546001600160a01b039081169116146116565760405162461bcd60e51b815260040161084a90612ec6565b600a55565b7357a204aa1042f6e66dd7730813f4024114d74f3781565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b613a9881565b6116af6117d2565b600d546001600160a01b039081169116146116dc5760405162461bcd60e51b815260040161084a90612ec6565b60405133904780156108fc02916000818181858888f19350505050158015610b24573d6000803e3d6000fd5b6117106117d2565b600d546001600160a01b0390811691161461173d5760405162461bcd60e51b815260040161084a90612ec6565b6001600160a01b0381166117635760405162461bcd60e51b815260040161084a90612b0f565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6136b081565b60006109a9600283611fa6565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180b82610bcd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006109a982611fb2565b600061185a826117c5565b6118765760405162461bcd60e51b815260040161084a90612c3e565b600061188183610bcd565b9050806001600160a01b0316846001600160a01b031614806118bc5750836001600160a01b03166118b184610823565b6001600160a01b0316145b806118cc57506118cc8185611673565b949350505050565b826001600160a01b03166118e782610bcd565b6001600160a01b03161461190d5760405162461bcd60e51b815260040161084a90612efb565b6001600160a01b0382166119335760405162461bcd60e51b815260040161084a90612b8c565b61193e838383610902565b6119496000826117d6565b6001600160a01b038316600090815260016020526040902061196b9082611fb6565b506001600160a01b038216600090815260016020526040902061198e9082611fc2565b5061199b60028284611fce565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006109a68383611fe4565b6001600160a01b038216611a145760405162461bcd60e51b815260040161084a90612e16565b611a1d816117c5565b15611a3a5760405162461bcd60e51b815260040161084a90612b55565b611a4660008383610902565b6001600160a01b0382166000908152600160205260409020611a689082611fc2565b50611a7560028284611fce565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610100810460009081526136c2602052604090208054600160ff9093169290921b9091179055565b600080826136b003905060008133444285604051602001611afe949392919061283e565b6040516020818303038152906040528051906020012060001c81611b1e57fe5b06905060009250600e816136b08110611b3357fe5b015415611b5157600e816136b08110611b4857fe5b01549250611b55565b8092505b600e600183036136b08110611b6657fe5b0154611b855760018203600e826136b08110611b7e57fe5b0155611ba9565b600e600183036136b08110611b9657fe5b0154600e826136b08110611ba657fe5b01555b50506103e901919050565b6000808080611bc38686612029565b9097909650945050505050565b6000611bdd848484612085565b90505b9392505050565b3b63ffffffff16151590565b611bfe8484846118d4565b611c0a848484846120e4565b6113e65760405162461bcd60e51b815260040161084a90612a86565b80516114c3906009906020840190612493565b6000611c4483610bcd565b9050806001600160a01b0316611c586117d2565b6001600160a01b031614611c7e5760405162461bcd60e51b815260040161084a90612a4f565b611c8782610ff5565b1515600114611ca85760405162461bcd60e51b815260040161084a90613155565b6000838152600b6020526040908190209051600291611cc691612889565b602060405180830381855afa158015611ce3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d069190612732565b600283604051611d16919061286d565b602060405180830381855afa158015611d33573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d569190612732565b1415611d745760405162461bcd60e51b815260040161084a90612f93565b611d7d82610907565b15611d9a5760405162461bcd60e51b815260040161084a90612e4b565b6000838152600b60205260409020546002600019610100600184161502019091160415611e63576000838152600b602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452611e639392830182828015611e575780601f10611e2c57610100808354040283529160200191611e57565b820191906000526020600020905b815481529060010190602001808311611e3a57829003601f168201915b505050505060006121c3565b611e6e8260016121c3565b6000838152600b602090815260409091208351611e8d92850190612493565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b83604051611ebe91906129fa565b60405180910390a2505050565b606081611ef057506040805180820190915260018152600360fc1b6020820152610781565b8160005b8115611f0857600101600a82049150611ef4565b60608167ffffffffffffffff81118015611f2157600080fd5b506040519080825280601f01601f191660200182016040528015611f4c576020820181803683370190505b50859350905060001982015b8315611f9d57600a840660300160f81b82828060019003935081518110611f7b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611f58565b50949350505050565b60006109a68383612200565b5490565b60006109a68383612218565b60006109a683836122de565b6000611bdd84846001600160a01b038516612328565b815460009082106120075760405162461bcd60e51b815260040161084a90612a0d565b82600001828154811061201657fe5b9060005260206000200154905092915050565b81546000908190831061204e5760405162461bcd60e51b815260040161084a90612dd4565b600084600001848154811061205f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816120b55760405162461bcd60e51b815260040161084a91906129fa565b508460000160018203815481106120c857fe5b9060005260206000209060020201600101549150509392505050565b60006120f8846001600160a01b03166123bf565b612104575060016118cc565b606061218c630a85bd0160e11b6121196117d2565b88878760405160240161212f94939291906129b2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613234603291396001600160a01b03881691906123c5565b90506000818060200190518101906121a49190612766565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b80600c6121cf84610e38565b6040516121dc919061286d565b908152604051908190036020019020805491151560ff199092169190911790555050565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156122d4578354600019808301919081019060009087908390811061224b57fe5b906000526020600020015490508087600001848154811061226857fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061229857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109a9565b60009150506109a9565b60006122ea8383612200565b612320575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109a9565b5060006109a9565b60008281526001840160205260408120548061238d575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611be0565b828560000160018303815481106123a057fe5b9060005260206000209060020201600101819055506000915050611be0565b3b151590565b6060611bdd848460008560606123da856123bf565b6123f65760405162461bcd60e51b815260040161084a906130e7565b60006060866001600160a01b03168587604051612413919061286d565b60006040518083038185875af1925050503d8060008114612450576040519150601f19603f3d011682016040523d82523d6000602084013e612455565b606091505b509150915081156124695791506118cc9050565b8051156124795780518082602001fd5b8360405162461bcd60e51b815260040161084a91906129fa565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106124d457805160ff1916838001178555612501565b82800160010185558215612501579182015b828111156125015782518255916020019190600101906124e6565b5061250d929150612511565b5090565b5b8082111561250d5760008155600101612512565b600082601f830112612536578081fd5b813567ffffffffffffffff8082111561254d578283fd5b604051601f8301601f19168101602001828111828210171561256d578485fd5b60405282815292508284830160200186101561258857600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156125b5578081fd5b8135611be0816131fa565b6000602082840312156125d1578081fd5b8151611be0816131fa565b600080604083850312156125ee578081fd5b82356125f9816131fa565b91506020830135612609816131fa565b809150509250929050565b600080600060608486031215612628578081fd5b8335612633816131fa565b92506020840135612643816131fa565b929592945050506040919091013590565b60008060008060808587031215612669578081fd5b8435612674816131fa565b93506020850135612684816131fa565b925060408501359150606085013567ffffffffffffffff8111156126a6578182fd5b6126b287828801612526565b91505092959194509250565b600080604083850312156126d0578182fd5b82356126db816131fa565b915060208301356126098161320f565b600080604083850312156126fd578182fd5b8235612708816131fa565b946020939093013593505050565b600060208284031215612727578081fd5b8151611be08161320f565b600060208284031215612743578081fd5b5051919050565b60006020828403121561275b578081fd5b8135611be08161321d565b600060208284031215612777578081fd5b8151611be08161321d565b600060208284031215612793578081fd5b813567ffffffffffffffff8111156127a9578182fd5b6118cc84828501612526565b6000602082840312156127c6578081fd5b5035919050565b600080604083850312156127df578182fd5b82359150602083013567ffffffffffffffff8111156127fc578182fd5b61280885828601612526565b9150509250929050565b6000815180845261282a8160208601602086016131ce565b601f01601f19169290920160200192915050565b60609490941b6bffffffffffffffffffffffff1916845260148401929092526034830152605482015260740190565b6000825161287f8184602087016131ce565b9190910192915050565b60008083546001808216600081146128a857600181146128bf576128ee565b60ff198316865260028304607f16860193506128ee565b600283048786526020808720875b838110156128e65781548a8201529085019082016128cd565b505050860193505b509195945050505050565b6000808454600180821660008114612918576001811461292f5761295e565b60ff198316865260028304607f168601935061295e565b600283048886526020808720875b838110156129565781548a82015290850190820161293d565b505050860193505b50505083516129718183602088016131ce565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129e590830184612812565b9695505050505050565b901515815260200190565b6000602082526109a66020830184612812565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601f908201527f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4b6f6e677a56583a20696e636f72726563742070726963650000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601c908201527f4b6f6e677a56583a204d696e74696e67206e6f74207374617274656400000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4b6f6e677a56583a2047656e6573697320636c61696d656420616c7265616479604082015260600190565b6020808252601d908201527f4b6f6e677a56583a20436c61696d696e67206e6f742073746172746564000000604082015260600190565b6020808252601d908201527f4b6f6e677a56583a204265626520636c61696d656420616c7265616479000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526015908201527413985b5948185b1c9958591e481c995cd95c9d9959605a1b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526018908201527f4b6f6e677a56583a20216f776e6572206f6620746f6b656e0000000000000000604082015260600190565b60208082526028908201527f4b6f6e677a56583a2042757961626c6520616d6f756e7420686173206265656e604082015267081c995858da195960c21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526017908201527f4b6f6e677a56583a20427579206c696d69742069732033000000000000000000604082015260600190565b6020808252601490820152734e6f7420612076616c6964206e6577206e616d6560601b604082015260600190565b60208082526022908201527f4b6f6e677a56583a2043616c6c65722063616e6e6f7420626520636f6e74726160408201526118dd60f21b606082015260800190565b90815260200190565b60005b838110156131e95781810151838201526020016131d1565b838111156113e65750506000910152565b6001600160a01b0381168114610b2457600080fd5b8015158114610b2457600080fd5b6001600160e01b031981168114610b2457600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220194bb9ea2d6b9b6c69f4de8ab616d2ffdf42282ad94b648bdb9c574bf06b163c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e2311ae37502105b442bbef831e9b53c5d2e9b3b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d43796265724b6f6e677a2056580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084b4f4e475a205658000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _banana (address): 0xE2311ae37502105b442bBef831E9b53c5d2e9B3b
Arg [1] : _name (string): CyberKongz VX
Arg [2] : _symbol (string): KONGZ VX
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000e2311ae37502105b442bbef831e9b53c5d2e9b3b
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 43796265724b6f6e677a20565800000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 4b4f4e475a205658000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
OVERVIEW
CyberKongz are unique and randomly generated 2D/3D NFT Social Avatars for your online experiences.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.