Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Multichain Info
2 addresses found via
Latest 25 from a total of 848 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17194223 | 711 days ago | IN | 0 ETH | 0.00431049 | ||||
Buy | 17148769 | 717 days ago | IN | 0.005 ETH | 0.00078159 | ||||
Buy | 17144128 | 718 days ago | IN | 0.005 ETH | 0.00078159 | ||||
Open | 17116973 | 721 days ago | IN | 0 ETH | 0.00200568 | ||||
Buy | 17116808 | 721 days ago | IN | 0.005 ETH | 0.0035705 | ||||
Buy | 17116560 | 722 days ago | IN | 0.005 ETH | 0.00428928 | ||||
Buy | 17116559 | 722 days ago | IN | 0.005 ETH | 0.00402814 | ||||
Buy | 17116558 | 722 days ago | IN | 0.005 ETH | 0.00419696 | ||||
Buy | 17116558 | 722 days ago | IN | 0.005 ETH | 0.00419754 | ||||
Buy | 17116558 | 722 days ago | IN | 0.005 ETH | 0.00419754 | ||||
Buy | 17116558 | 722 days ago | IN | 0.005 ETH | 0.00419696 | ||||
Buy | 17116558 | 722 days ago | IN | 0.005 ETH | 0.00419754 | ||||
Buy | 17116555 | 722 days ago | IN | 0.005 ETH | 0.00361911 | ||||
Buy | 17116554 | 722 days ago | IN | 0.005 ETH | 0.00363615 | ||||
Buy | 17116551 | 722 days ago | IN | 0.005 ETH | 0.00366434 | ||||
Buy | 17116547 | 722 days ago | IN | 0.005 ETH | 0.00378331 | ||||
Buy | 17116544 | 722 days ago | IN | 0.005 ETH | 0.00408972 | ||||
Buy | 17116542 | 722 days ago | IN | 0.005 ETH | 0.00396233 | ||||
Buy | 17116541 | 722 days ago | IN | 0.005 ETH | 0.00400099 | ||||
Buy | 17116540 | 722 days ago | IN | 0.005 ETH | 0.00406597 | ||||
Buy | 17116540 | 722 days ago | IN | 0.005 ETH | 0.00406485 | ||||
Buy | 17116540 | 722 days ago | IN | 0.005 ETH | 0.00406597 | ||||
Buy | 17116539 | 722 days ago | IN | 0.005 ETH | 0.00414925 | ||||
Buy | 17116538 | 722 days ago | IN | 0.005 ETH | 0.00439762 | ||||
Buy | 17116534 | 722 days ago | IN | 0.005 ETH | 0.0038962 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 17194223 | 711 days ago | 4.2 ETH |
Loading...
Loading
Contract Name:
Presale
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-24 */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File: contracts/SecurityBase.sol pragma solidity ^0.8.17; contract SecurityBase is AccessControlEnumerable, Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); modifier onlyMinter() { _checkRole(MINTER_ROLE, _msgSender()); _; } modifier onlyAdmin() { _checkRole(DEFAULT_ADMIN_ROLE, _msgSender()); _; } constructor() { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); } function pause() external onlyMinter { _pause(); } function unpause() external onlyMinter { _unpause(); } function grantMinter(address account) external virtual onlyMinter { _setupRole(MINTER_ROLE, account); } function revokeMinter(address account) external virtual onlyMinter { _revokeRole(MINTER_ROLE, account); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable) returns (bool) { return super.supportsInterface(interfaceId); } } // File: contracts/Presale.sol pragma solidity ^0.8.17; contract Presale is SecurityBase { bool public _open; bool public _whitelistFlag; uint public _cursor; mapping(address => uint) private _stats; mapping(string => bool) private _usedNonces; uint constant public PRICE = 0.005 ether; uint constant public QUANTITY_LIMIT = 1; uint constant public TOTAL_SUPPLY = 2700; event Closed(uint timestamp); event Open(uint timestamp); event Refund(address spender, string nonce , uint refundAmount); event Sent(address spender, string nonce, uint amount, uint[] lstNumbers); struct Status { string state; uint totalSupply; uint cursor; } constructor() { _cursor = 0; _open = false; _whitelistFlag = true; } function open(bool newValue) external onlyMinter { if (_open != newValue) { _open = newValue; if (_open) { emit Open(block.timestamp); } else { emit Closed(block.timestamp); } } } function peek(address owner) external view returns(uint) { return _stats[owner]; } function setWhitelistFlag(bool newValue) external onlyMinter { if (_whitelistFlag != newValue) { _whitelistFlag = newValue; } } function status() external view returns(Status memory) { Status memory context; context.totalSupply = TOTAL_SUPPLY; context.cursor = _cursor; if (_cursor >= TOTAL_SUPPLY) { context.state = "SELL OUT"; } else if (!_open) { context.state = "COMING SOON"; } else { context.state = "OPEN"; } return context; } function withdraw(address payable to) external onlyMinter { uint balance = address(this).balance; if (balance > 0) { to.transfer(balance); } } function buy(string memory nonce, bytes calldata signature) external payable { require(msg.value == PRICE, "Wrong value"); require (_open, "Coming soon"); require(_cursor < TOTAL_SUPPLY, "Sell out"); require (_whitelistFlag, "Free time"); require(!_usedNonces[nonce], "Nonce used"); address spender = _msgSender(); require(_stats[spender] < QUANTITY_LIMIT, "Out of minted number"); bytes32 signedMessageHash = _getSignedMessageHash(spender, nonce, msg.value); address signer = _recoverSigner(signedMessageHash, signature); require(super.hasRole(MINTER_ROLE, signer), "Signature is not from minter"); uint[] memory lstNumbers = new uint[](1); lstNumbers[0] = _cursor++; _stats[spender]++; _usedNonces[nonce] = true; emit Sent(spender, nonce, msg.value, lstNumbers); } function freeBuy(string memory nonce, bytes calldata signature) external payable { require(msg.value >= PRICE && msg.value % PRICE == 0, "Wrong value"); require (_open, "Coming soon"); require(_cursor < TOTAL_SUPPLY, "Sell out"); require (!_whitelistFlag, "Whitelist time"); require(!_usedNonces[nonce], "Nonce used"); address spender = _msgSender(); bytes32 signedMessageHash = _getSignedMessageHash(spender, nonce, msg.value); address signer = _recoverSigner(signedMessageHash, signature); require(super.hasRole(MINTER_ROLE, signer), "Signature is not from minter"); uint cnt = msg.value / PRICE; if (_cursor + cnt > TOTAL_SUPPLY) { cnt = TOTAL_SUPPLY - _cursor; } uint[] memory lstNumbers = new uint[](cnt); for (uint i=0; i<cnt; i++) { lstNumbers[i] = _cursor++; } _stats[spender] += cnt; _usedNonces[nonce] = true; emit Sent(spender, nonce, msg.value, lstNumbers); uint usedAmount = cnt * PRICE; uint refundAmount = msg.value - usedAmount; // Refund of remaining if (refundAmount > 0) { payable(spender).transfer(refundAmount); emit Refund(spender, nonce, refundAmount); } } function _getSignedMessageHash(address spender, string memory nonce, uint amount) private pure returns (bytes32) { /* Signature is produced by signing a keccak256 hash with the following format: "\x19Ethereum Signed Message\n" + len(msg) + msg */ return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256( abi.encode( spender, nonce, amount ) ) ) ); } function _recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = _splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function _splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) { require(sig.length == 65, "Invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Open","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"string","name":"nonce","type":"string"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"string","name":"nonce","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"lstNumbers","type":"uint256[]"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUANTITY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"freeBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"peek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"setWhitelistFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"components":[{"internalType":"string","name":"state","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"cursor","type":"uint256"}],"internalType":"struct Presale.Status","name":"","type":"tuple"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506002805460ff191690556200002960003362000071565b620000557f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000071565b60006003556002805462ffff00191662010000179055620001d6565b6200007d828262000081565b5050565b620000988282620000c460201b620011201760201c565b6000828152600160209081526040909120620000bf918390620011a462000164821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200007d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001203390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200017b836001600160a01b03841662000184565b90505b92915050565b6000818152600183016020526040812054620001cd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200017e565b5060006200017e565b611e2f80620001e66000396000f3fe6080604052600436106101b75760003560e01c80637f4e3076116100ec578063a85717d31161008a578063cfbd488511610064578063cfbd4885146104c6578063d1c6d240146104e6578063d5391393146104f9578063d547741f1461051b57600080fd5b8063a85717d314610450578063acefafae14610470578063ca15c873146104a657600080fd5b80639010d07c116100c65780639010d07c146103cd578063902d55a51461040557806391d148541461041b578063a217fddf1461043b57600080fd5b80637f4e30761461037e5780638456cb591461039d5780638d859f3e146103b257600080fd5b80633f4ba83a116101595780635c975abb116101335780635c975abb1461031e5780635d2097d2146103365780635d2c88d51461034957806372b2cd6a1461036957600080fd5b80633f4ba83a146102c95780634200e4fc146102de57806351cff8d9146102fe57600080fd5b8063248a9ca311610195578063248a9ca314610237578063261707fa146102675780632f2ff15d1461028957806336568abe146102a957600080fd5b806301ffc9a7146101bc578063085bf832146101f1578063200d2ed214610215575b600080fd5b3480156101c857600080fd5b506101dc6101d73660046118f7565b61053b565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061020760035481565b6040519081526020016101e8565b34801561022157600080fd5b5061022a61054c565b6040516101e89190611971565b34801561024357600080fd5b506102076102523660046119ad565b60009081526020819052604090206001015490565b34801561027357600080fd5b506102876102823660046119db565b61062d565b005b34801561029557600080fd5b506102876102a43660046119f8565b610660565b3480156102b557600080fd5b506102876102c43660046119f8565b61068a565b3480156102d557600080fd5b5061028761070d565b3480156102ea57600080fd5b506102876102f9366004611a28565b61072f565b34801561030a57600080fd5b506102876103193660046119db565b610778565b34801561032a57600080fd5b5060025460ff166101dc565b610287610344366004611aa9565b6107cd565b34801561035557600080fd5b506002546101dc9062010000900460ff1681565b34801561037557600080fd5b50610207600181565b34801561038a57600080fd5b506002546101dc90610100900460ff1681565b3480156103a957600080fd5b50610287610b3a565b3480156103be57600080fd5b506102076611c37937e0800081565b3480156103d957600080fd5b506103ed6103e8366004611b84565b610b5a565b6040516001600160a01b0390911681526020016101e8565b34801561041157600080fd5b50610207610a8c81565b34801561042757600080fd5b506101dc6104363660046119f8565b610b79565b34801561044757600080fd5b50610207600081565b34801561045c57600080fd5b5061028761046b366004611a28565b610ba2565b34801561047c57600080fd5b5061020761048b3660046119db565b6001600160a01b031660009081526004602052604090205490565b3480156104b257600080fd5b506102076104c13660046119ad565b610c5a565b3480156104d257600080fd5b506102876104e13660046119db565b610c71565b6102876104f4366004611aa9565b610ca1565b34801561050557600080fd5b50610207600080516020611dda83398151915281565b34801561052757600080fd5b506102876105363660046119f8565b6110fb565b6000610546826111b9565b92915050565b61057060405180606001604052806060815260200160008152602001600081525090565b61059460405180606001604052806060815260200160008152602001600081525090565b610a8c6020820181905260035460408301819052106105d35760408051808201909152600881526714d153130813d55560c21b60208201528152919050565b600254610100900460ff1661060b5760408051808201909152600b81526a21a7a6a4a7239029a7a7a760a91b60208201528152919050565b60408051808201909152600481526327a822a760e11b60208201528152919050565b610645600080516020611dda833981519152336111de565b61065d600080516020611dda83398151915282611242565b50565b60008281526020819052604090206001015461067b8161124c565b6106858383611256565b505050565b6001600160a01b03811633146106ff5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107098282611278565b5050565b610725600080516020611dda833981519152336111de565b61072d61129a565b565b610747600080516020611dda833981519152336111de565b60025460ff620100009091041615158115151461065d5760028054821515620100000262ff00001990911617905550565b610790600080516020611dda833981519152336111de565b478015610709576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610685573d6000803e3d6000fd5b6611c37937e0800034146108115760405162461bcd60e51b815260206004820152600b60248201526a57726f6e672076616c756560a81b60448201526064016106f6565b600254610100900460ff166108565760405162461bcd60e51b815260206004820152600b60248201526a21b7b6b4b7339039b7b7b760a91b60448201526064016106f6565b610a8c600354106108945760405162461bcd60e51b815260206004820152600860248201526714d95b1b081bdd5d60c21b60448201526064016106f6565b60025462010000900460ff166108d85760405162461bcd60e51b8152602060048201526009602482015268467265652074696d6560b81b60448201526064016106f6565b6005836040516108e89190611ba6565b9081526040519081900360200190205460ff16156109355760405162461bcd60e51b815260206004820152600a602482015269139bdb98d9481d5cd95960b21b60448201526064016106f6565b3360008181526004602052604090205460011161098b5760405162461bcd60e51b815260206004820152601460248201527327baba1037b31036b4b73a32b210373ab6b132b960611b60448201526064016106f6565b60006109988286346112ec565b905060006109dc8286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061136b92505050565b90506109f6600080516020611dda83398151915282610b79565b610a425760405162461bcd60e51b815260206004820152601c60248201527f5369676e6174757265206973206e6f742066726f6d206d696e7465720000000060448201526064016106f6565b6040805160018082528183019092526000916020808301908036833701905050600380549192506000610a7483611bd8565b9190505581600081518110610a8b57610a8b611bf1565b6020908102919091018101919091526001600160a01b0385166000908152600490915260408120805491610abe83611bd8565b91905055506001600588604051610ad59190611ba6565b908152604051908190036020018120805492151560ff19909316929092179091557f1ba9c2422cc102dfbb453ae99b420a0d1c6b77cb22bee571e3a1af53b3582ea690610b299086908a9034908690611c07565b60405180910390a150505050505050565b610b52600080516020611dda833981519152336111de565b61072d6113ea565b6000828152600160205260408120610b729083611427565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bba600080516020611dda833981519152336111de565b60025460ff6101009091041615158115151461065d576002805461ff0019166101008315158102919091179182905560ff91041615610c2a576040514281527f9648cf7f2eb86b564ae3c4a466bc03e87267933667490eb8737a5a3f2a9b284d906020015b60405180910390a150565b6040514281527f6cc09e7b5c3e49861ebe8f6867e1618fbfc14c8d0e968fde37c4243ca02a6f8390602001610c1f565b600081815260016020526040812061054690611433565b610c89600080516020611dda833981519152336111de565b61065d600080516020611dda83398151915282611278565b6611c37937e080003410158015610cc65750610cc46611c37937e0800034611c8b565b155b610d005760405162461bcd60e51b815260206004820152600b60248201526a57726f6e672076616c756560a81b60448201526064016106f6565b600254610100900460ff16610d455760405162461bcd60e51b815260206004820152600b60248201526a21b7b6b4b7339039b7b7b760a91b60448201526064016106f6565b610a8c60035410610d835760405162461bcd60e51b815260206004820152600860248201526714d95b1b081bdd5d60c21b60448201526064016106f6565b60025462010000900460ff1615610dcd5760405162461bcd60e51b815260206004820152600e60248201526d57686974656c6973742074696d6560901b60448201526064016106f6565b600583604051610ddd9190611ba6565b9081526040519081900360200190205460ff1615610e2a5760405162461bcd60e51b815260206004820152600a602482015269139bdb98d9481d5cd95960b21b60448201526064016106f6565b336000610e388286346112ec565b90506000610e7c8286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061136b92505050565b9050610e96600080516020611dda83398151915282610b79565b610ee25760405162461bcd60e51b815260206004820152601c60248201527f5369676e6174757265206973206e6f742066726f6d206d696e7465720000000060448201526064016106f6565b6000610ef56611c37937e0800034611c9f565b9050610a8c81600354610f089190611cb3565b1115610f2057600354610f1d90610a8c611cc6565b90505b60008167ffffffffffffffff811115610f3b57610f3b611a4a565b604051908082528060200260200182016040528015610f64578160200160208202803683370190505b50905060005b82811015610fb55760038054906000610f8283611bd8565b91905055828281518110610f9857610f98611bf1565b602090810291909101015280610fad81611bd8565b915050610f6a565b506001600160a01b03851660009081526004602052604081208054849290610fde908490611cb3565b925050819055506001600589604051610ff79190611ba6565b908152604051908190036020018120805492151560ff19909316929092179091557f1ba9c2422cc102dfbb453ae99b420a0d1c6b77cb22bee571e3a1af53b3582ea69061104b9087908b9034908690611c07565b60405180910390a160006110666611c37937e0800084611cd9565b905060006110748234611cc6565b905080156110ef576040516001600160a01b0388169082156108fc029083906000818181858888f193505050501580156110b2573d6000803e3d6000fd5b507fa7dd277dca2a71c2100c1ed4323f417f6ca244c15a1ed1c0cd5f5fe621da4e38878b836040516110e693929190611cf0565b60405180910390a15b50505050505050505050565b6000828152602081905260409020600101546111168161124c565b6106858383611278565b61112a8282610b79565b610709576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610b72836001600160a01b03841661143d565b60006001600160e01b03198216635a05180f60e01b148061054657506105468261148c565b6111e88282610b79565b61070957611200816001600160a01b031660146114c1565b61120b8360206114c1565b60405160200161121c929190611d24565b60408051601f198184030181529082905262461bcd60e51b82526106f691600401611d99565b6107098282611256565b61065d81336111de565b6112608282611120565b600082815260016020526040902061068590826111a4565b611282828261165d565b600082815260016020526040902061068590826116c2565b6112a26116d7565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600083838360405160200161130393929190611cf0565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509392505050565b60008060008061137a85611720565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156113d5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6113f2611794565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112cf3390565b6000610b7283836117da565b6000610546825490565b600081815260018301602052604081205461148457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610546565b506000610546565b60006001600160e01b03198216637965db0b60e01b148061054657506301ffc9a760e01b6001600160e01b0319831614610546565b606060006114d0836002611cd9565b6114db906002611cb3565b67ffffffffffffffff8111156114f3576114f3611a4a565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b509050600360fc1b8160008151811061153857611538611bf1565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061156757611567611bf1565b60200101906001600160f81b031916908160001a905350600061158b846002611cd9565b611596906001611cb3565b90505b600181111561160e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115ca576115ca611bf1565b1a60f81b8282815181106115e0576115e0611bf1565b60200101906001600160f81b031916908160001a90535060049490941c9361160781611dac565b9050611599565b508315610b725760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106f6565b6116678282610b79565b15610709576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610b72836001600160a01b038416611804565b60025460ff1661072d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f6565b600080600083516041146117765760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016106f6565b50505060208101516040820151606090920151909260009190911a90565b60025460ff161561072d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106f6565b60008260000182815481106117f1576117f1611bf1565b9060005260206000200154905092915050565b600081815260018301602052604081205480156118ed576000611828600183611cc6565b855490915060009061183c90600190611cc6565b90508181146118a157600086600001828154811061185c5761185c611bf1565b906000526020600020015490508087600001848154811061187f5761187f611bf1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118b2576118b2611dc3565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610546565b6000915050610546565b60006020828403121561190957600080fd5b81356001600160e01b031981168114610b7257600080fd5b60005b8381101561193c578181015183820152602001611924565b50506000910152565b6000815180845261195d816020860160208601611921565b601f01601f19169290920160200192915050565b60208152600082516060602084015261198d6080840182611945565b905060208401516040840152604084015160608401528091505092915050565b6000602082840312156119bf57600080fd5b5035919050565b6001600160a01b038116811461065d57600080fd5b6000602082840312156119ed57600080fd5b8135610b72816119c6565b60008060408385031215611a0b57600080fd5b823591506020830135611a1d816119c6565b809150509250929050565b600060208284031215611a3a57600080fd5b81358015158114610b7257600080fd5b634e487b7160e01b600052604160045260246000fd5b60008083601f840112611a7257600080fd5b50813567ffffffffffffffff811115611a8a57600080fd5b602083019150836020828501011115611aa257600080fd5b9250929050565b600080600060408486031215611abe57600080fd5b833567ffffffffffffffff80821115611ad657600080fd5b818601915086601f830112611aea57600080fd5b813581811115611afc57611afc611a4a565b604051601f8201601f19908116603f01168101908382118183101715611b2457611b24611a4a565b81604052828152896020848701011115611b3d57600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611b6a57600080fd5b50611b7786828701611a60565b9497909650939450505050565b60008060408385031215611b9757600080fd5b50508035926020909101359150565b60008251611bb8818460208701611921565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201611bea57611bea611bc2565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038516815260806020808301829052600091611c2c90840187611945565b60408401869052838103606085015284518082528286019183019060005b81811015611c6657835183529284019291840191600101611c4a565b50909998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b600082611c9a57611c9a611c75565b500690565b600082611cae57611cae611c75565b500490565b8082018082111561054657610546611bc2565b8181038181111561054657610546611bc2565b808202811582820484141761054657610546611bc2565b6001600160a01b0384168152606060208201819052600090611d1490830185611945565b9050826040830152949350505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611d5c816017850160208801611921565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d8d816028840160208801611921565b01602801949350505050565b602081526000610b726020830184611945565b600081611dbb57611dbb611bc2565b506000190190565b634e487b7160e01b600052603160045260246000fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122088a72d57d243c5fbaa5ff6569d1dee7b2bc09dfe853ff12cf1fd422d24e5d80a64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80637f4e3076116100ec578063a85717d31161008a578063cfbd488511610064578063cfbd4885146104c6578063d1c6d240146104e6578063d5391393146104f9578063d547741f1461051b57600080fd5b8063a85717d314610450578063acefafae14610470578063ca15c873146104a657600080fd5b80639010d07c116100c65780639010d07c146103cd578063902d55a51461040557806391d148541461041b578063a217fddf1461043b57600080fd5b80637f4e30761461037e5780638456cb591461039d5780638d859f3e146103b257600080fd5b80633f4ba83a116101595780635c975abb116101335780635c975abb1461031e5780635d2097d2146103365780635d2c88d51461034957806372b2cd6a1461036957600080fd5b80633f4ba83a146102c95780634200e4fc146102de57806351cff8d9146102fe57600080fd5b8063248a9ca311610195578063248a9ca314610237578063261707fa146102675780632f2ff15d1461028957806336568abe146102a957600080fd5b806301ffc9a7146101bc578063085bf832146101f1578063200d2ed214610215575b600080fd5b3480156101c857600080fd5b506101dc6101d73660046118f7565b61053b565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061020760035481565b6040519081526020016101e8565b34801561022157600080fd5b5061022a61054c565b6040516101e89190611971565b34801561024357600080fd5b506102076102523660046119ad565b60009081526020819052604090206001015490565b34801561027357600080fd5b506102876102823660046119db565b61062d565b005b34801561029557600080fd5b506102876102a43660046119f8565b610660565b3480156102b557600080fd5b506102876102c43660046119f8565b61068a565b3480156102d557600080fd5b5061028761070d565b3480156102ea57600080fd5b506102876102f9366004611a28565b61072f565b34801561030a57600080fd5b506102876103193660046119db565b610778565b34801561032a57600080fd5b5060025460ff166101dc565b610287610344366004611aa9565b6107cd565b34801561035557600080fd5b506002546101dc9062010000900460ff1681565b34801561037557600080fd5b50610207600181565b34801561038a57600080fd5b506002546101dc90610100900460ff1681565b3480156103a957600080fd5b50610287610b3a565b3480156103be57600080fd5b506102076611c37937e0800081565b3480156103d957600080fd5b506103ed6103e8366004611b84565b610b5a565b6040516001600160a01b0390911681526020016101e8565b34801561041157600080fd5b50610207610a8c81565b34801561042757600080fd5b506101dc6104363660046119f8565b610b79565b34801561044757600080fd5b50610207600081565b34801561045c57600080fd5b5061028761046b366004611a28565b610ba2565b34801561047c57600080fd5b5061020761048b3660046119db565b6001600160a01b031660009081526004602052604090205490565b3480156104b257600080fd5b506102076104c13660046119ad565b610c5a565b3480156104d257600080fd5b506102876104e13660046119db565b610c71565b6102876104f4366004611aa9565b610ca1565b34801561050557600080fd5b50610207600080516020611dda83398151915281565b34801561052757600080fd5b506102876105363660046119f8565b6110fb565b6000610546826111b9565b92915050565b61057060405180606001604052806060815260200160008152602001600081525090565b61059460405180606001604052806060815260200160008152602001600081525090565b610a8c6020820181905260035460408301819052106105d35760408051808201909152600881526714d153130813d55560c21b60208201528152919050565b600254610100900460ff1661060b5760408051808201909152600b81526a21a7a6a4a7239029a7a7a760a91b60208201528152919050565b60408051808201909152600481526327a822a760e11b60208201528152919050565b610645600080516020611dda833981519152336111de565b61065d600080516020611dda83398151915282611242565b50565b60008281526020819052604090206001015461067b8161124c565b6106858383611256565b505050565b6001600160a01b03811633146106ff5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107098282611278565b5050565b610725600080516020611dda833981519152336111de565b61072d61129a565b565b610747600080516020611dda833981519152336111de565b60025460ff620100009091041615158115151461065d5760028054821515620100000262ff00001990911617905550565b610790600080516020611dda833981519152336111de565b478015610709576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610685573d6000803e3d6000fd5b6611c37937e0800034146108115760405162461bcd60e51b815260206004820152600b60248201526a57726f6e672076616c756560a81b60448201526064016106f6565b600254610100900460ff166108565760405162461bcd60e51b815260206004820152600b60248201526a21b7b6b4b7339039b7b7b760a91b60448201526064016106f6565b610a8c600354106108945760405162461bcd60e51b815260206004820152600860248201526714d95b1b081bdd5d60c21b60448201526064016106f6565b60025462010000900460ff166108d85760405162461bcd60e51b8152602060048201526009602482015268467265652074696d6560b81b60448201526064016106f6565b6005836040516108e89190611ba6565b9081526040519081900360200190205460ff16156109355760405162461bcd60e51b815260206004820152600a602482015269139bdb98d9481d5cd95960b21b60448201526064016106f6565b3360008181526004602052604090205460011161098b5760405162461bcd60e51b815260206004820152601460248201527327baba1037b31036b4b73a32b210373ab6b132b960611b60448201526064016106f6565b60006109988286346112ec565b905060006109dc8286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061136b92505050565b90506109f6600080516020611dda83398151915282610b79565b610a425760405162461bcd60e51b815260206004820152601c60248201527f5369676e6174757265206973206e6f742066726f6d206d696e7465720000000060448201526064016106f6565b6040805160018082528183019092526000916020808301908036833701905050600380549192506000610a7483611bd8565b9190505581600081518110610a8b57610a8b611bf1565b6020908102919091018101919091526001600160a01b0385166000908152600490915260408120805491610abe83611bd8565b91905055506001600588604051610ad59190611ba6565b908152604051908190036020018120805492151560ff19909316929092179091557f1ba9c2422cc102dfbb453ae99b420a0d1c6b77cb22bee571e3a1af53b3582ea690610b299086908a9034908690611c07565b60405180910390a150505050505050565b610b52600080516020611dda833981519152336111de565b61072d6113ea565b6000828152600160205260408120610b729083611427565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bba600080516020611dda833981519152336111de565b60025460ff6101009091041615158115151461065d576002805461ff0019166101008315158102919091179182905560ff91041615610c2a576040514281527f9648cf7f2eb86b564ae3c4a466bc03e87267933667490eb8737a5a3f2a9b284d906020015b60405180910390a150565b6040514281527f6cc09e7b5c3e49861ebe8f6867e1618fbfc14c8d0e968fde37c4243ca02a6f8390602001610c1f565b600081815260016020526040812061054690611433565b610c89600080516020611dda833981519152336111de565b61065d600080516020611dda83398151915282611278565b6611c37937e080003410158015610cc65750610cc46611c37937e0800034611c8b565b155b610d005760405162461bcd60e51b815260206004820152600b60248201526a57726f6e672076616c756560a81b60448201526064016106f6565b600254610100900460ff16610d455760405162461bcd60e51b815260206004820152600b60248201526a21b7b6b4b7339039b7b7b760a91b60448201526064016106f6565b610a8c60035410610d835760405162461bcd60e51b815260206004820152600860248201526714d95b1b081bdd5d60c21b60448201526064016106f6565b60025462010000900460ff1615610dcd5760405162461bcd60e51b815260206004820152600e60248201526d57686974656c6973742074696d6560901b60448201526064016106f6565b600583604051610ddd9190611ba6565b9081526040519081900360200190205460ff1615610e2a5760405162461bcd60e51b815260206004820152600a602482015269139bdb98d9481d5cd95960b21b60448201526064016106f6565b336000610e388286346112ec565b90506000610e7c8286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061136b92505050565b9050610e96600080516020611dda83398151915282610b79565b610ee25760405162461bcd60e51b815260206004820152601c60248201527f5369676e6174757265206973206e6f742066726f6d206d696e7465720000000060448201526064016106f6565b6000610ef56611c37937e0800034611c9f565b9050610a8c81600354610f089190611cb3565b1115610f2057600354610f1d90610a8c611cc6565b90505b60008167ffffffffffffffff811115610f3b57610f3b611a4a565b604051908082528060200260200182016040528015610f64578160200160208202803683370190505b50905060005b82811015610fb55760038054906000610f8283611bd8565b91905055828281518110610f9857610f98611bf1565b602090810291909101015280610fad81611bd8565b915050610f6a565b506001600160a01b03851660009081526004602052604081208054849290610fde908490611cb3565b925050819055506001600589604051610ff79190611ba6565b908152604051908190036020018120805492151560ff19909316929092179091557f1ba9c2422cc102dfbb453ae99b420a0d1c6b77cb22bee571e3a1af53b3582ea69061104b9087908b9034908690611c07565b60405180910390a160006110666611c37937e0800084611cd9565b905060006110748234611cc6565b905080156110ef576040516001600160a01b0388169082156108fc029083906000818181858888f193505050501580156110b2573d6000803e3d6000fd5b507fa7dd277dca2a71c2100c1ed4323f417f6ca244c15a1ed1c0cd5f5fe621da4e38878b836040516110e693929190611cf0565b60405180910390a15b50505050505050505050565b6000828152602081905260409020600101546111168161124c565b6106858383611278565b61112a8282610b79565b610709576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610b72836001600160a01b03841661143d565b60006001600160e01b03198216635a05180f60e01b148061054657506105468261148c565b6111e88282610b79565b61070957611200816001600160a01b031660146114c1565b61120b8360206114c1565b60405160200161121c929190611d24565b60408051601f198184030181529082905262461bcd60e51b82526106f691600401611d99565b6107098282611256565b61065d81336111de565b6112608282611120565b600082815260016020526040902061068590826111a4565b611282828261165d565b600082815260016020526040902061068590826116c2565b6112a26116d7565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600083838360405160200161130393929190611cf0565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509392505050565b60008060008061137a85611720565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156113d5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6113f2611794565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112cf3390565b6000610b7283836117da565b6000610546825490565b600081815260018301602052604081205461148457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610546565b506000610546565b60006001600160e01b03198216637965db0b60e01b148061054657506301ffc9a760e01b6001600160e01b0319831614610546565b606060006114d0836002611cd9565b6114db906002611cb3565b67ffffffffffffffff8111156114f3576114f3611a4a565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b509050600360fc1b8160008151811061153857611538611bf1565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061156757611567611bf1565b60200101906001600160f81b031916908160001a905350600061158b846002611cd9565b611596906001611cb3565b90505b600181111561160e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115ca576115ca611bf1565b1a60f81b8282815181106115e0576115e0611bf1565b60200101906001600160f81b031916908160001a90535060049490941c9361160781611dac565b9050611599565b508315610b725760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106f6565b6116678282610b79565b15610709576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610b72836001600160a01b038416611804565b60025460ff1661072d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f6565b600080600083516041146117765760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016106f6565b50505060208101516040820151606090920151909260009190911a90565b60025460ff161561072d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106f6565b60008260000182815481106117f1576117f1611bf1565b9060005260206000200154905092915050565b600081815260018301602052604081205480156118ed576000611828600183611cc6565b855490915060009061183c90600190611cc6565b90508181146118a157600086600001828154811061185c5761185c611bf1565b906000526020600020015490508087600001848154811061187f5761187f611bf1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118b2576118b2611dc3565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610546565b6000915050610546565b60006020828403121561190957600080fd5b81356001600160e01b031981168114610b7257600080fd5b60005b8381101561193c578181015183820152602001611924565b50506000910152565b6000815180845261195d816020860160208601611921565b601f01601f19169290920160200192915050565b60208152600082516060602084015261198d6080840182611945565b905060208401516040840152604084015160608401528091505092915050565b6000602082840312156119bf57600080fd5b5035919050565b6001600160a01b038116811461065d57600080fd5b6000602082840312156119ed57600080fd5b8135610b72816119c6565b60008060408385031215611a0b57600080fd5b823591506020830135611a1d816119c6565b809150509250929050565b600060208284031215611a3a57600080fd5b81358015158114610b7257600080fd5b634e487b7160e01b600052604160045260246000fd5b60008083601f840112611a7257600080fd5b50813567ffffffffffffffff811115611a8a57600080fd5b602083019150836020828501011115611aa257600080fd5b9250929050565b600080600060408486031215611abe57600080fd5b833567ffffffffffffffff80821115611ad657600080fd5b818601915086601f830112611aea57600080fd5b813581811115611afc57611afc611a4a565b604051601f8201601f19908116603f01168101908382118183101715611b2457611b24611a4a565b81604052828152896020848701011115611b3d57600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611b6a57600080fd5b50611b7786828701611a60565b9497909650939450505050565b60008060408385031215611b9757600080fd5b50508035926020909101359150565b60008251611bb8818460208701611921565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201611bea57611bea611bc2565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038516815260806020808301829052600091611c2c90840187611945565b60408401869052838103606085015284518082528286019183019060005b81811015611c6657835183529284019291840191600101611c4a565b50909998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b600082611c9a57611c9a611c75565b500690565b600082611cae57611cae611c75565b500490565b8082018082111561054657610546611bc2565b8181038181111561054657610546611bc2565b808202811582820484141761054657610546611bc2565b6001600160a01b0384168152606060208201819052600090611d1490830185611945565b9050826040830152949350505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611d5c816017850160208801611921565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d8d816028840160208801611921565b01602801949350505050565b602081526000610b726020830184611945565b600081611dbb57611dbb611bc2565b506000190190565b634e487b7160e01b600052603160045260246000fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122088a72d57d243c5fbaa5ff6569d1dee7b2bc09dfe853ff12cf1fd422d24e5d80a64736f6c63430008110033
Deployed Bytecode Sourcemap
37361:6026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37060:228;;;;;;;;;;-1:-1:-1;37060:228:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;37060:228:0;;;;;;;;37476:26;;;;;;;;;;;;;;;;;;;643:25:1;;;631:2;616:18;37476:26:0;497:177:1;38769:421:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29804:131::-;;;;;;;;;;-1:-1:-1;29804:131:0;;;;;:::i;:::-;29878:7;29905:12;;;;;;;;;;:22;;;;29804:131;36741:152;;;;;;;;;;-1:-1:-1;36741:152:0;;;;;:::i;:::-;;:::i;:::-;;30245:147;;;;;;;;;;-1:-1:-1;30245:147:0;;;;;:::i;:::-;;:::i;31389:218::-;;;;;;;;;;-1:-1:-1;31389:218:0;;;;;:::i;:::-;;:::i;36665:68::-;;;;;;;;;;;;;:::i;38594:167::-;;;;;;;;;;-1:-1:-1;38594:167:0;;;;;:::i;:::-;;:::i;39198:187::-;;;;;;;;;;-1:-1:-1;39198:187:0;;;;;:::i;:::-;;:::i;17601:86::-;;;;;;;;;;-1:-1:-1;17672:7:0;;;;17601:86;;39393:922;;;;;;:::i;:::-;;:::i;37436:33::-;;;;;;;;;;-1:-1:-1;37436:33:0;;;;;;;;;;;37665:41;;;;;;;;;;;;37705:1;37665:41;;37405:24;;;;;;;;;;-1:-1:-1;37405:24:0;;;;;;;;;;;36593:64;;;;;;;;;;;;;:::i;37616:42::-;;;;;;;;;;;;37647:11;37616:42;;35042:153;;;;;;;;;;-1:-1:-1;35042:153:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5440:32:1;;;5422:51;;5410:2;5395:18;35042:153:0;5276:203:1;37713:42:0;;;;;;;;;;;;37751:4;37713:42;;28264:147;;;;;;;;;;-1:-1:-1;28264:147:0;;;;;:::i;:::-;;:::i;27369:49::-;;;;;;;;;;-1:-1:-1;27369:49:0;27414:4;27369:49;;38194:288;;;;;;;;;;-1:-1:-1;38194:288:0;;;;;:::i;:::-;;:::i;38490:96::-;;;;;;;;;;-1:-1:-1;38490:96:0;;;;;:::i;:::-;-1:-1:-1;;;;;38565:13:0;38541:4;38565:13;;;:6;:13;;;;;;;38490:96;35369:142;;;;;;;;;;-1:-1:-1;35369:142:0;;;;;:::i;:::-;;:::i;36901:151::-;;;;;;;;;;-1:-1:-1;36901:151:0;;;;;:::i;:::-;;:::i;40323:1363::-;;;;;;:::i;:::-;;:::i;36187:62::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36187:62:0;;30685:149;;;;;;;;;;-1:-1:-1;30685:149:0;;;;;:::i;:::-;;:::i;37060:228::-;37215:4;37244:36;37268:11;37244:23;:36::i;:::-;37237:43;37060:228;-1:-1:-1;;37060:228:0:o;38769:421::-;38809:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;38809:13:0;38835:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;38835:21:0;37751:4;38867:19;;;:34;;;38929:7;;38912:14;;;:24;;;38951:23;38947:211;;38991:26;;;;;;;;;;;;-1:-1:-1;;;38991:26:0;;;;;;39175:7;38769:421;-1:-1:-1;38769:421:0:o;38947:211::-;39040:5;;;;;;;39035:123;;39062:29;;;;;;;;;;;;-1:-1:-1;;;39062:29:0;;;;;;39175:7;38769:421;-1:-1:-1;38769:421:0:o;39035:123::-;39124:22;;;;;;;;;;;;-1:-1:-1;;;39124:22:0;;;;;;39175:7;38769:421;-1:-1:-1;38769:421:0:o;36741:152::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;36853:32:::1;-1:-1:-1::0;;;;;;;;;;;36877:7:0::1;36853:10;:32::i;:::-;36741:152:::0;:::o;30245:147::-;29878:7;29905:12;;;;;;;;;;:22;;;27860:16;27871:4;27860:10;:16::i;:::-;30359:25:::1;30370:4;30376:7;30359:10;:25::i;:::-;30245:147:::0;;;:::o;31389:218::-;-1:-1:-1;;;;;31485:23:0;;15794:10;31485:23;31477:83;;;;-1:-1:-1;;;31477:83:0;;5686:2:1;31477:83:0;;;5668:21:1;5725:2;5705:18;;;5698:30;5764:34;5744:18;;;5737:62;-1:-1:-1;;;5815:18:1;;;5808:45;5870:19;;31477:83:0;;;;;;;;;31573:26;31585:4;31591:7;31573:11;:26::i;:::-;31389:218;;:::o;36665:68::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;36715:10:::1;:8;:10::i;:::-;36665:68::o:0;38594:167::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;38670:14:::1;::::0;::::1;::::0;;;::::1;;:26;;::::0;::::1;;;38666:88;;38713:14;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;38713:25:0;;::::1;;::::0;;38594:167;:::o;39198:187::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;39282:21:::1;39318:11:::0;;39314:64:::1;;39346:20;::::0;-1:-1:-1;;;;;39346:11:0;::::1;::::0;:20;::::1;;;::::0;39358:7;;39346:20:::1;::::0;;;39358:7;39346:11;:20;::::1;;;;;;;;;;;;;::::0;::::1;;;;39393:922:::0;37647:11;39489:9;:18;39481:42;;;;-1:-1:-1;;;39481:42:0;;6102:2:1;39481:42:0;;;6084:21:1;6141:2;6121:18;;;6114:30;-1:-1:-1;;;6160:18:1;;;6153:41;6211:18;;39481:42:0;5900:335:1;39481:42:0;39543:5;;;;;;;39534:30;;;;-1:-1:-1;;;39534:30:0;;6442:2:1;39534:30:0;;;6424:21:1;6481:2;6461:18;;;6454:30;-1:-1:-1;;;6500:18:1;;;6493:41;6551:18;;39534:30:0;6240:335:1;39534:30:0;37751:4;39583:7;;:22;39575:43;;;;-1:-1:-1;;;39575:43:0;;6782:2:1;39575:43:0;;;6764:21:1;6821:1;6801:18;;;6794:29;-1:-1:-1;;;6839:18:1;;;6832:38;6887:18;;39575:43:0;6580:331:1;39575:43:0;39638:14;;;;;;;39629:37;;;;-1:-1:-1;;;39629:37:0;;7118:2:1;39629:37:0;;;7100:21:1;7157:1;7137:18;;;7130:29;-1:-1:-1;;;7175:18:1;;;7168:39;7224:18;;39629:37:0;6916:332:1;39629:37:0;39686:11;39698:5;39686:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;39685:19;39677:42;;;;-1:-1:-1;;;39677:42:0;;7749:2:1;39677:42:0;;;7731:21:1;7788:2;7768:18;;;7761:30;-1:-1:-1;;;7807:18:1;;;7800:40;7857:18;;39677:42:0;7547:334:1;39677:42:0;15794:10;39732:15;39781;;;:6;:15;;;;;;37705:1;-1:-1:-1;39773:65:0;;;;-1:-1:-1;;;39773:65:0;;8088:2:1;39773:65:0;;;8070:21:1;8127:2;8107:18;;;8100:30;-1:-1:-1;;;8146:18:1;;;8139:50;8206:18;;39773:65:0;7886:344:1;39773:65:0;39859:25;39887:48;39909:7;39918:5;39925:9;39887:21;:48::i;:::-;39859:76;;39946:14;39963:44;39978:17;39997:9;;39963:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39963:14:0;;-1:-1:-1;;;39963:44:0:i;:::-;39946:61;;40026:34;-1:-1:-1;;;;;;;;;;;40053:6:0;40026:13;:34::i;:::-;40018:75;;;;-1:-1:-1;;;40018:75:0;;8437:2:1;40018:75:0;;;8419:21:1;8476:2;8456:18;;;8449:30;8515;8495:18;;;8488:58;8563:18;;40018:75:0;8235:352:1;40018:75:0;40133:13;;;40144:1;40133:13;;;;;;;;;40106:24;;40133:13;;;;;;;;;;;-1:-1:-1;;40173:7:0;:9;;40106:40;;-1:-1:-1;40173:7:0;:9;;;:::i;:::-;;;;;40157:10;40168:1;40157:13;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;;-1:-1:-1;;;;;40193:15:0;;;;;;:6;:15;;;;;;:17;;;;;;:::i;:::-;;;;;;40242:4;40221:11;40233:5;40221:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;40221:25:0;;;;;;;;;;40264:43;;;;40269:7;;40278:5;;40285:9;;40296:10;;40264:43;:::i;:::-;;;;;;;;39470:845;;;;39393:922;;;:::o;36593:64::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;36641:8:::1;:6;:8::i;35042:153::-:0;35132:7;35159:18;;;:12;:18;;;;;:28;;35181:5;35159:21;:28::i;:::-;35152:35;35042:153;-1:-1:-1;;;35042:153:0:o;28264:147::-;28350:4;28374:12;;;;;;;;;;;-1:-1:-1;;;;;28374:29:0;;;;;;;;;;;;;;;28264:147::o;38194:288::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;38258:5:::1;::::0;::::1;;::::0;;::::1;;:17;;::::0;::::1;;;38254:221;;38292:5;:16:::0;;-1:-1:-1;;38292:16:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;38327:5:::0;::::1;;38323:141;;;38358:21;::::0;38363:15:::1;643:25:1::0;;38358:21:0::1;::::0;631:2:1;616:18;38358:21:0::1;;;;;;;;36741:152:::0;:::o;38323:141::-:1;38425:23;::::0;38432:15:::1;643:25:1::0;;38425:23:0::1;::::0;631:2:1;616:18;38425:23:0::1;497:177:1::0;35369:142:0;35449:7;35476:18;;;:12;:18;;;;;:27;;:25;:27::i;36901:151::-;36291:37;-1:-1:-1;;;;;;;;;;;15794:10:0;36291;:37::i;:::-;37011:33:::1;-1:-1:-1::0;;;;;;;;;;;37036:7:0::1;37011:11;:33::i;40323:1363::-:0;37647:11;40423:9;:18;;:44;;;;-1:-1:-1;40445:17:0;37647:11;40445:9;:17;:::i;:::-;:22;40423:44;40415:68;;;;-1:-1:-1;;;40415:68:0;;6102:2:1;40415:68:0;;;6084:21:1;6141:2;6121:18;;;6114:30;-1:-1:-1;;;6160:18:1;;;6153:41;6211:18;;40415:68:0;5900:335:1;40415:68:0;40503:5;;;;;;;40494:30;;;;-1:-1:-1;;;40494:30:0;;6442:2:1;40494:30:0;;;6424:21:1;6481:2;6461:18;;;6454:30;-1:-1:-1;;;6500:18:1;;;6493:41;6551:18;;40494:30:0;6240:335:1;40494:30:0;37751:4;40543:7;;:22;40535:43;;;;-1:-1:-1;;;40535:43:0;;6782:2:1;40535:43:0;;;6764:21:1;6821:1;6801:18;;;6794:29;-1:-1:-1;;;6839:18:1;;;6832:38;6887:18;;40535:43:0;6580:331:1;40535:43:0;40599:14;;;;;;;40598:15;40589:43;;;;-1:-1:-1;;;40589:43:0;;10385:2:1;40589:43:0;;;10367:21:1;10424:2;10404:18;;;10397:30;-1:-1:-1;;;10443:18:1;;;10436:44;10497:18;;40589:43:0;10183:338:1;40589:43:0;40652:11;40664:5;40652:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;40651:19;40643:42;;;;-1:-1:-1;;;40643:42:0;;7749:2:1;40643:42:0;;;7731:21:1;7788:2;7768:18;;;7761:30;-1:-1:-1;;;7807:18:1;;;7800:40;7857:18;;40643:42:0;7547:334:1;40643:42:0;15794:10;40706:15;40775:48;15794:10;40806:5;40813:9;40775:21;:48::i;:::-;40747:76;;40834:14;40851:44;40866:17;40885:9;;40851:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40851:14:0;;-1:-1:-1;;;40851:44:0:i;:::-;40834:61;;40914:34;-1:-1:-1;;;;;;;;;;;40941:6:0;40914:13;:34::i;:::-;40906:75;;;;-1:-1:-1;;;40906:75:0;;8437:2:1;40906:75:0;;;8419:21:1;8476:2;8456:18;;;8449:30;8515;8495:18;;;8488:58;8563:18;;40906:75:0;8235:352:1;40906:75:0;40994:8;41005:17;37647:11;41005:9;:17;:::i;:::-;40994:28;;37751:4;41047:3;41037:7;;:13;;;;:::i;:::-;:28;41033:89;;;41103:7;;41088:22;;37751:4;41088:22;:::i;:::-;41082:28;;41033:89;41134:24;41172:3;41161:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41161:15:0;;41134:42;;41192:6;41187:79;41204:3;41202:1;:5;41187:79;;;41245:7;:9;;;:7;:9;;;:::i;:::-;;;;;41229:10;41240:1;41229:13;;;;;;;;:::i;:::-;;;;;;;;;;:25;41209:3;;;;:::i;:::-;;;;41187:79;;;-1:-1:-1;;;;;;41278:15:0;;;;;;:6;:15;;;;;:22;;41297:3;;41278:15;:22;;41297:3;;41278:22;:::i;:::-;;;;;;;;41332:4;41311:11;41323:5;41311:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;41311:25:0;;;;;;;;;;41352:43;;;;41357:7;;41366:5;;41373:9;;41384:10;;41352:43;:::i;:::-;;;;;;;;41408:15;41426:11;37647;41426:3;:11;:::i;:::-;41408:29;-1:-1:-1;41448:17:0;41468:22;41408:29;41468:9;:22;:::i;:::-;41448:42;-1:-1:-1;41539:16:0;;41535:144;;41572:39;;-1:-1:-1;;;;;41572:25:0;;;:39;;;;;41598:12;;41572:39;;;;41598:12;41572:25;:39;;;;;;;;;;;;;;;;;;;;;41631:36;41638:7;41647:5;41654:12;41631:36;;;;;;;;:::i;:::-;;;;;;;;41535:144;40404:1282;;;;;;;40323:1363;;;:::o;30685:149::-;29878:7;29905:12;;;;;;;;;;:22;;;27860:16;27871:4;27860:10;:16::i;:::-;30800:26:::1;30812:4;30818:7;30800:11;:26::i;32986:238::-:0;33070:22;33078:4;33084:7;33070;:22::i;:::-;33065:152;;33109:6;:12;;;;;;;;;;;-1:-1:-1;;;;;33109:29:0;;;;;;;;;:36;;-1:-1:-1;;33109:36:0;33141:4;33109:36;;;33192:12;15794:10;;15714:98;33192:12;-1:-1:-1;;;;;33165:40:0;33183:7;-1:-1:-1;;;;;33165:40:0;33177:4;33165:40;;;;;;;;;;32986:238;;:::o;8296:152::-;8366:4;8390:50;8395:3;-1:-1:-1;;;;;8415:23:0;;8390:4;:50::i;34229:214::-;34314:4;-1:-1:-1;;;;;;34338:57:0;;-1:-1:-1;;;34338:57:0;;:97;;;34399:36;34423:11;34399:23;:36::i;29110:505::-;29199:22;29207:4;29213:7;29199;:22::i;:::-;29194:414;;29387:41;29415:7;-1:-1:-1;;;;;29387:41:0;29425:2;29387:19;:41::i;:::-;29501:38;29529:4;29536:2;29501:19;:38::i;:::-;29292:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29292:270:0;;;;;;;;;;-1:-1:-1;;;29238:358:0;;;;;;;:::i;32314:112::-;32393:25;32404:4;32410:7;32393:10;:25::i;28715:105::-;28782:30;28793:4;15794:10;36291;:37::i;35604:169::-;35692:31;35709:4;35715:7;35692:16;:31::i;:::-;35734:18;;;;:12;:18;;;;;:31;;35757:7;35734:22;:31::i;35867:174::-;35956:32;35974:4;35980:7;35956:17;:32::i;:::-;35999:18;;;;:12;:18;;;;;:34;;36025:7;35999:25;:34::i;18456:120::-;17465:16;:14;:16::i;:::-;18515:7:::1;:15:::0;;-1:-1:-1;;18515:15:0::1;::::0;;18546:22:::1;15794:10:::0;18555:12:::1;18546:22;::::0;-1:-1:-1;;;;;5440:32:1;;;5422:51;;5410:2;5395:18;18546:22:0::1;;;;;;;18456:120::o:0;41694:639::-;41798:7;42183;42218:5;42251:6;42146:134;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;42146:134:0;;;;;;;;;;42114:185;;42146:134;42114:185;;;;12764:66:1;42025:289:0;;;12752:79:1;;;;12847:12;;;12840:28;12884:12;;42025:289:0;;;;;;;;;;;;42001:324;;;;;;41994:331;;41694:639;;;;;:::o;42341:250::-;42443:7;42464:9;42475;42486:7;42497:27;42513:10;42497:15;:27::i;:::-;42542:41;;;;;;;;;;;;13134:25:1;;;13207:4;13195:17;;13175:18;;;13168:45;;;;13229:18;;;13222:34;;;13272:18;;;13265:34;;;42463:61:0;;-1:-1:-1;42463:61:0;;-1:-1:-1;42463:61:0;-1:-1:-1;42542:41:0;;13106:19:1;;42542:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42542:41:0;;-1:-1:-1;;42542:41:0;;;42341:250;-1:-1:-1;;;;;;;42341:250:0:o;18197:118::-;17206:19;:17;:19::i;:::-;18257:7:::1;:14:::0;;-1:-1:-1;;18257:14:0::1;18267:4;18257:14;::::0;;18287:20:::1;18294:12;15794:10:::0;;15714:98;9592:158;9666:7;9717:22;9721:3;9733:5;9717:3;:22::i;9121:117::-;9184:7;9211:19;9219:3;4605:18;;4522:109;2211:414;2274:4;4404:19;;;:12;;;:19;;;;;;2291:327;;-1:-1:-1;2334:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;2517:18;;2495:19;;;:12;;;:19;;;;;;:40;;;;2550:11;;2291:327;-1:-1:-1;2601:5:0;2594:12;;27968:204;28053:4;-1:-1:-1;;;;;;28077:47:0;;-1:-1:-1;;;28077:47:0;;:87;;-1:-1:-1;;;;;;;;;;14980:40:0;;;28128:36;14871:157;24625:451;24700:13;24726:19;24758:10;24762:6;24758:1;:10;:::i;:::-;:14;;24771:1;24758:14;:::i;:::-;24748:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24748:25:0;;24726:47;;-1:-1:-1;;;24784:6:0;24791:1;24784:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;24784:15:0;;;;;;;;;-1:-1:-1;;;24810:6:0;24817:1;24810:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;24810:15:0;;;;;;;;-1:-1:-1;24841:9:0;24853:10;24857:6;24853:1;:10;:::i;:::-;:14;;24866:1;24853:14;:::i;:::-;24841:26;;24836:135;24873:1;24869;:5;24836:135;;;-1:-1:-1;;;24921:5:0;24929:3;24921:11;24908:25;;;;;;;:::i;:::-;;;;24896:6;24903:1;24896:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;24896:37:0;;;;;;;;-1:-1:-1;24958:1:0;24948:11;;;;;24876:3;;;:::i;:::-;;;24836:135;;;-1:-1:-1;24989:10:0;;24981:55;;;;-1:-1:-1;;;24981:55:0;;13653:2:1;24981:55:0;;;13635:21:1;;;13672:18;;;13665:30;13731:34;13711:18;;;13704:62;13783:18;;24981:55:0;13451:356:1;33404:239:0;33488:22;33496:4;33502:7;33488;:22::i;:::-;33484:152;;;33559:5;33527:12;;;;;;;;;;;-1:-1:-1;;;;;33527:29:0;;;;;;;;;;:37;;-1:-1:-1;;33527:37:0;;;33584:40;15794:10;;33527:12;;33584:40;;33559:5;33584:40;33404:239;;:::o;8624:158::-;8697:4;8721:53;8729:3;-1:-1:-1;;;;;8749:23:0;;8721:7;:53::i;17945:108::-;17672:7;;;;18004:41;;;;-1:-1:-1;;;18004:41:0;;14014:2:1;18004:41:0;;;13996:21:1;14053:2;14033:18;;;14026:30;-1:-1:-1;;;14072:18:1;;;14065:50;14132:18;;18004:41:0;13812:344:1;42599:785:0;42664:9;42675;42686:7;42714:3;:10;42728:2;42714:16;42706:53;;;;-1:-1:-1;;;42706:53:0;;14363:2:1;42706:53:0;;;14345:21:1;14402:2;14382:18;;;14375:30;14441:26;14421:18;;;14414:54;14485:18;;42706:53:0;14161:348:1;42706:53:0;-1:-1:-1;;;43184:2:0;43175:12;;43169:19;43254:2;43245:12;;43239:19;43361:2;43352:12;;;43346:19;43169;;43343:1;43338:28;;;;;42599:785::o;17760:108::-;17672:7;;;;17830:9;17822:38;;;;-1:-1:-1;;;17822:38:0;;14716:2:1;17822:38:0;;;14698:21:1;14755:2;14735:18;;;14728:30;-1:-1:-1;;;14774:18:1;;;14767:46;14830:18;;17822:38:0;14514:340:1;4985:120:0;5052:7;5079:3;:11;;5091:5;5079:18;;;;;;;;:::i;:::-;;;;;;;;;5072:25;;4985:120;;;;:::o;2801:1420::-;2867:4;3006:19;;;:12;;;:19;;;;;;3042:15;;3038:1176;;3417:21;3441:14;3454:1;3441:10;:14;:::i;:::-;3490:18;;3417:38;;-1:-1:-1;3470:17:0;;3490:22;;3511:1;;3490:22;:::i;:::-;3470:42;;3546:13;3533:9;:26;3529:405;;3580:17;3600:3;:11;;3612:9;3600:22;;;;;;;;:::i;:::-;;;;;;;;;3580:42;;3754:9;3725:3;:11;;3737:13;3725:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3839:23;;;:12;;;:23;;;;;:36;;;3529:405;4015:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4110:3;:12;;:19;4123:5;4110:19;;;;;;;;;;;4103:26;;;4153:4;4146:11;;;;;;;3038:1176;4197:5;4190:12;;;;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;679:250;764:1;774:113;788:6;785:1;782:13;774:113;;;864:11;;;858:18;845:11;;;838:39;810:2;803:10;774:113;;;-1:-1:-1;;921:1:1;903:16;;896:27;679:250::o;934:271::-;976:3;1014:5;1008:12;1041:6;1036:3;1029:19;1057:76;1126:6;1119:4;1114:3;1110:14;1103:4;1096:5;1092:16;1057:76;:::i;:::-;1187:2;1166:15;-1:-1:-1;;1162:29:1;1153:39;;;;1194:4;1149:50;;934:271;-1:-1:-1;;934:271:1:o;1210:487::-;1387:2;1376:9;1369:21;1350:4;1425:6;1419:13;1468:4;1463:2;1452:9;1448:18;1441:32;1496:52;1543:3;1532:9;1528:19;1514:12;1496:52;:::i;:::-;1482:66;;1602:2;1594:6;1590:15;1584:22;1579:2;1568:9;1564:18;1557:50;1663:2;1655:6;1651:15;1645:22;1638:4;1627:9;1623:20;1616:52;1685:6;1677:14;;;1210:487;;;;:::o;1702:180::-;1761:6;1814:2;1802:9;1793:7;1789:23;1785:32;1782:52;;;1830:1;1827;1820:12;1782:52;-1:-1:-1;1853:23:1;;1702:180;-1:-1:-1;1702:180:1:o;2069:131::-;-1:-1:-1;;;;;2144:31:1;;2134:42;;2124:70;;2190:1;2187;2180:12;2205:247;2264:6;2317:2;2305:9;2296:7;2292:23;2288:32;2285:52;;;2333:1;2330;2323:12;2285:52;2372:9;2359:23;2391:31;2416:5;2391:31;:::i;2457:315::-;2525:6;2533;2586:2;2574:9;2565:7;2561:23;2557:32;2554:52;;;2602:1;2599;2592:12;2554:52;2638:9;2625:23;2615:33;;2698:2;2687:9;2683:18;2670:32;2711:31;2736:5;2711:31;:::i;:::-;2761:5;2751:15;;;2457:315;;;;;:::o;2777:273::-;2833:6;2886:2;2874:9;2865:7;2861:23;2857:32;2854:52;;;2902:1;2899;2892:12;2854:52;2941:9;2928:23;2994:5;2987:13;2980:21;2973:5;2970:32;2960:60;;3016:1;3013;3006:12;3315:127;3376:10;3371:3;3367:20;3364:1;3357:31;3407:4;3404:1;3397:15;3431:4;3428:1;3421:15;3447:347;3498:8;3508:6;3562:3;3555:4;3547:6;3543:17;3539:27;3529:55;;3580:1;3577;3570:12;3529:55;-1:-1:-1;3603:20:1;;3646:18;3635:30;;3632:50;;;3678:1;3675;3668:12;3632:50;3715:4;3707:6;3703:17;3691:29;;3767:3;3760:4;3751:6;3743;3739:19;3735:30;3732:39;3729:59;;;3784:1;3781;3774:12;3729:59;3447:347;;;;;:::o;3799:1219::-;3888:6;3896;3904;3957:2;3945:9;3936:7;3932:23;3928:32;3925:52;;;3973:1;3970;3963:12;3925:52;4013:9;4000:23;4042:18;4083:2;4075:6;4072:14;4069:34;;;4099:1;4096;4089:12;4069:34;4137:6;4126:9;4122:22;4112:32;;4182:7;4175:4;4171:2;4167:13;4163:27;4153:55;;4204:1;4201;4194:12;4153:55;4240:2;4227:16;4262:2;4258;4255:10;4252:36;;;4268:18;;:::i;:::-;4343:2;4337:9;4311:2;4397:13;;-1:-1:-1;;4393:22:1;;;4417:2;4389:31;4385:40;4373:53;;;4441:18;;;4461:22;;;4438:46;4435:72;;;4487:18;;:::i;:::-;4527:10;4523:2;4516:22;4562:2;4554:6;4547:18;4604:7;4597:4;4592:2;4588;4584:11;4580:22;4577:35;4574:55;;;4625:1;4622;4615:12;4574:55;4685:2;4678:4;4674:2;4670:13;4663:4;4655:6;4651:17;4638:50;4732:1;4725:4;4720:2;4712:6;4708:15;4704:26;4697:37;4753:6;4743:16;;;;;4812:4;4801:9;4797:20;4784:34;4768:50;;4843:2;4833:8;4830:16;4827:36;;;4859:1;4856;4849:12;4827:36;;4898:60;4950:7;4939:8;4928:9;4924:24;4898:60;:::i;:::-;3799:1219;;4977:8;;-1:-1:-1;4872:86:1;;-1:-1:-1;;;;3799:1219:1:o;5023:248::-;5091:6;5099;5152:2;5140:9;5131:7;5127:23;5123:32;5120:52;;;5168:1;5165;5158:12;5120:52;-1:-1:-1;;5191:23:1;;;5261:2;5246:18;;;5233:32;;-1:-1:-1;5023:248:1:o;7253:289::-;7384:3;7422:6;7416:13;7438:66;7497:6;7492:3;7485:4;7477:6;7473:17;7438:66;:::i;:::-;7520:16;;;;;7253:289;-1:-1:-1;;7253:289:1:o;8592:127::-;8653:10;8648:3;8644:20;8641:1;8634:31;8684:4;8681:1;8674:15;8708:4;8705:1;8698:15;8724:135;8763:3;8784:17;;;8781:43;;8804:18;;:::i;:::-;-1:-1:-1;8851:1:1;8840:13;;8724:135::o;8864:127::-;8925:10;8920:3;8916:20;8913:1;8906:31;8956:4;8953:1;8946:15;8980:4;8977:1;8970:15;8996:933;-1:-1:-1;;;;;9279:32:1;;9261:51;;9369:3;9331:2;9349:18;;;9342:31;;;9242:4;;9396:46;;9422:19;;9414:6;9396:46;:::i;:::-;9473:2;9458:18;;9451:34;;;9521:22;;;9516:2;9501:18;;9494:50;9593:13;;9615:22;;;9691:15;;;;9653;;;-1:-1:-1;9734:169:1;9748:6;9745:1;9742:13;9734:169;;;9809:13;;9797:26;;9878:15;;;;9843:12;;;;9770:1;9763:9;9734:169;;;-1:-1:-1;9920:3:1;;8996:933;-1:-1:-1;;;;;;;;;8996:933:1:o;9934:127::-;9995:10;9990:3;9986:20;9983:1;9976:31;10026:4;10023:1;10016:15;10050:4;10047:1;10040:15;10066:112;10098:1;10124;10114:35;;10129:18;;:::i;:::-;-1:-1:-1;10163:9:1;;10066:112::o;10526:120::-;10566:1;10592;10582:35;;10597:18;;:::i;:::-;-1:-1:-1;10631:9:1;;10526:120::o;10651:125::-;10716:9;;;10737:10;;;10734:36;;;10750:18;;:::i;10781:128::-;10848:9;;;10869:11;;;10866:37;;;10883:18;;:::i;10914:168::-;10987:9;;;11018;;11035:15;;;11029:22;;11015:37;11005:71;;11056:18;;:::i;11087:388::-;-1:-1:-1;;;;;11292:32:1;;11274:51;;11361:2;11356;11341:18;;11334:30;;;-1:-1:-1;;11381:45:1;;11407:18;;11399:6;11381:45;:::i;:::-;11373:53;;11462:6;11457:2;11446:9;11442:18;11435:34;11087:388;;;;;;:::o;11480:812::-;11891:25;11886:3;11879:38;11861:3;11946:6;11940:13;11962:75;12030:6;12025:2;12020:3;12016:12;12009:4;12001:6;11997:17;11962:75;:::i;:::-;-1:-1:-1;;;12096:2:1;12056:16;;;12088:11;;;12081:40;12146:13;;12168:76;12146:13;12230:2;12222:11;;12215:4;12203:17;;12168:76;:::i;:::-;12264:17;12283:2;12260:26;;11480:812;-1:-1:-1;;;;11480:812:1:o;12297:220::-;12446:2;12435:9;12428:21;12409:4;12466:45;12507:2;12496:9;12492:18;12484:6;12466:45;:::i;13310:136::-;13349:3;13377:5;13367:39;;13386:18;;:::i;:::-;-1:-1:-1;;;13422:18:1;;13310:136::o;14859:127::-;14920:10;14915:3;14911:20;14908:1;14901:31;14951:4;14948:1;14941:15;14975:4;14972:1;14965:15
Swarm Source
ipfs://88a72d57d243c5fbaa5ff6569d1dee7b2bc09dfe853ff12cf1fd422d24e5d80a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.