Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 17662991 | 598 days ago | IN | 0 ETH | 0.00053953 | ||||
Set Recipient | 17662989 | 598 days ago | IN | 0 ETH | 0.00073138 | ||||
Approve | 17662955 | 598 days ago | IN | 0 ETH | 0.00530643 | ||||
Approve | 17662954 | 598 days ago | IN | 0 ETH | 0.00069722 | ||||
Approve | 17662953 | 598 days ago | IN | 0 ETH | 0.00080563 | ||||
Approve | 17662952 | 598 days ago | IN | 0 ETH | 0.00073179 | ||||
Approve | 17662950 | 598 days ago | IN | 0 ETH | 0.000752 | ||||
Approve | 17662949 | 598 days ago | IN | 0 ETH | 0.00070661 | ||||
Approve | 17662948 | 598 days ago | IN | 0 ETH | 0.00059402 | ||||
Approve | 17662948 | 598 days ago | IN | 0 ETH | 0.00070963 | ||||
Approve | 17662947 | 598 days ago | IN | 0 ETH | 0.00059604 | ||||
Approve | 17662944 | 598 days ago | IN | 0 ETH | 0.00065721 | ||||
Approve | 17662942 | 598 days ago | IN | 0 ETH | 0.00066171 | ||||
Approve | 17662940 | 598 days ago | IN | 0 ETH | 0.00082481 | ||||
Approve | 17662940 | 598 days ago | IN | 0 ETH | 0.00161641 | ||||
Approve | 17662937 | 598 days ago | IN | 0 ETH | 0.00192372 | ||||
Approve | 17662934 | 598 days ago | IN | 0 ETH | 0.001839 | ||||
Approve | 17662924 | 598 days ago | IN | 0 ETH | 0.00064258 | ||||
Transfer | 17662917 | 598 days ago | IN | 0 ETH | 0.00081232 | ||||
Mint | 17662913 | 598 days ago | IN | 0.1 ETH | 0.00390056 | ||||
Set Homeless Car... | 17662911 | 598 days ago | IN | 0 ETH | 0.00066371 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HomelessDog
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-10 */ // Sources flattened with hardhat v2.12.3 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // // 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/[email protected] // // 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/access/[email protected] // // 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/[email protected] // // OpenZeppelin Contracts (last updated v4.9.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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ 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(account), " 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 contracts/Roles.sol // pragma solidity >0.8.0; contract Roles is AccessControl { error NotAuthorizedError(address sender); constructor(address _owner) { _setupRole(DEFAULT_ADMIN_ROLE, _owner); } modifier onlyOwner() { if (!hasRole(DEFAULT_ADMIN_ROLE, _msgSender())) { revert NotAuthorizedError(_msgSender()); } _; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File @openzeppelin/contracts/security/[email protected] // // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File @openzeppelin/contracts/security/[email protected] // // 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/token/ERC20/extensions/[email protected] // // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File contracts/HomelessDog.sol // pragma solidity ^0.8.9; interface IHomelessCard { function mint(address to, uint256 value) external payable; } contract HomelessDog is ERC20, ERC20Burnable, Roles, Pausable, ReentrancyGuard { uint256 public round = 1; uint256 public mintCount; uint256 public currentThreshold = 20; uint256 public totalThreshold = 20; uint256 public tokenAmount; uint256 public shareAmount; uint256 public constant UNIT = 10 ** 18; uint256 public fee = 2; address public swapAddr; address public lpOwner; bool public lock; uint256 public unlockTimestamp; address public recipient; address public homelessCard; address public NonfungiblePositionManager; constructor() ERC20("HomelessDog", "HDT") Roles(_msgSender()) { tokenAmount = 1000 * UNIT; shareAmount = (10 ** 8 * UNIT) / totalThreshold; _mint(_msgSender(), 8 * 10 ** 10 * UNIT); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setFee(uint256 fee_) external onlyOwner { require(fee_ < 10, "fee < 10"); fee = fee_; } function setSwapAddrAndLock(address swapAddr_, address lpOwner_) external onlyOwner { require(!lock, "locked"); lock = true; unlockTimestamp = block.timestamp + 90 days; swapAddr = swapAddr_; lpOwner = lpOwner_; } function setHomelessCard(address homelessCard_) external onlyOwner { homelessCard = homelessCard_; } function setNonfungiblePositionManager(address NonfungiblePositionManager_) external onlyOwner { NonfungiblePositionManager = NonfungiblePositionManager_; } function setRecipient(address recipient_) external onlyOwner { recipient = recipient_; } function withdrawEth() external nonReentrant onlyOwner { require(address(this).balance > 0, "balance is zero"); require(recipient != address(0), "recipient is zero"); (bool success, ) = recipient.call{value: address(this).balance}(""); require(success, "Unable to send value"); } function mint() external payable nonReentrant whenNotPaused { require(msg.value == 0.1 ether, "Need to pay 0.1 eth"); require(totalSupply() < 10 ** 35, "finish"); (uint256 _tokenAmount, uint256 _shareAmount) = calculate(); _mint(_msgSender(), _tokenAmount); IHomelessCard(homelessCard).mint{value: 0.05 ether}(_msgSender(), _shareAmount); } function calculate() internal returns (uint256 _tokenAmount, uint256 _shareAmount) { ++mintCount; _tokenAmount = tokenAmount; _shareAmount = shareAmount; if (mintCount >= totalThreshold) { currentThreshold = (currentThreshold * 3) / 2; totalThreshold += currentThreshold; ++round; tokenAmount = (tokenAmount * 31) / 20; shareAmount = (10 ** 8 * UNIT) / totalThreshold; } } function _transfer(address from, address to, uint256 amount) internal override { if (to == lpOwner && lock) { require(block.timestamp > unlockTimestamp, "forbidden"); } if (from == swapAddr && to != NonfungiblePositionManager && fee > 0) { uint256 feeAmount = (amount * fee) / 100; amount -= feeAmount; super._transfer(from, address(this), feeAmount); } super._transfer(from, to, amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal override whenNotPaused { super._beforeTokenTransfer(from, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotAuthorizedError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"NonfungiblePositionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"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":[],"name":"homelessCard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipient","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee_","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"homelessCard_","type":"address"}],"name":"setHomelessCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NonfungiblePositionManager_","type":"address"}],"name":"setNonfungiblePositionManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"}],"name":"setRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"swapAddr_","type":"address"},{"internalType":"address","name":"lpOwner_","type":"address"}],"name":"setSwapAddrAndLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016008556014600a556014600b556002600e553480156200002557600080fd5b50336040518060400160405280600b81526020016a486f6d656c657373446f6760a81b8152506040518060400160405280600381526020016212111560ea1b8152508160039081620000789190620003c7565b506004620000878282620003c7565b50620000999150600090508262000116565b506006805460ff191690556001600755620000bf670de0b6b3a76400006103e8620004a9565b600c55600b54620000dd670de0b6b3a76400006305f5e100620004a9565b620000e99190620004c3565b600d5562000110336200010a670de0b6b3a76400006412a05f2000620004a9565b62000126565b620004fc565b620001228282620001fb565b5050565b6001600160a01b038216620001825760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620001906000838362000285565b8060026000828254620001a49190620004e6565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b620002078282620002ac565b620001225760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002413390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6200028f620002d9565b620002a7838383620002a760201b62000a451760201c565b505050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b60065460ff1615620003215760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000179565b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200034e57607f821691505b6020821081036200036f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002a757600081815260208120601f850160051c810160208610156200039e5750805b601f850160051c820191505b81811015620003bf57828155600101620003aa565b505050505050565b81516001600160401b03811115620003e357620003e362000323565b620003fb81620003f4845462000339565b8462000375565b602080601f8311600181146200043357600084156200041a5750858301515b600019600386901b1c1916600185901b178555620003bf565b600085815260208120601f198616915b82811015620004645788860151825594840194600190910190840162000443565b5085821015620004835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620002d357620002d362000493565b600082620004e157634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620002d357620002d362000493565b611e33806200050c6000396000f3fe6080604052600436106102725760003560e01c806379cc67901161014f578063aa082a9d116100c1578063ddca3f431161007a578063ddca3f4314610720578063eb582d1314610736578063eec7faa114610756578063f444324b1461076c578063f83d08ba1461078c578063f910cff8146107ad57600080fd5b8063aa082a9d14610674578063b1c45cc31461068a578063c2f137f1146106a0578063cb8451ef146106c0578063d547741f146106e0578063dd62ed3e1461070057600080fd5b8063990c872c11610113578063990c872c146105ce5780639d8e2177146105ee578063a0ef91df1461060a578063a217fddf1461061f578063a457c2d714610634578063a9059cbb1461065457600080fd5b806379cc67901461054e5780638456cb591461056e57806391d148541461058357806395d89b41146105a35780639659867e146105b857600080fd5b80633469d025116101e857806342966c68116101ac57806342966c68146104685780635c975abb1461048857806366d003ac146104a057806369fe0e2d146104d857806370a08231146104f8578063725b78931461052e57600080fd5b80633469d025146103d357806336568abe146103f357806339509351146104135780633bbed4a0146104335780633f4ba83a1461045357600080fd5b806318160ddd1161023a57806318160ddd1461031c57806322a644b21461033157806323b872dd14610347578063248a9ca3146103675780632f2ff15d14610397578063313ce567146103b757600080fd5b806301ffc9a71461027757806306fdde03146102ac578063095ea7b3146102ce5780631249c58b146102ee578063146ca531146102f8575b600080fd5b34801561028357600080fd5b50610297610292366004611af0565b6107c3565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16107fa565b6040516102a39190611b3e565b3480156102da57600080fd5b506102976102e9366004611b8d565b61088c565b6102f66108a4565b005b34801561030457600080fd5b5061030e60085481565b6040519081526020016102a3565b34801561032857600080fd5b5060025461030e565b34801561033d57600080fd5b5061030e600d5481565b34801561035357600080fd5b50610297610362366004611bb7565b6109fc565b34801561037357600080fd5b5061030e610382366004611bf3565b60009081526005602052604090206001015490565b3480156103a357600080fd5b506102f66103b2366004611c0c565b610a20565b3480156103c357600080fd5b50604051601281526020016102a3565b3480156103df57600080fd5b506102f66103ee366004611c38565b610a4a565b3480156103ff57600080fd5b506102f661040e366004611c0c565b610b14565b34801561041f57600080fd5b5061029761042e366004611b8d565b610b92565b34801561043f57600080fd5b506102f661044e366004611c62565b610bb4565b34801561045f57600080fd5b506102f6610beb565b34801561047457600080fd5b506102f6610483366004611bf3565b610c08565b34801561049457600080fd5b5060065460ff16610297565b3480156104ac57600080fd5b506012546104c0906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b3480156104e457600080fd5b506102f66104f3366004611bf3565b610c15565b34801561050457600080fd5b5061030e610513366004611c62565b6001600160a01b031660009081526020819052604090205490565b34801561053a57600080fd5b506102f6610549366004611c62565b610c6a565b34801561055a57600080fd5b506102f6610569366004611b8d565b610ca1565b34801561057a57600080fd5b506102f6610cb6565b34801561058f57600080fd5b5061029761059e366004611c0c565b610cd3565b3480156105af57600080fd5b506102c1610cfe565b3480156105c457600080fd5b5061030e60095481565b3480156105da57600080fd5b506013546104c0906001600160a01b031681565b3480156105fa57600080fd5b5061030e670de0b6b3a764000081565b34801561061657600080fd5b506102f6610d0d565b34801561062b57600080fd5b5061030e600081565b34801561064057600080fd5b5061029761064f366004611b8d565b610e5d565b34801561066057600080fd5b5061029761066f366004611b8d565b610ed8565b34801561068057600080fd5b5061030e60115481565b34801561069657600080fd5b5061030e600b5481565b3480156106ac57600080fd5b50600f546104c0906001600160a01b031681565b3480156106cc57600080fd5b506102f66106db366004611c62565b610ee6565b3480156106ec57600080fd5b506102f66106fb366004611c0c565b610f1d565b34801561070c57600080fd5b5061030e61071b366004611c38565b610f42565b34801561072c57600080fd5b5061030e600e5481565b34801561074257600080fd5b506014546104c0906001600160a01b031681565b34801561076257600080fd5b5061030e600c5481565b34801561077857600080fd5b506010546104c0906001600160a01b031681565b34801561079857600080fd5b5060105461029790600160a01b900460ff1681565b3480156107b957600080fd5b5061030e600a5481565b60006001600160e01b03198216637965db0b60e01b14806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461080990611c7d565b80601f016020809104026020016040519081016040528092919081815260200182805461083590611c7d565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905090565b60003361089a818585610f6d565b5060019392505050565b6108ac611091565b6108b46110ea565b3467016345785d8a0000146109065760405162461bcd60e51b815260206004820152601360248201527209ccacac840e8de40e0c2f240605c6240cae8d606b1b60448201526064015b60405180910390fd5b6e13426172c74d822b878fe80000000061091f60025490565b106109555760405162461bcd60e51b81526020600482015260066024820152650ccd2dcd2e6d60d31b60448201526064016108fd565b600080610960611130565b9150915061097461096e3390565b836111f1565b6013546001600160a01b03166340c10f1966b1a2bc2ec50000336040516001600160e01b031960e085901b1681526001600160a01b039091166004820152602481018590526044016000604051808303818588803b1580156109d557600080fd5b505af11580156109e9573d6000803e3d6000fd5b505050505050506109fa6001600755565b565b600033610a0a8582856112bc565b610a15858585611336565b506001949350505050565b600082815260056020526040902060010154610a3b8161141e565b610a458383611428565b505050565b610a55600033610cd3565b610a8057335b60405163458a16af60e01b81526001600160a01b0390911660048201526024016108fd565b601054600160a01b900460ff1615610ac35760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016108fd565b6010805460ff60a01b1916600160a01b179055610ae3426276a700611ccd565b601155600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b6001600160a01b0381163314610b845760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108fd565b610b8e82826114ae565b5050565b60003361089a818585610ba58383610f42565b610baf9190611ccd565b610f6d565b610bbf600033610cd3565b610bc95733610a5b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610bf6600033610cd3565b610c005733610a5b565b6109fa611515565b610c123382611567565b50565b610c20600033610cd3565b610c2a5733610a5b565b600a8110610c655760405162461bcd60e51b81526020600482015260086024820152670666565203c2031360c41b60448201526064016108fd565b600e55565b610c75600033610cd3565b610c7f5733610a5b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610cac8233836112bc565b610b8e8282611567565b610cc1600033610cd3565b610ccb5733610a5b565b6109fa6116a5565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461080990611c7d565b610d15611091565b610d20600033610cd3565b610d2a5733610a5b565b60004711610d6c5760405162461bcd60e51b815260206004820152600f60248201526e62616c616e6365206973207a65726f60881b60448201526064016108fd565b6012546001600160a01b0316610db85760405162461bcd60e51b8152602060048201526011602482015270726563697069656e74206973207a65726f60781b60448201526064016108fd565b6012546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e05576040519150601f19603f3d011682016040523d82523d6000602084013e610e0a565b606091505b5050905080610e525760405162461bcd60e51b8152602060048201526014602482015273556e61626c6520746f2073656e642076616c756560601b60448201526064016108fd565b506109fa6001600755565b60003381610e6b8286610f42565b905083811015610ecb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108fd565b610a158286868403610f6d565b60003361089a818585611336565b610ef1600033610cd3565b610efb5733610a5b565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600082815260056020526040902060010154610f388161141e565b610a4583836114ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610fcf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fd565b6001600160a01b0382166110305760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6002600754036110e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108fd565b6002600755565b60065460ff16156109fa5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108fd565b60008060096000815461114290611ce0565b9091555050600c54600d54600b546009549293509091106111ed576002600a54600361116e9190611cf9565b6111789190611d10565b600a819055600b805460009061118f908490611ccd565b9091555050600880546000906111a490611ce0565b90915550600c546014906111b990601f611cf9565b6111c39190611d10565b600c55600b546111df670de0b6b3a76400006305f5e100611cf9565b6111e99190611d10565b600d555b9091565b6001600160a01b0382166112475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fd565b611253600083836116e2565b80600260008282546112659190611ccd565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006112c88484610f42565b9050600019811461133057818110156113235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fd565b6113308484848403610f6d565b50505050565b6010546001600160a01b03838116911614801561135c5750601054600160a01b900460ff165b1561139e57601154421161139e5760405162461bcd60e51b81526020600482015260096024820152683337b93134b23232b760b91b60448201526064016108fd565b600f546001600160a01b0384811691161480156113c957506014546001600160a01b03838116911614155b80156113d757506000600e54115b156114135760006064600e54836113ee9190611cf9565b6113f89190611d10565b90506114048183611d32565b91506114118430836116ea565b505b610a458383836116ea565b610c128133611899565b6114328282610cd3565b610b8e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561146a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114b88282610cd3565b15610b8e5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61151d6118f2565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166115c75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108fd565b6115d3826000836116e2565b6001600160a01b038216600090815260208190526040902054818110156116475760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108fd565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6116ad6110ea565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861154a3390565b610a456110ea565b6001600160a01b03831661174e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fd565b6001600160a01b0382166117b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fd565b6117bb8383836116e2565b6001600160a01b038316600090815260208190526040902054818110156118335760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611330565b6118a38282610cd3565b610b8e576118b08161193b565b6118bb83602061194d565b6040516020016118cc929190611d45565b60408051601f198184030181529082905262461bcd60e51b82526108fd91600401611b3e565b60065460ff166109fa5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108fd565b60606107f46001600160a01b03831660145b6060600061195c836002611cf9565b611967906002611ccd565b67ffffffffffffffff81111561197f5761197f611dba565b6040519080825280601f01601f1916602001820160405280156119a9576020820181803683370190505b509050600360fc1b816000815181106119c4576119c4611dd0565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106119f3576119f3611dd0565b60200101906001600160f81b031916908160001a9053506000611a17846002611cf9565b611a22906001611ccd565b90505b6001811115611a9a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611a5657611a56611dd0565b1a60f81b828281518110611a6c57611a6c611dd0565b60200101906001600160f81b031916908160001a90535060049490941c93611a9381611de6565b9050611a25565b508315611ae95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108fd565b9392505050565b600060208284031215611b0257600080fd5b81356001600160e01b031981168114611ae957600080fd5b60005b83811015611b35578181015183820152602001611b1d565b50506000910152565b6020815260008251806020840152611b5d816040850160208701611b1a565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611b8857600080fd5b919050565b60008060408385031215611ba057600080fd5b611ba983611b71565b946020939093013593505050565b600080600060608486031215611bcc57600080fd5b611bd584611b71565b9250611be360208501611b71565b9150604084013590509250925092565b600060208284031215611c0557600080fd5b5035919050565b60008060408385031215611c1f57600080fd5b82359150611c2f60208401611b71565b90509250929050565b60008060408385031215611c4b57600080fd5b611c5483611b71565b9150611c2f60208401611b71565b600060208284031215611c7457600080fd5b611ae982611b71565b600181811c90821680611c9157607f821691505b602082108103611cb157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107f4576107f4611cb7565b600060018201611cf257611cf2611cb7565b5060010190565b80820281158282048414176107f4576107f4611cb7565b600082611d2d57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107f4576107f4611cb7565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611d7d816017850160208801611b1a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611dae816028840160208801611b1a565b01602801949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081611df557611df5611cb7565b50600019019056fea26469706673582212202d7105dd8bd82be3fd6f14c230d6c28c8c1f13cf6c0562857409dfadb56ebd1c64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102725760003560e01c806379cc67901161014f578063aa082a9d116100c1578063ddca3f431161007a578063ddca3f4314610720578063eb582d1314610736578063eec7faa114610756578063f444324b1461076c578063f83d08ba1461078c578063f910cff8146107ad57600080fd5b8063aa082a9d14610674578063b1c45cc31461068a578063c2f137f1146106a0578063cb8451ef146106c0578063d547741f146106e0578063dd62ed3e1461070057600080fd5b8063990c872c11610113578063990c872c146105ce5780639d8e2177146105ee578063a0ef91df1461060a578063a217fddf1461061f578063a457c2d714610634578063a9059cbb1461065457600080fd5b806379cc67901461054e5780638456cb591461056e57806391d148541461058357806395d89b41146105a35780639659867e146105b857600080fd5b80633469d025116101e857806342966c68116101ac57806342966c68146104685780635c975abb1461048857806366d003ac146104a057806369fe0e2d146104d857806370a08231146104f8578063725b78931461052e57600080fd5b80633469d025146103d357806336568abe146103f357806339509351146104135780633bbed4a0146104335780633f4ba83a1461045357600080fd5b806318160ddd1161023a57806318160ddd1461031c57806322a644b21461033157806323b872dd14610347578063248a9ca3146103675780632f2ff15d14610397578063313ce567146103b757600080fd5b806301ffc9a71461027757806306fdde03146102ac578063095ea7b3146102ce5780631249c58b146102ee578063146ca531146102f8575b600080fd5b34801561028357600080fd5b50610297610292366004611af0565b6107c3565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16107fa565b6040516102a39190611b3e565b3480156102da57600080fd5b506102976102e9366004611b8d565b61088c565b6102f66108a4565b005b34801561030457600080fd5b5061030e60085481565b6040519081526020016102a3565b34801561032857600080fd5b5060025461030e565b34801561033d57600080fd5b5061030e600d5481565b34801561035357600080fd5b50610297610362366004611bb7565b6109fc565b34801561037357600080fd5b5061030e610382366004611bf3565b60009081526005602052604090206001015490565b3480156103a357600080fd5b506102f66103b2366004611c0c565b610a20565b3480156103c357600080fd5b50604051601281526020016102a3565b3480156103df57600080fd5b506102f66103ee366004611c38565b610a4a565b3480156103ff57600080fd5b506102f661040e366004611c0c565b610b14565b34801561041f57600080fd5b5061029761042e366004611b8d565b610b92565b34801561043f57600080fd5b506102f661044e366004611c62565b610bb4565b34801561045f57600080fd5b506102f6610beb565b34801561047457600080fd5b506102f6610483366004611bf3565b610c08565b34801561049457600080fd5b5060065460ff16610297565b3480156104ac57600080fd5b506012546104c0906001600160a01b031681565b6040516001600160a01b0390911681526020016102a3565b3480156104e457600080fd5b506102f66104f3366004611bf3565b610c15565b34801561050457600080fd5b5061030e610513366004611c62565b6001600160a01b031660009081526020819052604090205490565b34801561053a57600080fd5b506102f6610549366004611c62565b610c6a565b34801561055a57600080fd5b506102f6610569366004611b8d565b610ca1565b34801561057a57600080fd5b506102f6610cb6565b34801561058f57600080fd5b5061029761059e366004611c0c565b610cd3565b3480156105af57600080fd5b506102c1610cfe565b3480156105c457600080fd5b5061030e60095481565b3480156105da57600080fd5b506013546104c0906001600160a01b031681565b3480156105fa57600080fd5b5061030e670de0b6b3a764000081565b34801561061657600080fd5b506102f6610d0d565b34801561062b57600080fd5b5061030e600081565b34801561064057600080fd5b5061029761064f366004611b8d565b610e5d565b34801561066057600080fd5b5061029761066f366004611b8d565b610ed8565b34801561068057600080fd5b5061030e60115481565b34801561069657600080fd5b5061030e600b5481565b3480156106ac57600080fd5b50600f546104c0906001600160a01b031681565b3480156106cc57600080fd5b506102f66106db366004611c62565b610ee6565b3480156106ec57600080fd5b506102f66106fb366004611c0c565b610f1d565b34801561070c57600080fd5b5061030e61071b366004611c38565b610f42565b34801561072c57600080fd5b5061030e600e5481565b34801561074257600080fd5b506014546104c0906001600160a01b031681565b34801561076257600080fd5b5061030e600c5481565b34801561077857600080fd5b506010546104c0906001600160a01b031681565b34801561079857600080fd5b5060105461029790600160a01b900460ff1681565b3480156107b957600080fd5b5061030e600a5481565b60006001600160e01b03198216637965db0b60e01b14806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461080990611c7d565b80601f016020809104026020016040519081016040528092919081815260200182805461083590611c7d565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905090565b60003361089a818585610f6d565b5060019392505050565b6108ac611091565b6108b46110ea565b3467016345785d8a0000146109065760405162461bcd60e51b815260206004820152601360248201527209ccacac840e8de40e0c2f240605c6240cae8d606b1b60448201526064015b60405180910390fd5b6e13426172c74d822b878fe80000000061091f60025490565b106109555760405162461bcd60e51b81526020600482015260066024820152650ccd2dcd2e6d60d31b60448201526064016108fd565b600080610960611130565b9150915061097461096e3390565b836111f1565b6013546001600160a01b03166340c10f1966b1a2bc2ec50000336040516001600160e01b031960e085901b1681526001600160a01b039091166004820152602481018590526044016000604051808303818588803b1580156109d557600080fd5b505af11580156109e9573d6000803e3d6000fd5b505050505050506109fa6001600755565b565b600033610a0a8582856112bc565b610a15858585611336565b506001949350505050565b600082815260056020526040902060010154610a3b8161141e565b610a458383611428565b505050565b610a55600033610cd3565b610a8057335b60405163458a16af60e01b81526001600160a01b0390911660048201526024016108fd565b601054600160a01b900460ff1615610ac35760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016108fd565b6010805460ff60a01b1916600160a01b179055610ae3426276a700611ccd565b601155600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b6001600160a01b0381163314610b845760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108fd565b610b8e82826114ae565b5050565b60003361089a818585610ba58383610f42565b610baf9190611ccd565b610f6d565b610bbf600033610cd3565b610bc95733610a5b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610bf6600033610cd3565b610c005733610a5b565b6109fa611515565b610c123382611567565b50565b610c20600033610cd3565b610c2a5733610a5b565b600a8110610c655760405162461bcd60e51b81526020600482015260086024820152670666565203c2031360c41b60448201526064016108fd565b600e55565b610c75600033610cd3565b610c7f5733610a5b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610cac8233836112bc565b610b8e8282611567565b610cc1600033610cd3565b610ccb5733610a5b565b6109fa6116a5565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461080990611c7d565b610d15611091565b610d20600033610cd3565b610d2a5733610a5b565b60004711610d6c5760405162461bcd60e51b815260206004820152600f60248201526e62616c616e6365206973207a65726f60881b60448201526064016108fd565b6012546001600160a01b0316610db85760405162461bcd60e51b8152602060048201526011602482015270726563697069656e74206973207a65726f60781b60448201526064016108fd565b6012546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e05576040519150601f19603f3d011682016040523d82523d6000602084013e610e0a565b606091505b5050905080610e525760405162461bcd60e51b8152602060048201526014602482015273556e61626c6520746f2073656e642076616c756560601b60448201526064016108fd565b506109fa6001600755565b60003381610e6b8286610f42565b905083811015610ecb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108fd565b610a158286868403610f6d565b60003361089a818585611336565b610ef1600033610cd3565b610efb5733610a5b565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600082815260056020526040902060010154610f388161141e565b610a4583836114ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610fcf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fd565b6001600160a01b0382166110305760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6002600754036110e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108fd565b6002600755565b60065460ff16156109fa5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108fd565b60008060096000815461114290611ce0565b9091555050600c54600d54600b546009549293509091106111ed576002600a54600361116e9190611cf9565b6111789190611d10565b600a819055600b805460009061118f908490611ccd565b9091555050600880546000906111a490611ce0565b90915550600c546014906111b990601f611cf9565b6111c39190611d10565b600c55600b546111df670de0b6b3a76400006305f5e100611cf9565b6111e99190611d10565b600d555b9091565b6001600160a01b0382166112475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fd565b611253600083836116e2565b80600260008282546112659190611ccd565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006112c88484610f42565b9050600019811461133057818110156113235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fd565b6113308484848403610f6d565b50505050565b6010546001600160a01b03838116911614801561135c5750601054600160a01b900460ff165b1561139e57601154421161139e5760405162461bcd60e51b81526020600482015260096024820152683337b93134b23232b760b91b60448201526064016108fd565b600f546001600160a01b0384811691161480156113c957506014546001600160a01b03838116911614155b80156113d757506000600e54115b156114135760006064600e54836113ee9190611cf9565b6113f89190611d10565b90506114048183611d32565b91506114118430836116ea565b505b610a458383836116ea565b610c128133611899565b6114328282610cd3565b610b8e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561146a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114b88282610cd3565b15610b8e5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61151d6118f2565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166115c75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108fd565b6115d3826000836116e2565b6001600160a01b038216600090815260208190526040902054818110156116475760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108fd565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6116ad6110ea565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861154a3390565b610a456110ea565b6001600160a01b03831661174e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fd565b6001600160a01b0382166117b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fd565b6117bb8383836116e2565b6001600160a01b038316600090815260208190526040902054818110156118335760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611330565b6118a38282610cd3565b610b8e576118b08161193b565b6118bb83602061194d565b6040516020016118cc929190611d45565b60408051601f198184030181529082905262461bcd60e51b82526108fd91600401611b3e565b60065460ff166109fa5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108fd565b60606107f46001600160a01b03831660145b6060600061195c836002611cf9565b611967906002611ccd565b67ffffffffffffffff81111561197f5761197f611dba565b6040519080825280601f01601f1916602001820160405280156119a9576020820181803683370190505b509050600360fc1b816000815181106119c4576119c4611dd0565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106119f3576119f3611dd0565b60200101906001600160f81b031916908160001a9053506000611a17846002611cf9565b611a22906001611ccd565b90505b6001811115611a9a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611a5657611a56611dd0565b1a60f81b828281518110611a6c57611a6c611dd0565b60200101906001600160f81b031916908160001a90535060049490941c93611a9381611de6565b9050611a25565b508315611ae95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108fd565b9392505050565b600060208284031215611b0257600080fd5b81356001600160e01b031981168114611ae957600080fd5b60005b83811015611b35578181015183820152602001611b1d565b50506000910152565b6020815260008251806020840152611b5d816040850160208701611b1a565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611b8857600080fd5b919050565b60008060408385031215611ba057600080fd5b611ba983611b71565b946020939093013593505050565b600080600060608486031215611bcc57600080fd5b611bd584611b71565b9250611be360208501611b71565b9150604084013590509250925092565b600060208284031215611c0557600080fd5b5035919050565b60008060408385031215611c1f57600080fd5b82359150611c2f60208401611b71565b90509250929050565b60008060408385031215611c4b57600080fd5b611c5483611b71565b9150611c2f60208401611b71565b600060208284031215611c7457600080fd5b611ae982611b71565b600181811c90821680611c9157607f821691505b602082108103611cb157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107f4576107f4611cb7565b600060018201611cf257611cf2611cb7565b5060010190565b80820281158282048414176107f4576107f4611cb7565b600082611d2d57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107f4576107f4611cb7565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611d7d816017850160208801611b1a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611dae816028840160208801611b1a565b01602801949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081611df557611df5611cb7565b50600019019056fea26469706673582212202d7105dd8bd82be3fd6f14c230d6c28c8c1f13cf6c0562857409dfadb56ebd1c64736f6c63430008110033
Deployed Bytecode Sourcemap
56169:3675:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26079:204;;;;;;;;;;-1:-1:-1;26079:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;26079:204:0;;;;;;;;37923:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40283:201::-;;;;;;;;;;-1:-1:-1;40283:201:0;;;;;:::i;:::-;;:::i;58279:390::-;;;:::i;:::-;;56255:24;;;;;;;;;;;;;;;;;;;1736:25:1;;;1724:2;1709:18;56255:24:0;1590:177:1;39052:108:0;;;;;;;;;;-1:-1:-1;39140:12:0;;39052:108;;56434:26;;;;;;;;;;;;;;;;41064:261;;;;;;;;;;-1:-1:-1;41064:261:0;;;;;:::i;:::-;;:::i;27902:131::-;;;;;;;;;;-1:-1:-1;27902:131:0;;;;;:::i;:::-;27976:7;28003:12;;;:6;:12;;;;;:22;;;;27902:131;28343:147;;;;;;;;;;-1:-1:-1;28343:147:0;;;;;:::i;:::-;;:::i;38894:93::-;;;;;;;;;;-1:-1:-1;38894:93:0;;38977:2;2873:36:1;;2861:2;2846:18;38894:93:0;2731:184:1;57270:263:0;;;;;;;;;;-1:-1:-1;57270:263:0;;;;;:::i;:::-;;:::i;29487:218::-;;;;;;;;;;-1:-1:-1;29487:218:0;;;;;:::i;:::-;;:::i;41734:238::-;;;;;;;;;;-1:-1:-1;41734:238:0;;;;;:::i;:::-;;:::i;57841:102::-;;;;;;;;;;-1:-1:-1;57841:102:0;;;;;:::i;:::-;;:::i;57070:65::-;;;;;;;;;;;;;:::i;55423:91::-;;;;;;;;;;-1:-1:-1;55423:91:0;;;;;:::i;:::-;;:::i;53849:86::-;;;;;;;;;;-1:-1:-1;53920:7:0;;;;53849:86;;56663:24;;;;;;;;;;-1:-1:-1;56663:24:0;;;;-1:-1:-1;;;;;56663:24:0;;;;;;-1:-1:-1;;;;;3725:32:1;;;3707:51;;3695:2;3680:18;56663:24:0;3561:203:1;57143:119:0;;;;;;;;;;-1:-1:-1;57143:119:0;;;;;:::i;:::-;;:::i;39223:127::-;;;;;;;;;;-1:-1:-1;39223:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;39324:18:0;39297:7;39324:18;;;;;;;;;;;;39223:127;57541:114;;;;;;;;;;-1:-1:-1;57541:114:0;;;;;:::i;:::-;;:::i;55833:164::-;;;;;;;;;;-1:-1:-1;55833:164:0;;;;;:::i;:::-;;:::i;57001:61::-;;;;;;;;;;;;;:::i;26375:147::-;;;;;;;;;;-1:-1:-1;26375:147:0;;;;;:::i;:::-;;:::i;38142:104::-;;;;;;;;;;;;;:::i;56286:24::-;;;;;;;;;;;;;;;;56694:27;;;;;;;;;;-1:-1:-1;56694:27:0;;;;-1:-1:-1;;;;;56694:27:0;;;56469:39;;;;;;;;;;;;56500:8;56469:39;;57951:320;;;;;;;;;;;;;:::i;25480:49::-;;;;;;;;;;-1:-1:-1;25480:49:0;25525:4;25480:49;;42475:436;;;;;;;;;;-1:-1:-1;42475:436:0;;;;;:::i;:::-;;:::i;39556:193::-;;;;;;;;;;-1:-1:-1;39556:193:0;;;;;:::i;:::-;;:::i;56626:30::-;;;;;;;;;;;;;;;;56360:34;;;;;;;;;;;;;;;;56544:23;;;;;;;;;;-1:-1:-1;56544:23:0;;;;-1:-1:-1;;;;;56544:23:0;;;57663:170;;;;;;;;;;-1:-1:-1;57663:170:0;;;;;:::i;:::-;;:::i;28783:149::-;;;;;;;;;;-1:-1:-1;28783:149:0;;;;;:::i;:::-;;:::i;39812:151::-;;;;;;;;;;-1:-1:-1;39812:151:0;;;;;:::i;:::-;;:::i;56515:22::-;;;;;;;;;;;;;;;;56728:41;;;;;;;;;;-1:-1:-1;56728:41:0;;;;-1:-1:-1;;;;;56728:41:0;;;56401:26;;;;;;;;;;;;;;;;56574:22;;;;;;;;;;-1:-1:-1;56574:22:0;;;;-1:-1:-1;;;;;56574:22:0;;;56603:16;;;;;;;;;;-1:-1:-1;56603:16:0;;;;-1:-1:-1;;;56603:16:0;;;;;;56317:36;;;;;;;;;;;;;;;;26079:204;26164:4;-1:-1:-1;;;;;;26188:47:0;;-1:-1:-1;;;26188:47:0;;:87;;-1:-1:-1;;;;;;;;;;20259:40:0;;;26239:36;26181:94;26079:204;-1:-1:-1;;26079:204:0:o;37923:100::-;37977:13;38010:5;38003:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37923:100;:::o;40283:201::-;40366:4;861:10;40422:32;861:10;40438:7;40447:6;40422:8;:32::i;:::-;-1:-1:-1;40472:4:0;;40283:201;-1:-1:-1;;;40283:201:0:o;58279:390::-;51272:21;:19;:21::i;:::-;53454:19:::1;:17;:19::i;:::-;58358:9:::2;58371;58358:22;58350:54;;;::::0;-1:-1:-1;;;58350:54:0;;4356:2:1;58350:54:0::2;::::0;::::2;4338:21:1::0;4395:2;4375:18;;;4368:30;-1:-1:-1;;;4414:18:1;;;4407:49;4473:18;;58350:54:0::2;;;;;;;;;58439:8;58423:13;39140:12:::0;;;39052:108;58423:13:::2;:24;58415:43;;;::::0;-1:-1:-1;;;58415:43:0;;4704:2:1;58415:43:0::2;::::0;::::2;4686:21:1::0;4743:1;4723:18;;;4716:29;-1:-1:-1;;;4761:18:1;;;4754:36;4807:18;;58415:43:0::2;4502:329:1::0;58415:43:0::2;58470:20;58492::::0;58516:11:::2;:9;:11::i;:::-;58469:58;;;;58538:33;58544:12;861:10:::0;;781:98;58544:12:::2;58558;58538:5;:33::i;:::-;58596:12;::::0;-1:-1:-1;;;;;58596:12:0::2;58582:32;58622:10;861::::0;58582:79:::2;::::0;-1:-1:-1;;;;;;58582:79:0::2;::::0;;;;;;-1:-1:-1;;;;;5028:32:1;;;58582:79:0::2;::::0;::::2;5010:51:1::0;5077:18;;;5070:34;;;4983:18;;58582:79:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;58339:330;;51316:20:::0;50710:1;51836:7;:22;51653:213;51316:20;58279:390::o;41064:261::-;41161:4;861:10;41219:38;41235:4;861:10;41250:6;41219:15;:38::i;:::-;41268:27;41278:4;41284:2;41288:6;41268:9;:27::i;:::-;-1:-1:-1;41313:4:0;;41064:261;-1:-1:-1;;;;41064:261:0:o;28343:147::-;27976:7;28003:12;;;:6;:12;;;;;:22;;;25971:16;25982:4;25971:10;:16::i;:::-;28457:25:::1;28468:4;28474:7;28457:10;:25::i;:::-;28343:147:::0;;;:::o;57270:263::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;32096:32;;-1:-1:-1;;;32096:32:0;;-1:-1:-1;;;;;3725:32:1;;;32096::0;;;3707:51:1;3680:18;;32096:32:0;3561:203:1;32026:114:0;57374:4:::1;::::0;-1:-1:-1;;;57374:4:0;::::1;;;57373:5;57365:24;;;::::0;-1:-1:-1;;;57365:24:0;;5317:2:1;57365:24:0::1;::::0;::::1;5299:21:1::0;5356:1;5336:18;;;5329:29;-1:-1:-1;;;5374:18:1;;;5367:36;5420:18;;57365:24:0::1;5115:329:1::0;57365:24:0::1;57400:4;:11:::0;;-1:-1:-1;;;;57400:11:0::1;-1:-1:-1::0;;;57400:11:0::1;::::0;;57440:25:::1;:15;57458:7;57440:25;:::i;:::-;57422:15;:43:::0;57476:8:::1;:20:::0;;-1:-1:-1;;;;;57476:20:0;;::::1;-1:-1:-1::0;;;;;;57476:20:0;;::::1;;::::0;;;57507:7:::1;:18:::0;;;;;::::1;::::0;::::1;;::::0;;57270:263::o;29487:218::-;-1:-1:-1;;;;;29583:23:0;;861:10;29583:23;29575:83;;;;-1:-1:-1;;;29575:83:0;;5913:2:1;29575:83:0;;;5895:21:1;5952:2;5932:18;;;5925:30;5991:34;5971:18;;;5964:62;-1:-1:-1;;;6042:18:1;;;6035:45;6097:19;;29575:83:0;5711:411:1;29575:83:0;29671:26;29683:4;29689:7;29671:11;:26::i;:::-;29487:218;;:::o;41734:238::-;41822:4;861:10;41878:64;861:10;41894:7;41931:10;41903:25;861:10;41894:7;41903:9;:25::i;:::-;:38;;;;:::i;:::-;41878:8;:64::i;57841:102::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57913:9:::1;:22:::0;;-1:-1:-1;;;;;;57913:22:0::1;-1:-1:-1::0;;;;;57913:22:0;;;::::1;::::0;;;::::1;::::0;;57841:102::o;57070:65::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57117:10:::1;:8;:10::i;55423:91::-:0;55479:27;861:10;55499:6;55479:5;:27::i;:::-;55423:91;:::o;57143:119::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57218:2:::1;57211:4;:9;57203:30;;;::::0;-1:-1:-1;;;57203:30:0;;6329:2:1;57203:30:0::1;::::0;::::1;6311:21:1::0;6368:1;6348:18;;;6341:29;-1:-1:-1;;;6386:18:1;;;6379:38;6434:18;;57203:30:0::1;6127:331:1::0;57203:30:0::1;57244:3;:10:::0;57143:119::o;57541:114::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57619:12:::1;:28:::0;;-1:-1:-1;;;;;;57619:28:0::1;-1:-1:-1::0;;;;;57619:28:0;;;::::1;::::0;;;::::1;::::0;;57541:114::o;55833:164::-;55910:46;55926:7;861:10;55949:6;55910:15;:46::i;:::-;55967:22;55973:7;55982:6;55967:5;:22::i;57001:61::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57046:8:::1;:6;:8::i;26375:147::-:0;26461:4;26485:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;26485:29:0;;;;;;;;;;;;;;;26375:147::o;38142:104::-;38198:13;38231:7;38224:14;;;;;:::i;57951:320::-;51272:21;:19;:21::i;:::-;32031:41:::1;25525:4;861:10:::0;26375:147;:::i;32031:41::-:1;32026:114;;861:10:::0;32115:12:::1;781:98:::0;32026:114:::1;58049:1:::2;58025:21;:25;58017:53;;;::::0;-1:-1:-1;;;58017:53:0;;6665:2:1;58017:53:0::2;::::0;::::2;6647:21:1::0;6704:2;6684:18;;;6677:30;-1:-1:-1;;;6723:18:1;;;6716:45;6778:18;;58017:53:0::2;6463:339:1::0;58017:53:0::2;58089:9;::::0;-1:-1:-1;;;;;58089:9:0::2;58081:53;;;::::0;-1:-1:-1;;;58081:53:0;;7009:2:1;58081:53:0::2;::::0;::::2;6991:21:1::0;7048:2;7028:18;;;7021:30;-1:-1:-1;;;7067:18:1;;;7060:47;7124:18;;58081:53:0::2;6807:341:1::0;58081:53:0::2;58164:9;::::0;:48:::2;::::0;58146:12:::2;::::0;-1:-1:-1;;;;;58164:9:0::2;::::0;58186:21:::2;::::0;58146:12;58164:48;58146:12;58164:48;58186:21;58164:9;:48:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58145:67;;;58231:7;58223:40;;;::::0;-1:-1:-1;;;58223:40:0;;7565:2:1;58223:40:0::2;::::0;::::2;7547:21:1::0;7604:2;7584:18;;;7577:30;-1:-1:-1;;;7623:18:1;;;7616:50;7683:18;;58223:40:0::2;7363:344:1::0;58223:40:0::2;58006:265;51316:20:::0;50710:1;51836:7;:22;51653:213;42475:436;42568:4;861:10;42568:4;42651:25;861:10;42668:7;42651:9;:25::i;:::-;42624:52;;42715:15;42695:16;:35;;42687:85;;;;-1:-1:-1;;;42687:85:0;;7914:2:1;42687:85:0;;;7896:21:1;7953:2;7933:18;;;7926:30;7992:34;7972:18;;;7965:62;-1:-1:-1;;;8043:18:1;;;8036:35;8088:19;;42687:85:0;7712:401:1;42687:85:0;42808:60;42817:5;42824:7;42852:15;42833:16;:34;42808:8;:60::i;39556:193::-;39635:4;861:10;39691:28;861:10;39708:2;39712:6;39691:9;:28::i;57663:170::-;32031:41;25525:4;861:10;26375:147;:::i;32031:41::-;32026:114;;861:10;32115:12;781:98;32026:114;57769:26:::1;:56:::0;;-1:-1:-1;;;;;;57769:56:0::1;-1:-1:-1::0;;;;;57769:56:0;;;::::1;::::0;;;::::1;::::0;;57663:170::o;28783:149::-;27976:7;28003:12;;;:6;:12;;;;;:22;;;25971:16;25982:4;25971:10;:16::i;:::-;28898:26:::1;28910:4;28916:7;28898:11;:26::i;39812:151::-:0;-1:-1:-1;;;;;39928:18:0;;;39901:7;39928:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;39812:151::o;46468:346::-;-1:-1:-1;;;;;46570:19:0;;46562:68;;;;-1:-1:-1;;;46562:68:0;;8320:2:1;46562:68:0;;;8302:21:1;8359:2;8339:18;;;8332:30;8398:34;8378:18;;;8371:62;-1:-1:-1;;;8449:18:1;;;8442:34;8493:19;;46562:68:0;8118:400:1;46562:68:0;-1:-1:-1;;;;;46649:21:0;;46641:68;;;;-1:-1:-1;;;46641:68:0;;8725:2:1;46641:68:0;;;8707:21:1;8764:2;8744:18;;;8737:30;8803:34;8783:18;;;8776:62;-1:-1:-1;;;8854:18:1;;;8847:32;8896:19;;46641:68:0;8523:398:1;46641:68:0;-1:-1:-1;;;;;46722:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;46774:32;;1736:25:1;;;46774:32:0;;1709:18:1;46774:32:0;;;;;;;46468:346;;;:::o;51352:293::-;50754:1;51486:7;;:19;51478:63;;;;-1:-1:-1;;;51478:63:0;;9128:2:1;51478:63:0;;;9110:21:1;9167:2;9147:18;;;9140:30;9206:33;9186:18;;;9179:61;9257:18;;51478:63:0;8926:355:1;51478:63:0;50754:1;51619:7;:18;51352:293::o;54008:108::-;53920:7;;;;54078:9;54070:38;;;;-1:-1:-1;;;54070:38:0;;9488:2:1;54070:38:0;;;9470:21:1;9527:2;9507:18;;;9500:30;-1:-1:-1;;;9546:18:1;;;9539:46;9602:18;;54070:38:0;9286:340:1;58677:487:0;58716:20;58738;58773:9;;58771:11;;;;;:::i;:::-;;;;-1:-1:-1;;58808:11:0;;58845;;58884:14;;58871:9;;58808:11;;-1:-1:-1;58845:11:0;;58871:27;58867:290;;58959:1;58935:16;;58954:1;58935:20;;;;:::i;:::-;58934:26;;;;:::i;:::-;58915:16;:45;;;58975:14;:34;;:14;;:34;;58915:45;;58975:34;:::i;:::-;;;;-1:-1:-1;;59026:5:0;59024:7;;59026:5;;59024:7;;;:::i;:::-;;;;-1:-1:-1;59061:11:0;;59081:2;;59061:16;;59075:2;59061:16;:::i;:::-;59060:23;;;;:::i;:::-;59046:11;:37;59131:14;;59113;56500:8;59113:7;:14;:::i;:::-;59112:33;;;;:::i;:::-;59098:11;:47;58867:290;58677:487;;:::o;44474:548::-;-1:-1:-1;;;;;44558:21:0;;44550:65;;;;-1:-1:-1;;;44550:65:0;;10368:2:1;44550:65:0;;;10350:21:1;10407:2;10387:18;;;10380:30;10446:33;10426:18;;;10419:61;10497:18;;44550:65:0;10166:355:1;44550:65:0;44628:49;44657:1;44661:7;44670:6;44628:20;:49::i;:::-;44706:6;44690:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;44861:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;44916:37;1736:25:1;;;44916:37:0;;1709:18:1;44916:37:0;;;;;;;29487:218;;:::o;47105:419::-;47206:24;47233:25;47243:5;47250:7;47233:9;:25::i;:::-;47206:52;;-1:-1:-1;;47273:16:0;:37;47269:248;;47355:6;47335:16;:26;;47327:68;;;;-1:-1:-1;;;47327:68:0;;10728:2:1;47327:68:0;;;10710:21:1;10767:2;10747:18;;;10740:30;10806:31;10786:18;;;10779:59;10855:18;;47327:68:0;10526:353:1;47327:68:0;47439:51;47448:5;47455:7;47483:6;47464:16;:25;47439:8;:51::i;:::-;47195:329;47105:419;;;:::o;59172:494::-;59272:7;;-1:-1:-1;;;;;59266:13:0;;;59272:7;;59266:13;:21;;;;-1:-1:-1;59283:4:0;;-1:-1:-1;;;59283:4:0;;;;59266:21;59262:109;;;59330:15;;59312;:33;59304:55;;;;-1:-1:-1;;;59304:55:0;;11086:2:1;59304:55:0;;;11068:21:1;11125:1;11105:18;;;11098:29;-1:-1:-1;;;11143:18:1;;;11136:39;11192:18;;59304:55:0;10884:332:1;59304:55:0;59395:8;;-1:-1:-1;;;;;59387:16:0;;;59395:8;;59387:16;:52;;;;-1:-1:-1;59413:26:0;;-1:-1:-1;;;;;59407:32:0;;;59413:26;;59407:32;;59387:52;:63;;;;;59449:1;59443:3;;:7;59387:63;59383:232;;;59467:17;59504:3;59497;;59488:6;:12;;;;:::i;:::-;59487:20;;;;:::i;:::-;59467:40;-1:-1:-1;59522:19:0;59467:40;59522:19;;:::i;:::-;;;59556:47;59572:4;59586;59593:9;59556:15;:47::i;:::-;59452:163;59383:232;59625:33;59641:4;59647:2;59651:6;59625:15;:33::i;26826:105::-;26893:30;26904:4;861:10;26893;:30::i;31084:238::-;31168:22;31176:4;31182:7;31168;:22::i;:::-;31163:152;;31207:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31207:29:0;;;;;;;;;:36;;-1:-1:-1;;31207:36:0;31239:4;31207:36;;;31290:12;861:10;;781:98;31290:12;-1:-1:-1;;;;;31263:40:0;31281:7;-1:-1:-1;;;;;31263:40:0;31275:4;31263:40;;;;;;;;;;31084:238;;:::o;31502:239::-;31586:22;31594:4;31600:7;31586;:22::i;:::-;31582:152;;;31657:5;31625:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31625:29:0;;;;;;;;;;:37;;-1:-1:-1;;31625:37:0;;;31682:40;861:10;;31625:12;;31682:40;;31657:5;31682:40;31502:239;;:::o;54704:120::-;53713:16;:14;:16::i;:::-;54763:7:::1;:15:::0;;-1:-1:-1;;54763:15:0::1;::::0;;54794:22:::1;861:10:::0;54803:12:::1;54794:22;::::0;-1:-1:-1;;;;;3725:32:1;;;3707:51;;3695:2;3680:18;54794:22:0::1;;;;;;;54704:120::o:0;45355:675::-;-1:-1:-1;;;;;45439:21:0;;45431:67;;;;-1:-1:-1;;;45431:67:0;;11556:2:1;45431:67:0;;;11538:21:1;11595:2;11575:18;;;11568:30;11634:34;11614:18;;;11607:62;-1:-1:-1;;;11685:18:1;;;11678:31;11726:19;;45431:67:0;11354:397:1;45431:67:0;45511:49;45532:7;45549:1;45553:6;45511:20;:49::i;:::-;-1:-1:-1;;;;;45598:18:0;;45573:22;45598:18;;;;;;;;;;;45635:24;;;;45627:71;;;;-1:-1:-1;;;45627:71:0;;11958:2:1;45627:71:0;;;11940:21:1;11997:2;11977:18;;;11970:30;12036:34;12016:18;;;12009:62;-1:-1:-1;;;12087:18:1;;;12080:32;12129:19;;45627:71:0;11756:398:1;45627:71:0;-1:-1:-1;;;;;45734:18:0;;:9;:18;;;;;;;;;;;45755:23;;;45734:44;;45873:12;:22;;;;;;;45924:37;1736:25:1;;;45734:9:0;;:18;45924:37;;1709:18:1;45924:37:0;;;;;;;28343:147;;;:::o;54445:118::-;53454:19;:17;:19::i;:::-;54505:7:::1;:14:::0;;-1:-1:-1;;54505:14:0::1;54515:4;54505:14;::::0;;54535:20:::1;54542:12;861:10:::0;;781:98;59674:167;53454:19;:17;:19::i;43381:806::-;-1:-1:-1;;;;;43478:18:0;;43470:68;;;;-1:-1:-1;;;43470:68:0;;12361:2:1;43470:68:0;;;12343:21:1;12400:2;12380:18;;;12373:30;12439:34;12419:18;;;12412:62;-1:-1:-1;;;12490:18:1;;;12483:35;12535:19;;43470:68:0;12159:401:1;43470:68:0;-1:-1:-1;;;;;43557:16:0;;43549:64;;;;-1:-1:-1;;;43549:64:0;;12767:2:1;43549:64:0;;;12749:21:1;12806:2;12786:18;;;12779:30;12845:34;12825:18;;;12818:62;-1:-1:-1;;;12896:18:1;;;12889:33;12939:19;;43549:64:0;12565:399:1;43549:64:0;43626:38;43647:4;43653:2;43657:6;43626:20;:38::i;:::-;-1:-1:-1;;;;;43699:15:0;;43677:19;43699:15;;;;;;;;;;;43733:21;;;;43725:72;;;;-1:-1:-1;;;43725:72:0;;13171:2:1;43725:72:0;;;13153:21:1;13210:2;13190:18;;;13183:30;13249:34;13229:18;;;13222:62;-1:-1:-1;;;13300:18:1;;;13293:36;13346:19;;43725:72:0;12969:402:1;43725:72:0;-1:-1:-1;;;;;43833:15:0;;;:9;:15;;;;;;;;;;;43851:20;;;43833:38;;44051:13;;;;;;;;;;:23;;;;;;44103:26;;1736:25:1;;;44051:13:0;;44103:26;;1709:18:1;44103:26:0;;;;;;;44142:37;28343:147;27221:492;27310:22;27318:4;27324:7;27310;:22::i;:::-;27305:401;;27498:28;27518:7;27498:19;:28::i;:::-;27599:38;27627:4;27634:2;27599:19;:38::i;:::-;27403:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27403:257:0;;;;;;;;;;-1:-1:-1;;;27349:345:0;;;;;;;:::i;54193:108::-;53920:7;;;;54252:41;;;;-1:-1:-1;;;54252:41:0;;14395:2:1;54252:41:0;;;14377:21:1;14434:2;14414:18;;;14407:30;-1:-1:-1;;;14453:18:1;;;14446:50;14513:18;;54252:41:0;14193:344:1;17962:151:0;18020:13;18053:52;-1:-1:-1;;;;;18065:22:0;;15837:2;17358:447;17433:13;17459:19;17491:10;17495:6;17491:1;:10;:::i;:::-;:14;;17504:1;17491:14;:::i;:::-;17481:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17481:25:0;;17459:47;;-1:-1:-1;;;17517:6:0;17524:1;17517:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17517:15:0;;;;;;;;;-1:-1:-1;;;17543:6:0;17550:1;17543:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17543:15:0;;;;;;;;-1:-1:-1;17574:9:0;17586:10;17590:6;17586:1;:10;:::i;:::-;:14;;17599:1;17586:14;:::i;:::-;17574:26;;17569:131;17606:1;17602;:5;17569:131;;;-1:-1:-1;;;17650:5:0;17658:3;17650:11;17641:21;;;;;;;:::i;:::-;;;;17629:6;17636:1;17629:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;17629:33:0;;;;;;;;-1:-1:-1;17687:1:0;17677:11;;;;;17609:3;;;:::i;:::-;;;17569:131;;;-1:-1:-1;17718:10:0;;17710:55;;;;-1:-1:-1;;;17710:55:0;;15149:2:1;17710:55:0;;;15131:21:1;;;15168:18;;;15161:30;15227:34;15207:18;;;15200:62;15279:18;;17710:55:0;14947:356:1;17710:55:0;17790:6;17358:447;-1:-1:-1;;;17358:447:0:o;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;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:396::-;901:2;890:9;883:21;864:4;933:6;927:13;976:6;971:2;960:9;956:18;949:34;992:79;1064:6;1059:2;1048:9;1044:18;1039:2;1031:6;1027:15;992:79;:::i;:::-;1132:2;1111:15;-1:-1:-1;;1107:29:1;1092:45;;;;1139:2;1088:54;;752:396;-1:-1:-1;;752:396:1:o;1153:173::-;1221:20;;-1:-1:-1;;;;;1270:31:1;;1260:42;;1250:70;;1316:1;1313;1306:12;1250:70;1153:173;;;:::o;1331:254::-;1399:6;1407;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;1499:29;1518:9;1499:29;:::i;:::-;1489:39;1575:2;1560:18;;;;1547:32;;-1:-1:-1;;;1331:254:1:o;1772:328::-;1849:6;1857;1865;1918:2;1906:9;1897:7;1893:23;1889:32;1886:52;;;1934:1;1931;1924:12;1886:52;1957:29;1976:9;1957:29;:::i;:::-;1947:39;;2005:38;2039:2;2028:9;2024:18;2005:38;:::i;:::-;1995:48;;2090:2;2079:9;2075:18;2062:32;2052:42;;1772:328;;;;;:::o;2105:180::-;2164:6;2217:2;2205:9;2196:7;2192:23;2188:32;2185:52;;;2233:1;2230;2223:12;2185:52;-1:-1:-1;2256:23:1;;2105:180;-1:-1:-1;2105:180:1:o;2472:254::-;2540:6;2548;2601:2;2589:9;2580:7;2576:23;2572:32;2569:52;;;2617:1;2614;2607:12;2569:52;2653:9;2640:23;2630:33;;2682:38;2716:2;2705:9;2701:18;2682:38;:::i;:::-;2672:48;;2472:254;;;;;:::o;2920:260::-;2988:6;2996;3049:2;3037:9;3028:7;3024:23;3020:32;3017:52;;;3065:1;3062;3055:12;3017:52;3088:29;3107:9;3088:29;:::i;:::-;3078:39;;3136:38;3170:2;3159:9;3155:18;3136:38;:::i;3185:186::-;3244:6;3297:2;3285:9;3276:7;3272:23;3268:32;3265:52;;;3313:1;3310;3303:12;3265:52;3336:29;3355:9;3336:29;:::i;3769:380::-;3848:1;3844:12;;;;3891;;;3912:61;;3966:4;3958:6;3954:17;3944:27;;3912:61;4019:2;4011:6;4008:14;3988:18;3985:38;3982:161;;4065:10;4060:3;4056:20;4053:1;4046:31;4100:4;4097:1;4090:15;4128:4;4125:1;4118:15;3982:161;;3769:380;;;:::o;5449:127::-;5510:10;5505:3;5501:20;5498:1;5491:31;5541:4;5538:1;5531:15;5565:4;5562:1;5555:15;5581:125;5646:9;;;5667:10;;;5664:36;;;5680:18;;:::i;9631:135::-;9670:3;9691:17;;;9688:43;;9711:18;;:::i;:::-;-1:-1:-1;9758:1:1;9747:13;;9631:135::o;9771:168::-;9844:9;;;9875;;9892:15;;;9886:22;;9872:37;9862:71;;9913:18;;:::i;9944:217::-;9984:1;10010;10000:132;;10054:10;10049:3;10045:20;10042:1;10035:31;10089:4;10086:1;10079:15;10117:4;10114:1;10107:15;10000:132;-1:-1:-1;10146:9:1;;9944:217::o;11221:128::-;11288:9;;;11309:11;;;11306:37;;;11323:18;;:::i;13376:812::-;13787:25;13782:3;13775:38;13757:3;13842:6;13836:13;13858:75;13926:6;13921:2;13916:3;13912:12;13905:4;13897:6;13893:17;13858:75;:::i;:::-;-1:-1:-1;;;13992:2:1;13952:16;;;13984:11;;;13977:40;14042:13;;14064:76;14042:13;14126:2;14118:11;;14111:4;14099:17;;14064:76;:::i;:::-;14160:17;14179:2;14156:26;;13376:812;-1:-1:-1;;;;13376:812:1:o;14542:127::-;14603:10;14598:3;14594:20;14591:1;14584:31;14634:4;14631:1;14624:15;14658:4;14655:1;14648:15;14674:127;14735:10;14730:3;14726:20;14723:1;14716:31;14766:4;14763:1;14756:15;14790:4;14787:1;14780:15;14806:136;14845:3;14873:5;14863:39;;14882:18;;:::i;:::-;-1:-1:-1;;;14918:18:1;;14806:136::o
Swarm Source
ipfs://2d7105dd8bd82be3fd6f14c230d6c28c8c1f13cf6c0562857409dfadb56ebd1c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.