Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
VoyVesting
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-01-03 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.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) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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 10, 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 * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.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 `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); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(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: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.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/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: EnvoyNew/Polygon/VoyVesting.sol pragma solidity ^0.8.0; interface IVoyToken { function mint(address to, uint256 amount) external; } contract VoyVesting is AccessControl { bytes32 public constant VESTER_ROLE = keccak256("VESTER_ROLE"); using SafeERC20 for IERC20; struct User { bool claimed; uint256 totalLocked; } mapping(address => User) public users; uint256 public percentageRewards = 3; //3% in total for the 3 months uint256 public vestingStartDate; uint256 public vestingEndDate; uint256 public totalLockedAmount; uint256 public totalUnlockedAmount; uint256 public totalRewardsClaimed; uint256 public immutable vestingPeriod = 90; //90 days IERC20 public immutable voyToken; modifier whenStartedVestingSeason() { require(vestingEndDate > 0, "Voy - Vesting: Season not started yet!"); _; } modifier whenNotStartedVestingSeason() { require(vestingEndDate == 0, "Voy - Vesting: Season already started!"); _; } modifier whenFinishedVestingPeriod() { require(block.timestamp > vestingEndDate, "Voy - Vesting: Vesting Season not finished yet"); _; } modifier onlyUser() { require(users[msg.sender].totalLocked > 0, "Voy - Vesting: Not Vester"); _; } event VestingStarted(address indexed user, uint256 amount); event PercentageRewardsUpdated(address indexed _owner, uint256 _percentage); event Claim(address indexed _userAddress, uint256 _lockedAmount, uint256 _rewards); constructor(IERC20 _voyToken) { voyToken = _voyToken; _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(VESTER_ROLE, msg.sender); } // =============================== User Functions =============================== function claim() external whenFinishedVestingPeriod onlyUser { User storage user = users[msg.sender]; require(user.claimed == false, "Already claimed"); uint256 rewards = calculateVestingRewardsForUser(msg.sender); user.claimed = true; voyToken.safeTransfer(msg.sender, user.totalLocked + rewards); totalUnlockedAmount += user.totalLocked; totalRewardsClaimed += rewards; emit Claim(msg.sender, user.totalLocked, rewards); } function totalDaysPassedSinceVesting(uint256 _endDate) public view returns(uint256) { if (vestingStartDate == 0) { return 0; } return (_endDate - vestingStartDate) / 60 / 60 / 24; } function calculateVestingRewards(uint256 _totalLocked, uint256 _totalDays) public view returns (uint256) { return (_totalDays * _totalLocked * percentageRewards / 100) / vestingPeriod; } function calculateVestingRewardsForUser(address _userAddress) public view returns (uint256) { User memory user = users[_userAddress]; if (user.totalLocked == 0 || user.claimed || vestingStartDate == 0) { return 0; } uint256 totalDays = totalDaysPassedSinceVesting(block.timestamp); if (totalDays > vestingPeriod) { totalDays = vestingPeriod; } return calculateVestingRewards(user.totalLocked, totalDays); } function calculateTotalRequiredToFunction() public view returns(uint256) { uint256 totalRewards = calculateVestingRewards(totalLockedAmount, vestingPeriod); return totalLockedAmount + totalRewards - totalRewardsClaimed - totalUnlockedAmount; } // =============================== Admin Functions =============================== function setPercentageRewards(uint56 _percentageRewards) external whenNotStartedVestingSeason onlyRole(DEFAULT_ADMIN_ROLE) { require(_percentageRewards > percentageRewards, "Can only increase"); percentageRewards = _percentageRewards; emit PercentageRewardsUpdated(msg.sender, _percentageRewards); } function addUsers(address[] calldata _userAddresses, uint256[] calldata _amounts) external whenNotStartedVestingSeason onlyRole(VESTER_ROLE) { require(_userAddresses.length == _amounts.length, "UserAddresses length is different with amounts"); for (uint256 i = 0; i < _userAddresses.length; i++) { _addUser(_userAddresses[i], _amounts[i]); } } function addUser(address _userAddress, uint256 _amount) external whenNotStartedVestingSeason onlyRole(VESTER_ROLE) { _addUser(_userAddress, _amount); } function _addUser(address _userAddress, uint256 _amount) private { require(_userAddress != address(0x0), "UserAddress is Zero"); require(_amount > 0, "Amount is Zero"); users[_userAddress].totalLocked += _amount; totalLockedAmount += _amount; } function startVestingSeason() external whenNotStartedVestingSeason onlyRole(DEFAULT_ADMIN_ROLE) { require(voyToken.balanceOf(address(this)) >= calculateTotalRequiredToFunction(), "Balance is not enough"); vestingStartDate = block.timestamp; vestingEndDate = block.timestamp + 3600 * 24 * vestingPeriod; emit VestingStarted(msg.sender, totalLockedAmount); } function withdraVoy(uint256 _amount) external onlyRole(DEFAULT_ADMIN_ROLE) { if (vestingEndDate > 0) { require (voyToken.balanceOf(address(this)) - _amount >= calculateTotalRequiredToFunction(), "Invalid amount"); } voyToken.safeTransfer(msg.sender, _amount); } function recoverETH(uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) { (bool sent, bytes memory data) = msg.sender.call{value: _amount}(""); require(sent, "Failed to send Ether"); } function getUserInfo(address _user) public view returns(bool, uint256, uint256) { return (users[_user].claimed, users[_user].totalLocked, calculateVestingRewardsForUser(_user)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_voyToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewards","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"PercentageRewardsUpdated","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestingStarted","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calculateTotalRequiredToFunction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalLocked","type":"uint256"},{"internalType":"uint256","name":"_totalDays","type":"uint256"}],"name":"calculateVestingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"calculateVestingRewardsForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"percentageRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint56","name":"_percentageRewards","type":"uint56"}],"name":"setPercentageRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startVestingSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"totalDaysPassedSinceVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnlockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"uint256","name":"totalLocked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraVoy","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526003600255605a6080523480156200001b57600080fd5b5060405162001b6038038062001b608339810160408190526200003e9162000131565b6001600160601b0319606082901b1660a0526200005d60003362000090565b620000897f64ed6499e2f5a7ea55dfd56da361bf9d48064843bb3891c36f1dabd9ba2461353362000090565b5062000163565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200012d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000ec3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000602082840312156200014457600080fd5b81516001600160a01b03811681146200015c57600080fd5b9392505050565b60805160a05160601c611995620001cb60003960008181610313015281816106e80152818161080f01528181610a9b0152610b730152600081816102d1015281816108e001528181610a1501528181610ce401528181610ebd0152610ee601526119956000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638b78dbc811610104578063ae5ad227116100a2578063d333555311610071578063d333555314610428578063d547741f1461043b578063d77998281461044e578063e7a648fc1461045757600080fd5b8063ae5ad227146103c8578063be256bfb146103ef578063ca12bf1c14610402578063d30171931461041557600080fd5b806391d14854116100de57806391d1485414610360578063a217fddf14610373578063a34b0f761461037b578063a87430ba1461038457600080fd5b80638b78dbc8146103065780638b9e02a61461030e5780638da2a6e31461034d57600080fd5b80634924a322116101715780636386c1c71161014b5780636386c1c71461029457806370abd732146102c45780637313ee5a146102cc5780637c43c95a146102f357600080fd5b80634924a3221461027a5780634e71d92d14610283578063579acacc1461028b57600080fd5b8063248a9ca3116101ad578063248a9ca3146102265780632f2ff15d1461024957806336568abe1461025e5780633db5a5241461027157600080fd5b806301ffc9a7146101d457806305a9f274146101fc5780631ee3281a14610213575b600080fd5b6101e76101e23660046116b7565b61046a565b60405190151581526020015b60405180910390f35b61020560055481565b6040519081526020016101f3565b610205610221366004611672565b6104a1565b610205610234366004611672565b60009081526020819052604090206001015490565b61025c61025736600461168b565b6104e7565b005b61025c61026c36600461168b565b610511565b61020560045481565b61020560065481565b61025c610594565b61020560035481565b6102a76102a236600461159f565b610788565b6040805193151584526020840192909252908201526060016101f3565b61025c6107c7565b6102057f000000000000000000000000000000000000000000000000000000000000000081565b61025c61030136600461171c565b610950565b610205610a0a565b6103357f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f3565b61025c61035b366004611672565b610a69565b6101e761036e36600461168b565b610b9a565b610205600081565b61020560075481565b6103b161039236600461159f565b6001602081905260009182526040909120805491015460ff9091169082565b6040805192151583526020830191909152016101f3565b6102057f64ed6499e2f5a7ea55dfd56da361bf9d48064843bb3891c36f1dabd9ba24613581565b61025c6103fd3660046115e4565b610bc3565b6102056104103660046116fa565b610ce0565b61025c6104233660046115ba565b610d39565b61025c610436366004611672565b610d8d565b61025c61044936600461168b565b610e30565b61020560025481565b61020561046536600461159f565b610e55565b60006001600160e01b03198216637965db0b60e01b148061049b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000600354600014156104b657506000919050565b6018603c80600354856104c991906118a8565b6104d39190611867565b6104dd9190611867565b61049b9190611867565b60008281526020819052604090206001015461050281610f1c565b61050c8383610f29565b505050565b6001600160a01b03811633146105865760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105908282610fad565b5050565b60045442116105fc5760405162461bcd60e51b815260206004820152602e60248201527f566f79202d2056657374696e673a2056657374696e6720536561736f6e206e6f60448201526d1d08199a5b9a5cda1959081e595d60921b606482015260840161057d565b336000908152600160208190526040909120015461065c5760405162461bcd60e51b815260206004820152601960248201527f566f79202d2056657374696e673a204e6f742056657374657200000000000000604482015260640161057d565b336000908152600160205260409020805460ff16156106af5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161057d565b60006106ba33610e55565b825460ff19166001908117845583015490915061070f9033906106de90849061184f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611012565b816001015460066000828254610725919061184f565b92505081905550806007600082825461073e919061184f565b90915550506001820154604080519182526020820183905233917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf791015b60405180910390a25050565b6001600160a01b0381166000908152600160208190526040822080549101548291829160ff909116906107ba86610e55565b9250925092509193909250565b600454156107e75760405162461bcd60e51b815260040161057d90611809565b60006107f281610f1c565b6107fa610a0a565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561085957600080fd5b505afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089191906116e1565b10156108d75760405162461bcd60e51b8152602060048201526015602482015274084c2d8c2dcc6ca40d2e640dcdee840cadcdeeaced605b1b604482015260640161057d565b426003556109087f000000000000000000000000000000000000000000000000000000000000000062015180611889565b610912904261184f565b60045560055460405190815233907f7b97dcefcb9fdae22321c09ae87ed7865e06d2477325d246f8f1ff039a701a3d9060200160405180910390a250565b600454156109705760405162461bcd60e51b815260040161057d90611809565b600061097b81610f1c565b6002548266ffffffffffffff16116109c95760405162461bcd60e51b815260206004820152601160248201527043616e206f6e6c7920696e63726561736560781b604482015260640161057d565b66ffffffffffffff8216600281905560405190815233907f357a05c065fa8691b48b6917a98cbe5d7da1dbfc8a10afaf7442a8dc2cb5c37f9060200161077c565b600080610a396005547f0000000000000000000000000000000000000000000000000000000000000000610ce0565b905060065460075482600554610a4f919061184f565b610a5991906118a8565b610a6391906118a8565b91505090565b6000610a7481610f1c565b60045415610b6657610a84610a0a565b6040516370a0823160e01b815230600482015283907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906116e1565b610b2791906118a8565b1015610b665760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161057d565b6105906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384611012565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60045415610be35760405162461bcd60e51b815260040161057d90611809565b7f64ed6499e2f5a7ea55dfd56da361bf9d48064843bb3891c36f1dabd9ba246135610c0d81610f1c565b838214610c735760405162461bcd60e51b815260206004820152602e60248201527f55736572416464726573736573206c656e67746820697320646966666572656e60448201526d74207769746820616d6f756e747360901b606482015260840161057d565b60005b84811015610cd857610cc6868683818110610c9357610c93611933565b9050602002016020810190610ca8919061159f565b858584818110610cba57610cba611933565b90506020020135611064565b80610cd081611902565b915050610c76565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000060646002548585610d149190611889565b610d1e9190611889565b610d289190611867565b610d329190611867565b9392505050565b60045415610d595760405162461bcd60e51b815260040161057d90611809565b7f64ed6499e2f5a7ea55dfd56da361bf9d48064843bb3891c36f1dabd9ba246135610d8381610f1c565b61050c8383611064565b6000610d9881610f1c565b6040516000908190339085908381818185875af1925050503d8060008114610ddc576040519150601f19603f3d011682016040523d82523d6000602084013e610de1565b606091505b509150915081610e2a5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161057d565b50505050565b600082815260208190526040902060010154610e4b81610f1c565b61050c8383610fad565b6001600160a01b03811660009081526001602081815260408084208151808301909252805460ff1615158252909201549082018190521580610e95575080515b80610ea05750600354155b15610eae5750600092915050565b6000610eb9426104a1565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610f0657507f00000000000000000000000000000000000000000000000000000000000000005b610f14826020015182610ce0565b949350505050565b610f26813361113e565b50565b610f338282610b9a565b610590576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610f693390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610fb78282610b9a565b15610590576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261050c908490611197565b6001600160a01b0382166110b05760405162461bcd60e51b81526020600482015260136024820152725573657241646472657373206973205a65726f60681b604482015260640161057d565b600081116110f15760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973205a65726f60901b604482015260640161057d565b6001600160a01b0382166000908152600160208190526040822001805483929061111c90849061184f565b925050819055508060056000828254611135919061184f565b90915550505050565b6111488282610b9a565b6105905761115581611269565b61116083602061127b565b604051602001611171929190611761565b60408051601f198184030181529082905262461bcd60e51b825261057d916004016117d6565b60006111ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114179092919063ffffffff16565b80519091501561050c578080602001905181019061120a9190611650565b61050c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161057d565b606061049b6001600160a01b03831660145b6060600061128a836002611889565b61129590600261184f565b67ffffffffffffffff8111156112ad576112ad611949565b6040519080825280601f01601f1916602001820160405280156112d7576020820181803683370190505b509050600360fc1b816000815181106112f2576112f2611933565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061132157611321611933565b60200101906001600160f81b031916908160001a9053506000611345846002611889565b61135090600161184f565b90505b60018111156113c8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061138457611384611933565b1a60f81b82828151811061139a5761139a611933565b60200101906001600160f81b031916908160001a90535060049490941c936113c1816118eb565b9050611353565b508315610d325760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161057d565b6060610f14848460008585600080866001600160a01b0316858760405161143e9190611745565b60006040518083038185875af1925050503d806000811461147b576040519150601f19603f3d011682016040523d82523d6000602084013e611480565b606091505b50915091506114918783838761149c565b979650505050505050565b60608315611508578251611501576001600160a01b0385163b6115015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161057d565b5081610f14565b610f14838381511561151d5781518083602001fd5b8060405162461bcd60e51b815260040161057d91906117d6565b80356001600160a01b038116811461154e57600080fd5b919050565b60008083601f84011261156557600080fd5b50813567ffffffffffffffff81111561157d57600080fd5b6020830191508360208260051b850101111561159857600080fd5b9250929050565b6000602082840312156115b157600080fd5b610d3282611537565b600080604083850312156115cd57600080fd5b6115d683611537565b946020939093013593505050565b600080600080604085870312156115fa57600080fd5b843567ffffffffffffffff8082111561161257600080fd5b61161e88838901611553565b9096509450602087013591508082111561163757600080fd5b5061164487828801611553565b95989497509550505050565b60006020828403121561166257600080fd5b81518015158114610d3257600080fd5b60006020828403121561168457600080fd5b5035919050565b6000806040838503121561169e57600080fd5b823591506116ae60208401611537565b90509250929050565b6000602082840312156116c957600080fd5b81356001600160e01b031981168114610d3257600080fd5b6000602082840312156116f357600080fd5b5051919050565b6000806040838503121561170d57600080fd5b50508035926020909101359150565b60006020828403121561172e57600080fd5b813566ffffffffffffff81168114610d3257600080fd5b600082516117578184602087016118bf565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516117998160178501602088016118bf565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117ca8160288401602088016118bf565b01602801949350505050565b60208152600082518060208401526117f58160408501602087016118bf565b601f01601f19169190910160400192915050565b60208082526026908201527f566f79202d2056657374696e673a20536561736f6e20616c726561647920737460408201526561727465642160d01b606082015260800190565b600082198211156118625761186261191d565b500190565b60008261188457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118a3576118a361191d565b500290565b6000828210156118ba576118ba61191d565b500390565b60005b838110156118da5781810151838201526020016118c2565b83811115610e2a5750506000910152565b6000816118fa576118fa61191d565b506000190190565b60006000198214156119165761191661191d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220100b31c8f332b7ee5c879a6cd6e2f72d41c0b53b8ef2a7372b710feba5b88a8f64736f6c63430008070033000000000000000000000000823bbb870b0eb86bd7ec0bcc98c84b46a0f99ac7
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000823bbb870b0eb86bd7ec0bcc98c84b46a0f99ac7
-----Decoded View---------------
Arg [0] : _voyToken (address): 0x823bbb870b0eb86bd7ec0bcc98c84b46a0f99ac7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000823bbb870b0eb86bd7ec0bcc98c84b46a0f99ac7
Deployed ByteCode Sourcemap
51322:5943:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23656:204;;;;;;:::i;:::-;;:::i;:::-;;;5655:14:1;;5648:22;5630:41;;5618:2;5603:18;23656:204:0;;;;;;;;51747:32;;;;;;;;;6425:25:1;;;6413:2;6398:18;51747:32:0;6279:177:1;53586:228:0;;;;;;:::i;:::-;;:::i;25479:131::-;;;;;;:::i;:::-;25553:7;25580:12;;;;;;;;;;:22;;;;25479:131;25920:147;;;;;;:::i;:::-;;:::i;:::-;;27064:218;;;;;;:::i;:::-;;:::i;51711:29::-;;;;;;51786:34;;;;;;53065:513;;;:::i;51673:31::-;;;;;;57069:193;;;;;;:::i;:::-;;:::i;:::-;;;;6166:14:1;;6159:22;6141:41;;6213:2;6198:18;;6191:34;;;;6241:18;;;6234:34;6129:2;6114:18;57069:193:0;5945:329:1;56129:401:0;;;:::i;51870:43::-;;;;;54924:333;;;;;;:::i;:::-;;:::i;54560:266::-;;;:::i;51930:32::-;;;;;;;;-1:-1:-1;;;;;5167:32:1;;;5149:51;;5137:2;5122:18;51930:32:0;5003:203:1;56538:306:0;;;;;;:::i;:::-;;:::i;23952:147::-;;;;;;:::i;:::-;;:::i;23057:49::-;;23102:4;23057:49;;51827:34;;;;;;51553:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5875:14:1;;5868:22;5850:41;;5922:2;5907:18;;5900:34;;;;5823:18;51553:37:0;5682:258:1;51366:62:0;;51404:24;51366:62;;55265:388;;;;;;:::i;:::-;;:::i;53822:200::-;;;;;;:::i;:::-;;:::i;55661:165::-;;;;;;:::i;:::-;;:::i;56852:209::-;;;;;;:::i;:::-;;:::i;26360:149::-;;;;;;:::i;:::-;;:::i;51599:36::-;;;;;;54030:522;;;;;;:::i;:::-;;:::i;23656:204::-;23741:4;-1:-1:-1;;;;;;23765:47:0;;-1:-1:-1;;;23765:47:0;;:87;;-1:-1:-1;;;;;;;;;;1891:40:0;;;23816:36;23758:94;23656:204;-1:-1:-1;;23656:204:0:o;53586:228::-;53661:7;53685:16;;53705:1;53685:21;53681:62;;;-1:-1:-1;53730:1:0;;53586:228;-1:-1:-1;53586:228:0:o;53681:62::-;53804:2;53799;53794;53774:16;;53763:8;:27;;;;:::i;:::-;53762:34;;;;:::i;:::-;:39;;;;:::i;:::-;:44;;;;:::i;25920:147::-;25553:7;25580:12;;;;;;;;;;:22;;;23548:16;23559:4;23548:10;:16::i;:::-;26034:25:::1;26045:4;26051:7;26034:10;:25::i;:::-;25920:147:::0;;;:::o;27064:218::-;-1:-1:-1;;;;;27160:23:0;;20945:10;27160:23;27152:83;;;;-1:-1:-1;;;27152:83:0;;12418:2:1;27152:83:0;;;12400:21:1;12457:2;12437:18;;;12430:30;12496:34;12476:18;;;12469:62;-1:-1:-1;;;12547:18:1;;;12540:45;12602:19;;27152:83:0;;;;;;;;;27248:26;27260:4;27266:7;27248:11;:26::i;:::-;27064:218;;:::o;53065:513::-;52337:14;;52319:15;:32;52311:91;;;;-1:-1:-1;;;52311:91:0;;9779:2:1;52311:91:0;;;9761:21:1;9818:2;9798:18;;;9791:30;9857:34;9837:18;;;9830:62;-1:-1:-1;;;9908:18:1;;;9901:44;9962:19;;52311:91:0;9577:410:1;52311:91:0;52475:10:::1;52501:1;52469:17:::0;;;:5:::1;:17;::::0;;;;;;;:29:::1;::::0;52461:71:::1;;;::::0;-1:-1:-1;;;52461:71:0;;9425:2:1;52461:71:0::1;::::0;::::1;9407:21:1::0;9464:2;9444:18;;;9437:30;9503:27;9483:18;;;9476:55;9548:18;;52461:71:0::1;9223:349:1::0;52461:71:0::1;53163:10:::2;53137:17;53157::::0;;;:5:::2;:17;::::0;;;;53195:12;;::::2;;:21;53187:49;;;::::0;-1:-1:-1;;;53187:49:0;;10609:2:1;53187:49:0::2;::::0;::::2;10591:21:1::0;10648:2;10628:18;;;10621:30;-1:-1:-1;;;10667:18:1;;;10660:45;10722:18;;53187:49:0::2;10407:339:1::0;53187:49:0::2;53249:15;53267:42;53298:10;53267:30;:42::i;:::-;53322:19:::0;;-1:-1:-1;;53322:19:0::2;53337:4;53322:19:::0;;::::2;::::0;;53388:16;::::2;::::0;53249:60;;-1:-1:-1;53354:61:0::2;::::0;53376:10:::2;::::0;53388:26:::2;::::0;53249:60;;53388:26:::2;:::i;:::-;-1:-1:-1::0;;;;;53354:8:0::2;:21;::::0;:61;:21:::2;:61::i;:::-;53451:4;:16;;;53428:19;;:39;;;;;;;:::i;:::-;;;;;;;;53501:7;53478:19;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53544:16:0::2;::::0;::::2;::::0;53526:44:::2;::::0;;13395:25:1;;;13451:2;13436:18;;13429:34;;;53532:10:0::2;::::0;53526:44:::2;::::0;13368:18:1;53526:44:0::2;;;;;;;;53126:452;;53065:513::o:0;57069:193::-;-1:-1:-1;;;;;57168:12:0;;57125:4;57168:12;;;:5;:12;;;;;;;:20;;57190:24;;;57125:4;;;;57168:20;;;;;57216:37;57174:5;57216:30;:37::i;:::-;57160:94;;;;;;57069:193;;;;;:::o;56129:401::-;52173:14;;:19;52165:70;;;;-1:-1:-1;;;52165:70:0;;;;;;;:::i;:::-;23102:4:::1;23548:16;23102:4:::0;23548:10:::1;:16::i;:::-;56281:34:::2;:32;:34::i;:::-;56244:33;::::0;-1:-1:-1;;;56244:33:0;;56271:4:::2;56244:33;::::0;::::2;5149:51:1::0;56244:8:0::2;-1:-1:-1::0;;;;;56244:18:0::2;::::0;::::2;::::0;5122::1;;56244:33:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;56236:105;;;::::0;-1:-1:-1;;;56236:105:0;;12068:2:1;56236:105:0::2;::::0;::::2;12050:21:1::0;12107:2;12087:18;;;12080:30;-1:-1:-1;;;12126:18:1;;;12119:51;12187:18;;56236:105:0::2;11866:345:1::0;56236:105:0::2;56373:15;56354:16;:34:::0;56434:25:::2;56446:13;56434:9;:25;:::i;:::-;56416:43;::::0;:15:::2;:43;:::i;:::-;56399:14;:60:::0;56504:17:::2;::::0;56477:45:::2;::::0;6425:25:1;;;56492:10:0::2;::::0;56477:45:::2;::::0;6413:2:1;6398:18;56477:45:0::2;;;;;;;52246:1:::1;56129:401::o:0;54924:333::-;52173:14;;:19;52165:70;;;;-1:-1:-1;;;52165:70:0;;;;;;;:::i;:::-;23102:4:::1;23548:16;23102:4:::0;23548:10:::1;:16::i;:::-;55087:17:::2;;55066:18;:38;;;55058:68;;;::::0;-1:-1:-1;;;55058:68:0;;10953:2:1;55058:68:0::2;::::0;::::2;10935:21:1::0;10992:2;10972:18;;;10965:30;-1:-1:-1;;;11011:18:1;;;11004:47;11068:18;;55058:68:0::2;10751:341:1::0;55058:68:0::2;55137:38;::::0;::::2;:17;:38:::0;;;55193:56:::2;::::0;13619:48:1;;;55218:10:0::2;::::0;55193:56:::2;::::0;13607:2:1;13592:18;55193:56:0::2;13474:199:1::0;54560:266:0;54624:7;54644:20;54667:57;54691:17;;54710:13;54667:23;:57::i;:::-;54644:80;;54799:19;;54777;;54762:12;54742:17;;:32;;;;:::i;:::-;:54;;;;:::i;:::-;:76;;;;:::i;:::-;54735:83;;;54560:266;:::o;56538:306::-;23102:4;23548:16;23102:4;23548:10;:16::i;:::-;56628:14:::1;::::0;:18;56624:160:::1;;56719:34;:32;:34::i;:::-;56672:33;::::0;-1:-1:-1;;;56672:33:0;;56699:4:::1;56672:33;::::0;::::1;5149:51:1::0;56708:7:0;;56672:8:::1;-1:-1:-1::0;;;;;56672:18:0::1;::::0;::::1;::::0;5122::1;;56672:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;:81;;56663:109;;;::::0;-1:-1:-1;;;56663:109:0;;8326:2:1;56663:109:0::1;::::0;::::1;8308:21:1::0;8365:2;8345:18;;;8338:30;-1:-1:-1;;;8384:18:1;;;8377:44;8438:18;;56663:109:0::1;8124:338:1::0;56663:109:0::1;56794:42;-1:-1:-1::0;;;;;56794:8:0::1;:21;56816:10;56828:7:::0;56794:21:::1;:42::i;23952:147::-:0;24038:4;24062:12;;;;;;;;;;;-1:-1:-1;;;;;24062:29:0;;;;;;;;;;;;;;;23952:147::o;55265:388::-;52173:14;;:19;52165:70;;;;-1:-1:-1;;;52165:70:0;;;;;;;:::i;:::-;51404:24:::1;23548:16;23559:4;23548:10;:16::i;:::-;55425:40:::0;;::::2;55417:99;;;::::0;-1:-1:-1;;;55417:99:0;;10194:2:1;55417:99:0::2;::::0;::::2;10176:21:1::0;10233:2;10213:18;;;10206:30;10272:34;10252:18;;;10245:62;-1:-1:-1;;;10323:18:1;;;10316:44;10377:19;;55417:99:0::2;9992:410:1::0;55417:99:0::2;55532:9;55527:119;55547:25:::0;;::::2;55527:119;;;55594:40;55603:14;;55618:1;55603:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55622:8;;55631:1;55622:11;;;;;;;:::i;:::-;;;;;;;55594:8;:40::i;:::-;55574:3:::0;::::2;::::0;::::2;:::i;:::-;;;;55527:119;;;;52246:1:::1;55265:388:::0;;;;:::o;53822:200::-;53918:7;54001:13;53994:3;53974:17;;53959:12;53946:10;:25;;;;:::i;:::-;:45;;;;:::i;:::-;:51;;;;:::i;:::-;53945:69;;;;:::i;:::-;53938:76;53822:200;-1:-1:-1;;;53822:200:0:o;55661:165::-;52173:14;;:19;52165:70;;;;-1:-1:-1;;;52165:70:0;;;;;;;:::i;:::-;51404:24:::1;23548:16;23559:4;23548:10;:16::i;:::-;55787:31:::2;55796:12;55810:7;55787:8;:31::i;56852:209::-:0;23102:4;23548:16;23102:4;23548:10;:16::i;:::-;56970:35:::1;::::0;56938:9:::1;::::0;;;56970:10:::1;::::0;56993:7;;56938:9;56970:35;56938:9;56970:35;56993:7;56970:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56937:68;;;;57024:4;57016:37;;;::::0;-1:-1:-1;;;57016:37:0;;8669:2:1;57016:37:0::1;::::0;::::1;8651:21:1::0;8708:2;8688:18;;;8681:30;-1:-1:-1;;;8727:18:1;;;8720:50;8787:18;;57016:37:0::1;8467:344:1::0;57016:37:0::1;56925:136;;56852:209:::0;;:::o;26360:149::-;25553:7;25580:12;;;;;;;;;;:22;;;23548:16;23559:4;23548:10;:16::i;:::-;26475:26:::1;26487:4;26493:7;26475:11;:26::i;54030:522::-:0;-1:-1:-1;;;;;54152:19:0;;54113:7;54152:19;;;:5;:19;;;;;;;;54133:38;;;;;;;;;;;;;;;;;;;;;;;;;;54196:21;;:37;;-1:-1:-1;54221:12:0;;54196:37;:62;;;-1:-1:-1;54237:16:0;;:21;54196:62;54192:103;;;-1:-1:-1;54282:1:0;;54030:522;-1:-1:-1;;54030:522:0:o;54192:103::-;54307:17;54327:44;54355:15;54327:27;:44::i;:::-;54307:64;;54398:13;54386:9;:25;54382:83;;;-1:-1:-1;54440:13:0;54382:83;54492:52;54516:4;:16;;;54534:9;54492:23;:52::i;:::-;54485:59;54030:522;-1:-1:-1;;;;54030:522:0:o;24403:105::-;24470:30;24481:4;20945:10;24470;:30::i;:::-;24403:105;:::o;28661:238::-;28745:22;28753:4;28759:7;28745;:22::i;:::-;28740:152;;28784:6;:12;;;;;;;;;;;-1:-1:-1;;;;;28784:29:0;;;;;;;;;:36;;-1:-1:-1;;28784:36:0;28816:4;28784:36;;;28867:12;20945:10;;20865:98;28867:12;-1:-1:-1;;;;;28840:40:0;28858:7;-1:-1:-1;;;;;28840:40:0;28852:4;28840:40;;;;;;;;;;28661:238;;:::o;29079:239::-;29163:22;29171:4;29177:7;29163;:22::i;:::-;29159:152;;;29234:5;29202:12;;;;;;;;;;;-1:-1:-1;;;;;29202:29:0;;;;;;;;;;:37;;-1:-1:-1;;29202:37:0;;;29259:40;20945:10;;29202:12;;29259:40;;29234:5;29259:40;29079:239;;:::o;47366:211::-;47510:58;;;-1:-1:-1;;;;;5403:32:1;;47510:58:0;;;5385:51:1;5452:18;;;;5445:34;;;47510:58:0;;;;;;;;;;5358:18:1;;;;47510:58:0;;;;;;;;-1:-1:-1;;;;;47510:58:0;-1:-1:-1;;;47510:58:0;;;47483:86;;47503:5;;47483:19;:86::i;55834:287::-;-1:-1:-1;;;;;55918:28:0;;55910:60;;;;-1:-1:-1;;;55910:60:0;;7978:2:1;55910:60:0;;;7960:21:1;8017:2;7997:18;;;7990:30;-1:-1:-1;;;8036:18:1;;;8029:49;8095:18;;55910:60:0;7776:343:1;55910:60:0;55999:1;55989:7;:11;55981:38;;;;-1:-1:-1;;;55981:38:0;;7635:2:1;55981:38:0;;;7617:21:1;7674:2;7654:18;;;7647:30;-1:-1:-1;;;7693:18:1;;;7686:44;7747:18;;55981:38:0;7433:338:1;55981:38:0;-1:-1:-1;;;;;56032:19:0;;;;;;:5;:19;;;;;;;:31;:42;;56067:7;;56032:19;:42;;56067:7;;56032:42;:::i;:::-;;;;;;;;56106:7;56085:17;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;55834:287:0:o;24798:492::-;24887:22;24895:4;24901:7;24887;:22::i;:::-;24882:401;;25075:28;25095:7;25075:19;:28::i;:::-;25176:38;25204:4;25211:2;25176:19;:38::i;:::-;24980:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24980:257:0;;;;;;;;;;-1:-1:-1;;;24926:345:0;;;;;;;:::i;50433:716::-;50857:23;50883:69;50911:4;50883:69;;;;;;;;;;;;;;;;;50891:5;-1:-1:-1;;;;;50883:27:0;;;:69;;;;;:::i;:::-;50967:17;;50857:95;;-1:-1:-1;50967:21:0;50963:179;;51064:10;51053:30;;;;;;;;;;;;:::i;:::-;51045:85;;;;-1:-1:-1;;;51045:85:0;;11657:2:1;51045:85:0;;;11639:21:1;11696:2;11676:18;;;11669:30;11735:34;11715:18;;;11708:62;-1:-1:-1;;;11786:18:1;;;11779:40;11836:19;;51045:85:0;11455:406:1;16987:151:0;17045:13;17078:52;-1:-1:-1;;;;;17090:22:0;;15142:2;16383:447;16458:13;16484:19;16516:10;16520:6;16516:1;:10;:::i;:::-;:14;;16529:1;16516:14;:::i;:::-;16506:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16506:25:0;;16484:47;;-1:-1:-1;;;16542:6:0;16549:1;16542:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16542:15:0;;;;;;;;;-1:-1:-1;;;16568:6:0;16575:1;16568:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16568:15:0;;;;;;;;-1:-1:-1;16599:9:0;16611:10;16615:6;16611:1;:10;:::i;:::-;:14;;16624:1;16611:14;:::i;:::-;16599:26;;16594:131;16631:1;16627;:5;16594:131;;;-1:-1:-1;;;16675:5:0;16683:3;16675:11;16666:21;;;;;;;:::i;:::-;;;;16654:6;16661:1;16654:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;16654:33:0;;;;;;;;-1:-1:-1;16712:1:0;16702:11;;;;;16634:3;;;:::i;:::-;;;16594:131;;;-1:-1:-1;16743:10:0;;16735:55;;;;-1:-1:-1;;;16735:55:0;;7274:2:1;16735:55:0;;;7256:21:1;;;7293:18;;;7286:30;7352:34;7332:18;;;7325:62;7404:18;;16735:55:0;7072:356:1;35970:229:0;36107:12;36139:52;36161:6;36169:4;36175:1;36178:12;36107;37378;37392:23;37419:6;-1:-1:-1;;;;;37419:11:0;37438:5;37445:4;37419:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37377:73;;;;37468:69;37495:6;37503:7;37512:10;37524:12;37468:26;:69::i;:::-;37461:76;37090:455;-1:-1:-1;;;;;;;37090:455:0:o;39663:644::-;39848:12;39877:7;39873:427;;;39905:17;;39901:290;;-1:-1:-1;;;;;33508:19:0;;;40115:60;;;;-1:-1:-1;;;40115:60:0;;11299:2:1;40115:60:0;;;11281:21:1;11338:2;11318:18;;;11311:30;11377:31;11357:18;;;11350:59;11426:18;;40115:60:0;11097:353:1;40115:60:0;-1:-1:-1;40212:10:0;40205:17;;39873:427;40255:33;40263:10;40275:12;41010:17;;:21;41006:388;;41242:10;41236:17;41299:15;41286:10;41282:2;41278:19;41271:44;41006:388;41369:12;41362:20;;-1:-1:-1;;;41362:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;403:18;392:30;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:186::-;623:6;676:2;664:9;655:7;651:23;647:32;644:52;;;692:1;689;682:12;644:52;715:29;734:9;715:29;:::i;755:254::-;823:6;831;884:2;872:9;863:7;859:23;855:32;852:52;;;900:1;897;890:12;852:52;923:29;942:9;923:29;:::i;:::-;913:39;999:2;984:18;;;;971:32;;-1:-1:-1;;;755:254:1:o;1014:773::-;1136:6;1144;1152;1160;1213:2;1201:9;1192:7;1188:23;1184:32;1181:52;;;1229:1;1226;1219:12;1181:52;1269:9;1256:23;1298:18;1339:2;1331:6;1328:14;1325:34;;;1355:1;1352;1345:12;1325:34;1394:70;1456:7;1447:6;1436:9;1432:22;1394:70;:::i;:::-;1483:8;;-1:-1:-1;1368:96:1;-1:-1:-1;1571:2:1;1556:18;;1543:32;;-1:-1:-1;1587:16:1;;;1584:36;;;1616:1;1613;1606:12;1584:36;;1655:72;1719:7;1708:8;1697:9;1693:24;1655:72;:::i;:::-;1014:773;;;;-1:-1:-1;1746:8:1;-1:-1:-1;;;;1014:773:1:o;1792:277::-;1859:6;1912:2;1900:9;1891:7;1887:23;1883:32;1880:52;;;1928:1;1925;1918:12;1880:52;1960:9;1954:16;2013:5;2006:13;1999:21;1992:5;1989:32;1979:60;;2035:1;2032;2025:12;2074:180;2133:6;2186:2;2174:9;2165:7;2161:23;2157:32;2154:52;;;2202:1;2199;2192:12;2154:52;-1:-1:-1;2225:23:1;;2074:180;-1:-1:-1;2074:180:1:o;2259:254::-;2327:6;2335;2388:2;2376:9;2367:7;2363:23;2359:32;2356:52;;;2404:1;2401;2394:12;2356:52;2440:9;2427:23;2417:33;;2469:38;2503:2;2492:9;2488:18;2469:38;:::i;:::-;2459:48;;2259:254;;;;;:::o;2518:286::-;2576:6;2629:2;2617:9;2608:7;2604:23;2600:32;2597:52;;;2645:1;2642;2635:12;2597:52;2671:23;;-1:-1:-1;;;;;;2723:32:1;;2713:43;;2703:71;;2770:1;2767;2760:12;2994:184;3064:6;3117:2;3105:9;3096:7;3092:23;3088:32;3085:52;;;3133:1;3130;3123:12;3085:52;-1:-1:-1;3156:16:1;;2994:184;-1:-1:-1;2994:184:1:o;3183:248::-;3251:6;3259;3312:2;3300:9;3291:7;3287:23;3283:32;3280:52;;;3328:1;3325;3318:12;3280:52;-1:-1:-1;;3351:23:1;;;3421:2;3406:18;;;3393:32;;-1:-1:-1;3183:248:1:o;3436:282::-;3494:6;3547:2;3535:9;3526:7;3522:23;3518:32;3515:52;;;3563:1;3560;3553:12;3515:52;3602:9;3589:23;3652:16;3645:5;3641:28;3634:5;3631:39;3621:67;;3684:1;3681;3674:12;3723:274;3852:3;3890:6;3884:13;3906:53;3952:6;3947:3;3940:4;3932:6;3928:17;3906:53;:::i;:::-;3975:16;;;;;3723:274;-1:-1:-1;;3723:274:1:o;4212:786::-;4623:25;4618:3;4611:38;4593:3;4678:6;4672:13;4694:62;4749:6;4744:2;4739:3;4735:12;4728:4;4720:6;4716:17;4694:62;:::i;:::-;-1:-1:-1;;;4815:2:1;4775:16;;;4807:11;;;4800:40;4865:13;;4887:63;4865:13;4936:2;4928:11;;4921:4;4909:17;;4887:63;:::i;:::-;4970:17;4989:2;4966:26;;4212:786;-1:-1:-1;;;;4212:786:1:o;6684:383::-;6833:2;6822:9;6815:21;6796:4;6865:6;6859:13;6908:6;6903:2;6892:9;6888:18;6881:34;6924:66;6983:6;6978:2;6967:9;6963:18;6958:2;6950:6;6946:15;6924:66;:::i;:::-;7051:2;7030:15;-1:-1:-1;;7026:29:1;7011:45;;;;7058:2;7007:54;;6684:383;-1:-1:-1;;6684:383:1:o;12632:402::-;12834:2;12816:21;;;12873:2;12853:18;;;12846:30;12912:34;12907:2;12892:18;;12885:62;-1:-1:-1;;;12978:2:1;12963:18;;12956:36;13024:3;13009:19;;12632:402::o;13678:128::-;13718:3;13749:1;13745:6;13742:1;13739:13;13736:39;;;13755:18;;:::i;:::-;-1:-1:-1;13791:9:1;;13678:128::o;13811:217::-;13851:1;13877;13867:132;;13921:10;13916:3;13912:20;13909:1;13902:31;13956:4;13953:1;13946:15;13984:4;13981:1;13974:15;13867:132;-1:-1:-1;14013:9:1;;13811:217::o;14033:168::-;14073:7;14139:1;14135;14131:6;14127:14;14124:1;14121:21;14116:1;14109:9;14102:17;14098:45;14095:71;;;14146:18;;:::i;:::-;-1:-1:-1;14186:9:1;;14033:168::o;14206:125::-;14246:4;14274:1;14271;14268:8;14265:34;;;14279:18;;:::i;:::-;-1:-1:-1;14316:9:1;;14206:125::o;14336:258::-;14408:1;14418:113;14432:6;14429:1;14426:13;14418:113;;;14508:11;;;14502:18;14489:11;;;14482:39;14454:2;14447:10;14418:113;;;14549:6;14546:1;14543:13;14540:48;;;-1:-1:-1;;14584:1:1;14566:16;;14559:27;14336:258::o;14599:136::-;14638:3;14666:5;14656:39;;14675:18;;:::i;:::-;-1:-1:-1;;;14711:18:1;;14599:136::o;14740:135::-;14779:3;-1:-1:-1;;14800:17:1;;14797:43;;;14820:18;;:::i;:::-;-1:-1:-1;14867:1:1;14856:13;;14740:135::o;14880:127::-;14941:10;14936:3;14932:20;14929:1;14922:31;14972:4;14969:1;14962:15;14996:4;14993:1;14986:15;15012:127;15073:10;15068:3;15064:20;15061:1;15054:31;15104:4;15101:1;15094:15;15128:4;15125:1;15118:15;15144:127;15205:10;15200:3;15196:20;15193:1;15186:31;15236:4;15233:1;15226:15;15260:4;15257:1;15250:15
Swarm Source
ipfs://100b31c8f332b7ee5c879a6cd6e2f72d41c0b53b8ef2a7372b710feba5b88a8f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.