More Info
Private Name Tags
Latest 25 from a total of 382 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Vested Tok... | 20529451 | 79 days ago | IN | 0 ETH | 0.00019179 | ||||
Claim Vested Tok... | 20222885 | 122 days ago | IN | 0 ETH | 0.00033175 | ||||
Claim Vested Tok... | 20207692 | 124 days ago | IN | 0 ETH | 0.00034728 | ||||
Claim Vested Tok... | 19616998 | 207 days ago | IN | 0 ETH | 0.00294717 | ||||
Claim Vested Tok... | 19614395 | 207 days ago | IN | 0 ETH | 0.00179684 | ||||
Claim Vested Tok... | 19579467 | 212 days ago | IN | 0 ETH | 0.00155794 | ||||
Claim Vested Tok... | 19579415 | 212 days ago | IN | 0 ETH | 0.00189454 | ||||
Claim Vested Tok... | 19572404 | 213 days ago | IN | 0 ETH | 0.00201986 | ||||
Claim Vested Tok... | 19513849 | 221 days ago | IN | 0 ETH | 0.00325061 | ||||
Claim Vested Tok... | 19482287 | 226 days ago | IN | 0 ETH | 0.00212454 | ||||
Claim Vested Tok... | 19457584 | 229 days ago | IN | 0 ETH | 0.00184799 | ||||
Claim Vested Tok... | 19424243 | 234 days ago | IN | 0 ETH | 0.00406006 | ||||
Claim Vested Tok... | 19416885 | 235 days ago | IN | 0 ETH | 0.00364602 | ||||
Claim Vested Tok... | 19407634 | 236 days ago | IN | 0 ETH | 0.00550277 | ||||
Claim Vested Tok... | 19394441 | 238 days ago | IN | 0 ETH | 0.00321734 | ||||
Claim Vested Tok... | 19394441 | 238 days ago | IN | 0 ETH | 0.00406826 | ||||
Claim Vested Tok... | 19357734 | 243 days ago | IN | 0 ETH | 0.00393646 | ||||
Claim Vested Tok... | 19329403 | 247 days ago | IN | 0 ETH | 0.00373747 | ||||
Claim Vested Tok... | 19324632 | 248 days ago | IN | 0 ETH | 0.0027212 | ||||
Claim Vested Tok... | 19309557 | 250 days ago | IN | 0 ETH | 0.00231626 | ||||
Claim Vested Tok... | 19303562 | 251 days ago | IN | 0 ETH | 0.00281679 | ||||
Claim Vested Tok... | 19271843 | 255 days ago | IN | 0 ETH | 0.00449944 | ||||
Claim Vested Tok... | 19258751 | 257 days ago | IN | 0 ETH | 0.00134937 | ||||
Claim Vested Tok... | 19252875 | 258 days ago | IN | 0 ETH | 0.0012151 | ||||
Claim Vested Tok... | 19239509 | 260 days ago | IN | 0 ETH | 0.0023894 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EmployeeTokenVesting
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-14 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // 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/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.7.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. It 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)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 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) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // 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/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.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 @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 contracts/EmployeeTokenVesting.sol // SPDX-License-Identifier: 1MIT pragma solidity ^0.8.13; /** * @dev A contract for vesting ASM ASTO tokens for ASM employees. * * There are two types of schedules based on DelayType. * - "Delay" schedules starts vesting tokens after a delay * and tokens are only claimable after the 1st week of the delay * period. * - "Cliff" schedules vests tokens during the cliff period but * they are unclaimable until the cliff has ended. * * The contract defining a tax-rate for schedules. Tax is reserved * in the contract vested tokens are claimed. * * The contract supports multiple vesting schedules for scenarios * when multiple schedules, tax-rates, updates are needed to be made. * * Schedules can be terminated any time after the last claimed date, * allowing tokens to be claimed until the termination timestamp. */ contract EmployeeTokenVesting is Ownable, Pausable { using SafeERC20 for IERC20; uint256 internal constant SECONDS_PER_WEEK = 1 weeks; enum DelayType { Delay, Cliff } struct VestingSchedule { uint256 startTime; uint256 amount; DelayType delayType; uint16 durationInWeeks; uint16 delayInWeeks; uint16 taxRate100; uint256 totalClaimed; uint256 totalTaxClaimed; uint256 terminationTime; } struct AddVestingScheduleInput { uint256 startTime; uint256 amount; address recipient; DelayType delayType; uint16 durationInWeeks; uint16 delayInWeeks; uint16 taxRate100; uint256 totalClaimed; uint256 totalTaxClaimed; } struct VestedTokens { uint256 amount; uint256 tax; } event VestingAdded( uint256 vestingId, uint256 startTime, uint256 amount, address indexed recipient, uint16 durationInWeeks, uint16 delayInWeeks, uint16 taxRate100, DelayType delayType, uint256 _totalClaimed, uint256 _totalTaxClaimed ); event VestingTokensClaimed(address indexed recipient, uint256 vestingId, uint256 amountClaimed, uint256 taxClaimed); event VestingRemoved(address indexed recipient, uint256 vestingId, uint256 amountVested, uint256 amountNotVested); event TaxWithdrawn(address indexed recipient, uint256 taxAmount); event TokenWithdrawn(address indexed recipient, uint256 tokenAmount); IERC20 public immutable token; mapping(address => mapping(uint256 => VestingSchedule)) public vestingSchedules; mapping(address => uint256) private vestingIds; uint256 public totalAllocatedAmount; uint256 public totalCollectedTax; address public proposedOwner; string constant INVALID_MULTISIG = "Invalid Multisig contract"; string constant INVALID_TOKEN = "Invalid Token contract"; string constant INSUFFICIENT_TOKEN_BALANCE = "Insufficient token balance"; string constant NO_TOKENS_VESTED_PER_WEEK = "No token vested per week"; string constant INVALID_START_TIME = "Invalid start time"; string constant INVALID_DURATION = "Invalid duration"; string constant INVALID_TAX_RATE = "Invlaid tax rate"; string constant INVALID_CLIFF_DURATION = "Invalid cliff duration"; string constant NO_ACTIVE_VESTINGS = "No active vestings"; string constant INVALID_VESTING_ID = "Invalid vestingId"; string constant NO_TOKENS_VESTED = "No tokens vested"; string constant TERMINATION_TIME_BEFORE_LAST_CLAIM = "Terminate before the last claim"; string constant TERMINATION_TIME_BEFORE_START_TIME = "Terminate before the start time"; string constant ERROR_CALLER_ALREADY_OWNER = "Already owner"; string constant ERROR_NOT_PROPOSED_OWNER = "Not proposed owner"; string constant MAX_ADD_LIMIT = "Can only add 30 max"; string constant NO_SHEDULES_TO_ADD = "No schedules to add"; string constant INVALID_PARTIAL_VESTING = "Total claimed more than amount"; constructor(IERC20 _token, address multisig) { require(address(multisig) != address(0), INVALID_MULTISIG); require(address(_token) != address(0), INVALID_TOKEN); token = _token; _transferOwnership(multisig); } /** * @notice Add a new vesting schedule for a recipient address. * for _delayType Cliff vesting, _durationInWeeks need be greater than _delayInWeeks. * * @param _recipient recipient of the vested tokens from the schedule * @param _startTime starting time for vesting schedule, including any delays * @param _amount amount to vest over the vesting duration * @param _durationInWeeks duration of the vesting schedule in weeks * @param _delayInWeeks delay/cliff of the vesting schedule in weeks * @param _taxRate100 tax rate, multiplied by 100 to allow fractionals * @param _delayType type of the schedule delay Delay/Cliff */ function addVestingSchedule( address _recipient, uint256 _startTime, uint256 _amount, uint16 _durationInWeeks, uint16 _delayInWeeks, uint16 _taxRate100, DelayType _delayType, uint256 _totalClaimed, uint256 _totalTaxClaimed ) public onlyOwner { uint256 availableBalance = token.balanceOf(address(this)) - totalAllocatedAmount; require(_amount <= availableBalance, INSUFFICIENT_TOKEN_BALANCE); require(_durationInWeeks > 0, INVALID_DURATION); require((_totalClaimed + _totalTaxClaimed) <= _amount, INVALID_PARTIAL_VESTING); uint256 amountVestedPerWeek = _amount / _durationInWeeks; require(amountVestedPerWeek > 0, NO_TOKENS_VESTED_PER_WEEK); require(_startTime > 0, INVALID_START_TIME); require(_taxRate100 <= 10000, INVALID_TAX_RATE); if (_delayType == DelayType.Cliff) { require(_durationInWeeks > _delayInWeeks, INVALID_CLIFF_DURATION); } VestingSchedule memory vesting = VestingSchedule({ startTime: _startTime, amount: _amount, durationInWeeks: _durationInWeeks, delayType: _delayType, delayInWeeks: _delayInWeeks, totalClaimed: _totalClaimed, totalTaxClaimed: _totalTaxClaimed, taxRate100: _taxRate100, terminationTime: 0 }); uint256 vestingId = vestingIds[_recipient]; require(vestingId < 100, "Maximum vesting schedules for recipient reached"); vestingSchedules[_recipient][vestingId] = vesting; vestingIds[_recipient] = vestingId + 1; emit VestingAdded( vestingId, vesting.startTime, _amount, _recipient, _durationInWeeks, _delayInWeeks, _taxRate100, _delayType, _totalClaimed, _totalTaxClaimed ); // If the schedule is already partially claimed, reduce that amout from the total totalAllocatedAmount += (_amount - grossClaimed(vesting)); } /** * @notice Add multiple vesting schedules. Refer to addVestingSchedule for indevidual argument reference. * @param schedules Array of schedules with max 30 elements. */ function addVestingSchedules(AddVestingScheduleInput[] calldata schedules) public onlyOwner { require(schedules.length <= 30, MAX_ADD_LIMIT); require(schedules.length > 0, NO_SHEDULES_TO_ADD); for (uint256 idx = 0; idx < schedules.length; ++idx) { addVestingSchedule( schedules[idx].recipient, schedules[idx].startTime, schedules[idx].amount, schedules[idx].durationInWeeks, schedules[idx].delayInWeeks, schedules[idx].taxRate100, schedules[idx].delayType, schedules[idx].totalClaimed, schedules[idx].totalTaxClaimed ); } } /** * @notice Get the vesting schedlue couunt per recipient. * @param _recipient recipient for vesting schedules. * @return uint256 count */ function getVestingCount(address _recipient) public view returns (uint256) { return vestingIds[_recipient]; } /** * @notice Calculate vesting claims of all schedules for recipient. * @param _recipient recipient for vesting schedules. * @return VestedTokens vested token amount and tax. */ function calculateTotalVestingClaim(address _recipient) public view returns (VestedTokens memory) { uint256 vestingCount = vestingIds[_recipient]; require(vestingCount > 0, NO_ACTIVE_VESTINGS); uint256 totalAmountVested; uint256 vestedTax; for (uint256 _vestingId = 0; _vestingId < vestingCount; ++_vestingId) { VestedTokens memory vested = calculateVestingClaim(_recipient, _vestingId); totalAmountVested += vested.amount; vestedTax += vested.tax; } return VestedTokens({amount: totalAmountVested, tax: vestedTax}); } /** * @notice Calculate vesting claim per vesting schedule. * @param _recipient recipient for vesting schedules. * @param _vestingId vesting schedule id (incrementing numnber based on count). * @return VestedTokens vested token amount and tax. */ function calculateVestingClaim(address _recipient, uint256 _vestingId) public view returns (VestedTokens memory) { VestingSchedule storage vestingSchedule = vestingSchedules[_recipient][_vestingId]; require(vestingSchedule.startTime > 0, INVALID_VESTING_ID); return _calculateVestingClaim(vestingSchedule); } /** * @notice Calculate vesting claim per vesting schedule. * @param vestingSchedule vesting schedule to calculate the vested amount. * @return VestedTokens vested token amount and tax. */ function _calculateVestingClaim(VestingSchedule storage vestingSchedule) internal view returns (VestedTokens memory) { uint256 grossAmountVested = _calculateVestingClaimAtTime(vestingSchedule, currentTime()); uint256 tax = calculateTax(grossAmountVested, vestingSchedule.taxRate100); return VestedTokens({amount: grossAmountVested - tax, tax: tax}); } /** * @notice Calculate the vesting claim at the time for a scedule. * @param vestingSchedule vesting schedule to calculate the vested amount. * @param _currentTime time to calculate the vesting on. * @return uint256 vested gross token amount. */ function _calculateVestingClaimAtTime(VestingSchedule storage vestingSchedule, uint256 _currentTime) internal view returns (uint256) { uint256 effectiveCurrentTime = vestingSchedule.terminationTime == 0 ? _currentTime : Math.min(_currentTime, vestingSchedule.terminationTime); if (effectiveCurrentTime < vestingSchedule.startTime) { return 0; } uint256 elapsedTime = effectiveCurrentTime - vestingSchedule.startTime; uint256 elapsedTimeInWeeks = elapsedTime / SECONDS_PER_WEEK; // in both Cliff and Delay, nothing can be vested until the delay period if (elapsedTimeInWeeks < vestingSchedule.delayInWeeks) { return 0; } // Cliifs are vested during the delay, Delays are added to the duration uint256 effectiveDuration = vestingSchedule.delayType == DelayType.Delay ? vestingSchedule.durationInWeeks + vestingSchedule.delayInWeeks : vestingSchedule.durationInWeeks; if (elapsedTimeInWeeks >= effectiveDuration) { uint256 remainingVesting = vestingSchedule.amount - grossClaimed(vestingSchedule); return remainingVesting; } else { // Cliifs are vested during the delay, Delays are added to the duration uint16 claimableWeeks = vestingSchedule.delayType == DelayType.Delay ? uint16(elapsedTimeInWeeks - vestingSchedule.delayInWeeks) : uint16(elapsedTimeInWeeks); uint256 amountVestedPerWeek = vestingSchedule.amount / vestingSchedule.durationInWeeks; uint256 claimableAmount = claimableWeeks * amountVestedPerWeek; // This happens if the shedule was already partially vested when its added. if (grossClaimed(vestingSchedule) > claimableAmount) { return 0; } uint256 amountVested = claimableAmount - grossClaimed(vestingSchedule); return amountVested; } } /** * @notice Claim vested tokens and send to recipient's address. * msg.sender is the recipient. * @dev Need to have atleast 1 active vesting, and vest at leat 1 token to be successful. */ function claimVestedTokens() external { require(!paused(), "claimVestedTokens() is not enabled"); uint256 vestingCount = vestingIds[msg.sender]; require(vestingCount > 0, NO_ACTIVE_VESTINGS); uint256 totalAmountVested; uint256 vestedTax; for (uint256 _vestingId = 0; _vestingId < vestingCount; ++_vestingId) { VestingSchedule storage vestingSchedule = vestingSchedules[msg.sender][_vestingId]; VestedTokens memory tokensVested = _calculateVestingClaim(vestingSchedule); vestingSchedule.totalClaimed = uint256(vestingSchedule.totalClaimed + tokensVested.amount); vestingSchedule.totalTaxClaimed = uint256(vestingSchedule.totalTaxClaimed + tokensVested.tax); totalAmountVested += tokensVested.amount; vestedTax += tokensVested.tax; } require(token.balanceOf(address(this)) >= totalAmountVested, NO_TOKENS_VESTED); totalCollectedTax += vestedTax; totalAllocatedAmount -= totalAmountVested; token.safeTransfer(msg.sender, totalAmountVested); emit VestingTokensClaimed(msg.sender, vestingCount, totalAmountVested, vestedTax); } /** * @notice Terminate vesting shedule by recipient and vestingId. * @param _recipient recipient for vesting schedules. * @param _vestingId vesting schedule id (incrementing numnber based on count). * @param _terminationTime time the shedule would terminate at. * * @dev Terminating time should be after start date and the last date vesing is claimed. */ function terminateVestingSchedule( address _recipient, uint256 _vestingId, uint256 _terminationTime ) external onlyOwner { VestingSchedule storage vestingSchedule = vestingSchedules[_recipient][_vestingId]; require(vestingSchedule.startTime > 0, INVALID_VESTING_ID); uint256 lastVestedTime = _calculateLastVestedTimestamp(vestingSchedule); require(_terminationTime >= lastVestedTime, TERMINATION_TIME_BEFORE_LAST_CLAIM); require(_terminationTime >= vestingSchedule.startTime, TERMINATION_TIME_BEFORE_START_TIME); uint256 grossAmountToBeVested = _calculateVestingClaimAtTime(vestingSchedule, _terminationTime); uint256 amountIneligibleForVesting = vestingSchedule.amount - (grossClaimed(vestingSchedule) + grossAmountToBeVested); vestingSchedule.terminationTime = _terminationTime; totalAllocatedAmount -= amountIneligibleForVesting; emit VestingRemoved(_recipient, _vestingId, grossAmountToBeVested, amountIneligibleForVesting); } function _calculateLastVestedTimestamp(VestingSchedule storage vestingSchedule) internal view returns (uint256) { if (vestingSchedule.totalClaimed == 0) { return vestingSchedule.startTime; } uint256 amountVestedPerWeek = vestingSchedule.amount / vestingSchedule.durationInWeeks; uint256 weeksClaimed = grossClaimed(vestingSchedule) / amountVestedPerWeek; uint256 effectiveDelayInWeeks = vestingSchedule.delayType == DelayType.Delay ? vestingSchedule.delayInWeeks : 0; return vestingSchedule.startTime + effectiveDelayInWeeks + (weeksClaimed * SECONDS_PER_WEEK); } function currentTime() public view virtual returns (uint256) { // solhint-disable-next-line not-rely-on-time return block.timestamp; } /** * @notice Calculate tokens vested per-week, for a schedule by vestingId * @param _recipient recipient for vesting schedules. * @param _vestingId vesting schedule id (incrementing numnber based on count). * @return VestedTokens vested tokens and tax per week. */ function tokensVestedPerWeek(address _recipient, uint256 _vestingId) public view returns (VestedTokens memory) { VestingSchedule storage vestingSchedule = vestingSchedules[_recipient][_vestingId]; require(vestingSchedule.startTime > 0, INVALID_VESTING_ID); uint256 gross = vestingSchedule.amount / vestingSchedule.durationInWeeks; uint256 tax = (gross * vestingSchedule.taxRate100) / 10000; return VestedTokens({amount: gross - tax, tax: tax}); } /** * @dev Calculate the gross amount including both claimed and tax. * @param vestingSchedule vesting schedule to calculate the gross claimed amount */ function grossClaimed(VestingSchedule memory vestingSchedule) internal pure returns (uint256) { return vestingSchedule.totalClaimed + vestingSchedule.totalTaxClaimed; } /** * @dev Calcualte tax for gross amount. * @param gross gross amount to be claimed * @param taxRate100 Percentage tax rate * 100 */ function calculateTax(uint256 gross, uint256 taxRate100) internal pure returns (uint256) { return (gross * taxRate100) / 10000; } /** * @notice Withdraw tax collected in the contract. * @param recipient recipient for vesting schedules. */ function withdrawTax(address recipient) external onlyOwner { require(recipient != address(0), INVALID_TOKEN); uint256 balance = token.balanceOf(address(this)); require(totalCollectedTax <= (balance - totalAllocatedAmount), INSUFFICIENT_TOKEN_BALANCE); uint256 taxClaimable = totalCollectedTax; totalCollectedTax = 0; totalAllocatedAmount -= taxClaimable; token.safeTransfer(recipient, taxClaimable); emit TaxWithdrawn(recipient, taxClaimable); } /** * @notice Withdraw tokens that are not allocated for a vesting schedule. * @param recipient recipient for vesting schedules. */ function withdrawUnAllocatedToken(address recipient) external onlyOwner { require(recipient != address(0), INVALID_TOKEN); uint256 balance = token.balanceOf(address(this)); uint256 unAllocatedAmount = balance - totalAllocatedAmount; require(unAllocatedAmount > 0, INSUFFICIENT_TOKEN_BALANCE); token.safeTransfer(recipient, unAllocatedAmount); emit TokenWithdrawn(recipient, unAllocatedAmount); } /** * @notice WARNING! withdraw tokens remaining in the contract. Used for migrating contracts. * @param recipient recipient for vesting schedules. * @param amount amount to withdraw from the contract. */ function withdrawToken(address recipient, uint256 amount) external onlyOwner { require(recipient != address(0), INVALID_TOKEN); uint256 balance = token.balanceOf(address(this)); require(amount <= balance, INSUFFICIENT_TOKEN_BALANCE); token.safeTransfer(recipient, amount); emit TokenWithdrawn(recipient, amount); } /** * @notice Propose a new owner of the contract. * @param _proposedOwner The proposed new owner of the contract. */ function proposeOwner(address _proposedOwner) external onlyOwner { require(msg.sender != _proposedOwner, ERROR_CALLER_ALREADY_OWNER); proposedOwner = _proposedOwner; } /** * @notice Claim ownership by calling the function as the proposed owner. */ function claimOwnership() external { require(address(proposedOwner) != address(0), INVALID_MULTISIG); require(msg.sender == proposedOwner, ERROR_NOT_PROPOSED_OWNER); emit OwnershipTransferred(owner(), proposedOwner); _transferOwnership(proposedOwner); proposedOwner = address(0); } /** * @notice Pause the claiming process */ function pause() external onlyOwner { _pause(); } /** * @notice Unpause the claiming process */ function unpause() external onlyOwner { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"multisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"TaxWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vestingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint16","name":"durationInWeeks","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"delayInWeeks","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"taxRate100","type":"uint16"},{"indexed":false,"internalType":"enum EmployeeTokenVesting.DelayType","name":"delayType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_totalClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalTaxClaimed","type":"uint256"}],"name":"VestingAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"vestingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountVested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountNotVested","type":"uint256"}],"name":"VestingRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"vestingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxClaimed","type":"uint256"}],"name":"VestingTokensClaimed","type":"event"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint16","name":"_durationInWeeks","type":"uint16"},{"internalType":"uint16","name":"_delayInWeeks","type":"uint16"},{"internalType":"uint16","name":"_taxRate100","type":"uint16"},{"internalType":"enum EmployeeTokenVesting.DelayType","name":"_delayType","type":"uint8"},{"internalType":"uint256","name":"_totalClaimed","type":"uint256"},{"internalType":"uint256","name":"_totalTaxClaimed","type":"uint256"}],"name":"addVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"enum EmployeeTokenVesting.DelayType","name":"delayType","type":"uint8"},{"internalType":"uint16","name":"durationInWeeks","type":"uint16"},{"internalType":"uint16","name":"delayInWeeks","type":"uint16"},{"internalType":"uint16","name":"taxRate100","type":"uint16"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"totalTaxClaimed","type":"uint256"}],"internalType":"struct EmployeeTokenVesting.AddVestingScheduleInput[]","name":"schedules","type":"tuple[]"}],"name":"addVestingSchedules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"calculateTotalVestingClaim","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"}],"internalType":"struct EmployeeTokenVesting.VestedTokens","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_vestingId","type":"uint256"}],"name":"calculateVestingClaim","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"}],"internalType":"struct EmployeeTokenVesting.VestedTokens","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVestedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"getVestingCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_proposedOwner","type":"address"}],"name":"proposeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_vestingId","type":"uint256"},{"internalType":"uint256","name":"_terminationTime","type":"uint256"}],"name":"terminateVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_vestingId","type":"uint256"}],"name":"tokensVestedPerWeek","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"}],"internalType":"struct EmployeeTokenVesting.VestedTokens","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocatedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCollectedTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingSchedules","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum EmployeeTokenVesting.DelayType","name":"delayType","type":"uint8"},{"internalType":"uint16","name":"durationInWeeks","type":"uint16"},{"internalType":"uint16","name":"delayInWeeks","type":"uint16"},{"internalType":"uint16","name":"taxRate100","type":"uint16"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"totalTaxClaimed","type":"uint256"},{"internalType":"uint256","name":"terminationTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawUnAllocatedToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002abe38038062002abe83398101604081905262000034916200019c565b6200003f3362000133565b6000805460ff60a01b1916905560408051808201909152601981527f496e76616c6964204d756c746973696720636f6e74726163740000000000000060208201526001600160a01b038216620000b35760405162461bcd60e51b8152600401620000aa9190620001db565b60405180910390fd5b5060408051808201909152601681527f496e76616c696420546f6b656e20636f6e74726163740000000000000000000060208201526001600160a01b038316620001125760405162461bcd60e51b8152600401620000aa9190620001db565b506001600160a01b0382166080526200012b8162000133565b505062000233565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200019957600080fd5b50565b60008060408385031215620001b057600080fd5b8251620001bd8162000183565b6020840151909250620001d08162000183565b809150509250929050565b600060208083528351808285015260005b818110156200020a57858101830151858201604001528201620001ec565b818111156200021d576000604083870101525b50601f01601f1916929092016040019392505050565b6080516128306200028e600039600081816103c4015281816106f3015281816107fd01528181610d590152818161144e01528181611526015281816117700152818161186b015281816119c00152611aaa01526128306000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806384490312116100de578063c21b6d1a11610097578063e74f3fbb11610071578063e74f3fbb14610391578063f2fde38b14610399578063fb7f3f3c146103ac578063fc0c546a146103bf57600080fd5b8063c21b6d1a1461034f578063d153b60c14610378578063d18e81b31461038b57600080fd5b806384490312146102e05780638456cb59146102f35780638da5cb5b146102fb5780639e281a9814610320578063ade47ff514610333578063b5ed298a1461033c57600080fd5b8063556400081161013057806355640008146102505780635c975abb146102675780636a331e1e14610284578063715018a6146102b25780637244fee6146102ba578063818b2986146102cd57600080fd5b80633f4ba83a1461017857806345626bd61461018257806348f1f86d1461020f5780634c75b707146102225780634e71e0c8146102355780635370f0891461023d575b600080fd5b6101806103e6565b005b6101f16101903660046123b3565b60016020818152600093845260408085209091529183529120805491810154600282015460038301546004840154600590940154929360ff83169361ffff610100850481169463010000008104821694600160281b90910490911692909189565b60405161020699989796959493929190612415565b60405180910390f35b61018061021d366004612469565b6103f8565b61018061023036600461249c565b61067e565b61018061086c565b61018061024b3660046124b7565b61099b565b61025960035481565b604051908152602001610206565b600054600160a01b900460ff166040519015158152602001610206565b61029761029236600461249c565b610bad565b60408051825181526020928301519281019290925201610206565b610180610c8b565b6102976102c83660046123b3565b610c9d565b6101806102db36600461254e565b610d2d565b6102976102ee3660046123b3565b6112d2565b6101806113c9565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610206565b61018061032e3660046123b3565b6113d9565b61025960045481565b61018061034a36600461249c565b611588565b61025961035d36600461249c565b6001600160a01b031660009081526002602052604090205490565b600554610308906001600160a01b031681565b42610259565b610180611600565b6101806103a736600461249c565b6118d2565b6101806103ba36600461249c565b61194b565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b6103ee611b0c565b6103f6611b66565b565b610400611b0c565b6001600160a01b0383166000908152600160209081526040808320858452825291829020805483518085019094526011845270125b9d985b1a59081d995cdd1a5b99d259607a1b9284019290925291906104765760405162461bcd60e51b815260040161046d919061260a565b60405180910390fd5b50600061048282611bbb565b9050808310156040518060400160405280601f81526020017f5465726d696e617465206265666f726520746865206c61737420636c61696d00815250906104dc5760405162461bcd60e51b815260040161046d919061260a565b50815460408051808201909152601f81527f5465726d696e617465206265666f7265207468652073746172742074696d65006020820152908410156105345760405162461bcd60e51b815260040161046d919061260a565b5060006105418385611cac565b6040805161012081018252855481526001808701546020830152600287015493945060009385936105ee939289929184019160ff1690811115610586576105866123dd565b6001811115610597576105976123dd565b8152600282015461ffff6101008204811660208401526301000000820481166040840152600160281b90910416606082015260038201546080820152600482015460a082015260059091015460c090910152611f11565b6105f89190612653565b8460010154610607919061266b565b90508484600501819055508060036000828254610624919061266b565b909155505060408051878152602081018490529081018290526001600160a01b038816907fc34759c11ae2635710f0e7f6a21d269f66ffef69086b9a32dd692eec56b44bf79060600160405180910390a250505050505050565b610686611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0382166106da5760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190612682565b905060035481610776919061266b565b60045411156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b815250906107cc5760405162461bcd60e51b815260040161046d919061260a565b506004805460009182905560038054919283926107ea90849061266b565b9091555061082490506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611f27565b826001600160a01b03167f7c92e98c5b2af24a95052353679ff5120823a95efc7ab8c5ffbd698449edbce28260405161085f91815260200190565b60405180910390a2505050565b60055460408051808201909152601981527f496e76616c6964204d756c746973696720636f6e7472616374000000000000006020820152906001600160a01b03166108ca5760405162461bcd60e51b815260040161046d919061260a565b506005546040805180820190915260128152712737ba10383937b837b9b2b21037bbb732b960711b6020820152906001600160a01b031633146109205760405162461bcd60e51b815260040161046d919061260a565b506005546001600160a01b031661093f6000546001600160a01b031690565b6001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600554610989906001600160a01b0316611f79565b600580546001600160a01b0319169055565b6109a3611b0c565b604080518082019091526013815272086c2dc40dedcd8f240c2c8c840666040dac2f606b1b6020820152601e8211156109ef5760405162461bcd60e51b815260040161046d919061260a565b50604080518082019091526013815272139bc81cd8da19591d5b195cc81d1bc8185919606a1b602082015281610a385760405162461bcd60e51b815260040161046d919061260a565b5060005b81811015610ba857610b98838383818110610a5957610a5961269b565b905061012002016040016020810190610a72919061249c565b848484818110610a8457610a8461269b565b9050610120020160000135858585818110610aa157610aa161269b565b9050610120020160200135868686818110610abe57610abe61269b565b905061012002016080016020810190610ad791906126b1565b878787818110610ae957610ae961269b565b9050610120020160a0016020810190610b0291906126b1565b888888818110610b1457610b1461269b565b9050610120020160c0016020810190610b2d91906126b1565b898989818110610b3f57610b3f61269b565b905061012002016060016020810190610b5891906126cc565b8a8a8a818110610b6a57610b6a61269b565b9050610120020160e001358b8b8b818110610b8757610b8761269b565b905061012002016101000135610d2d565b610ba1816126e7565b9050610a3c565b505050565b604080518082018252600080825260208083018290526001600160a01b0385168252600281529083902054835180850190945260128452714e6f206163746976652076657374696e677360701b91840191909152909181610c215760405162461bcd60e51b815260040161046d919061260a565b5060008060005b83811015610c71576000610c3c8783610c9d565b8051909150610c4b9085612653565b9350806020015183610c5d9190612653565b92505080610c6a906126e7565b9050610c28565b506040805180820190915291825260208201529392505050565b610c93611b0c565b6103f66000611f79565b604080518082018252600080825260208083018290526001600160a01b038616825260018152838220858352815290839020805484518086019095526011855270125b9d985b1a59081d995cdd1a5b99d259607a1b92850192909252919290610d195760405162461bcd60e51b815260040161046d919061260a565b50610d2381611fc9565b9150505b92915050565b610d35611b0c565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc49190612682565b610dce919061266b565b9050808811156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b81525090610e255760405162461bcd60e51b815260040161046d919061260a565b5060408051808201909152601081526f24b73b30b634b210323ab930ba34b7b760811b602082015261ffff8816610e6f5760405162461bcd60e51b815260040161046d919061260a565b5087610e7b8385612653565b11156040518060400160405280601e81526020017f546f74616c20636c61696d6564206d6f7265207468616e20616d6f756e74000081525090610ed15760405162461bcd60e51b815260040161046d919061260a565b506000610ee261ffff89168a612700565b9050600081116040518060400160405280601881526020017f4e6f20746f6b656e2076657374656420706572207765656b000000000000000081525090610f3c5760405162461bcd60e51b815260040161046d919061260a565b50604080518082019091526012815271496e76616c69642073746172742074696d6560701b60208201528a610f845760405162461bcd60e51b815260040161046d919061260a565b5060408051808201909152601081526f496e766c61696420746178207261746560801b602082015261271061ffff88161115610fd35760405162461bcd60e51b815260040161046d919061260a565b506001856001811115610fe857610fe86123dd565b03611047578661ffff168861ffff16116040518060400160405280601681526020017524b73b30b634b21031b634b33310323ab930ba34b7b760511b815250906110455760405162461bcd60e51b815260040161046d919061260a565b505b60006040518061012001604052808c81526020018b8152602001876001811115611073576110736123dd565b81526020018a61ffff1681526020018961ffff1681526020018861ffff168152602001868152602001858152602001600081525090506000600260008e6001600160a01b03166001600160a01b031681526020019081526020016000205490506064811061113b5760405162461bcd60e51b815260206004820152602f60248201527f4d6178696d756d2076657374696e67207363686564756c657320666f7220726560448201526e18da5c1a595b9d081c995858da1959608a1b606482015260840161046d565b6001600160a01b038d1660009081526001602081815260408084208585528252928390208551815590850151818301559184015160028301805486949360ff19909116908381811115611190576111906123dd565b02179055506060820151600282018054608085015160a086015161ffff908116600160281b0266ffff00000000001992821663010000000264ffff00000019929096166101009081029290921664ffffffff001990941693909317949094171617905560c0830151600383015560e083015160048301559091015160059091015561121c816001612653565b600260008f6001600160a01b03166001600160a01b03168152602001908152602001600020819055508c6001600160a01b03167f623e4a93286a4bc3ad27ac8c914256a7acc39060d4f94f24f2bebe441b966b108284600001518e8e8e8e8e8e8e60405161129299989796959493929190612722565b60405180910390a26112a382611f11565b6112ad908c61266b565b600360008282546112be9190612653565b909155505050505050505050505050505050565b604080518082018252600080825260208083018290526001600160a01b038616825260018152838220858352815290839020805484518086019095526011855270125b9d985b1a59081d995cdd1a5b99d259607a1b9285019290925291929061134e5760405162461bcd60e51b815260040161046d919061260a565b50600281015460018201546000916113709161010090910461ffff1690612700565b60028301549091506000906127109061139490600160281b900461ffff1684612777565b61139e9190612700565b9050604051806040016040528082846113b7919061266b565b81526020019190915295945050505050565b6113d1611b0c565b6103f6612033565b6113e1611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0383166114355760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190612682565b9050808211156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b815250906115185760405162461bcd60e51b815260040161046d919061260a565b5061154d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168484611f27565b826001600160a01b03167fa2bd9fcfcdba69f52bcd9a520846ad4bd685b187483f53efc42d035b2ddebff08360405161085f91815260200190565b611590611b0c565b60408051808201909152600d81526c20b63932b0b23c9037bbb732b960991b6020820152336001600160a01b038316036115dd5760405162461bcd60e51b815260040161046d919061260a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff16156116655760405162461bcd60e51b815260206004820152602260248201527f636c61696d566573746564546f6b656e732829206973206e6f7420656e61626c604482015261195960f21b606482015260840161046d565b3360009081526002602090815260409182902054825180840190935260128352714e6f206163746976652076657374696e677360701b9183019190915290816116c15760405162461bcd60e51b815260040161046d919061260a565b5060008060005b83811015611758573360009081526001602090815260408083208484529091528120906116f482611fc9565b8051600384015491925061170791612653565b6003830155602081015160048301546117209190612653565b600483015580516117319086612653565b94508060200151846117439190612653565b9350505080611751906126e7565b90506116c8565b506040516370a0823160e01b815230600482015282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190612682565b10156040518060400160405280601081526020016f139bc81d1bdad95b9cc81d995cdd195960821b8152509061182c5760405162461bcd60e51b815260040161046d919061260a565b50806004600082825461183f9190612653565b925050819055508160036000828254611858919061266b565b9091555061189290506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384611f27565b604080518481526020810184905290810182905233907fa60e2795c057f5f16b33b778235c69080517ea6a06194e0e9a7fb3d4761ac1ea9060600161085f565b6118da611b0c565b6001600160a01b03811661193f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046d565b61194881611f79565b50565b611953611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0382166119a75760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a339190612682565b9050600060035482611a45919061266b565b9050600081116040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b81525090611a9c5760405162461bcd60e51b815260040161046d919061260a565b50611ad16001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611f27565b826001600160a01b03167fa2bd9fcfcdba69f52bcd9a520846ad4bd685b187483f53efc42d035b2ddebff08260405161085f91815260200190565b6000546001600160a01b031633146103f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161046d565b611b6e612076565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008160030154600003611bce57505490565b60028201546001830154600091611bef9161010090910461ffff1690612700565b604080516101208101825285548152600180870154602083015260028701549394506000938593611c34939289929184019160ff1690811115610586576105866123dd565b611c3e9190612700565b9050600080600286015460ff166001811115611c5c57611c5c6123dd565b14611c68576000611c79565b60028501546301000000900461ffff165b61ffff169050611c8c62093a8083612777565b8554611c99908390612653565b611ca39190612653565b95945050505050565b6000808360050154600014611cce57611cc98385600501546120c6565b611cd0565b825b8454909150811015611ce6576000915050610d27565b8354600090611cf5908361266b565b90506000611d0662093a8083612700565b60028701549091506301000000900461ffff16811015611d2c5760009350505050610d27565b600080600288015460ff166001811115611d4857611d486123dd565b14611d60576002870154610100900461ffff16611d81565b6002870154611d819061ffff63010000008204811691610100900416612796565b61ffff169050808210611dea576040805161012081018252885481526001808a0154602083015260028a0154600093611dce93928c929184019160ff1690811115610586576105866123dd565b8860010154611ddd919061266b565b9550610d27945050505050565b600080600289015460ff166001811115611e0657611e066123dd565b14611e115782611e2b565b6002880154611e2b906301000000900461ffff168461266b565b600289015460018a0154919250600091611e4e91610100900461ffff1690612700565b90506000611e608261ffff8516612777565b60408051610120810182528c5481526001808e0154602083015260028e01549394508493611ea1938f929084019160ff1690811115610586576105866123dd565b1115611eb7576000975050505050505050610d27565b60408051610120810182528b5481526001808d0154602083015260028d0154600093611ef793928f929184019160ff1690811115610586576105866123dd565b611f01908361266b565b9850610d27975050505050505050565b60008160e001518260c00151610d279190612653565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ba89084906120de565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051808201909152600080825260208201526000611fe98342611cac565b600284015490915060009061200a908390600160281b900461ffff166121b0565b905060405180604001604052808284612023919061266b565b8152602001919091529392505050565b61203b6121c9565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b9e3390565b600054600160a01b900460ff166103f65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161046d565b60008183106120d557816120d7565b825b9392505050565b6000612133826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122169092919063ffffffff16565b805190915015610ba8578080602001905181019061215191906127bc565b610ba85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161046d565b60006127106121bf8385612777565b6120d79190612700565b600054600160a01b900460ff16156103f65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161046d565b6060612225848460008561222d565b949350505050565b60608247101561228e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161046d565b6001600160a01b0385163b6122e55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161046d565b600080866001600160a01b0316858760405161230191906127de565b60006040518083038185875af1925050503d806000811461233e576040519150601f19603f3d011682016040523d82523d6000602084013e612343565b606091505b509150915061235382828661235e565b979650505050505050565b6060831561236d5750816120d7565b82511561237d5782518084602001fd5b8160405162461bcd60e51b815260040161046d919061260a565b80356001600160a01b03811681146123ae57600080fd5b919050565b600080604083850312156123c657600080fd5b6123cf83612397565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6002811061241157634e487b7160e01b600052602160045260246000fd5b9052565b898152602081018990526101208101612431604083018a6123f3565b61ffff978816606083015295871660808201529390951660a084015260c083019190915260e082015261010001919091529392505050565b60008060006060848603121561247e57600080fd5b61248784612397565b95602085013595506040909401359392505050565b6000602082840312156124ae57600080fd5b6120d782612397565b600080602083850312156124ca57600080fd5b823567ffffffffffffffff808211156124e257600080fd5b818501915085601f8301126124f657600080fd5b81358181111561250557600080fd5b8660206101208302850101111561251b57600080fd5b60209290920196919550909350505050565b803561ffff811681146123ae57600080fd5b8035600281106123ae57600080fd5b60008060008060008060008060006101208a8c03121561256d57600080fd5b6125768a612397565b985060208a0135975060408a0135965061259260608b0161252d565b95506125a060808b0161252d565b94506125ae60a08b0161252d565b93506125bc60c08b0161253f565b925060e08a013591506101008a013590509295985092959850929598565b60005b838110156125f55781810151838201526020016125dd565b83811115612604576000848401525b50505050565b60208152600082518060208401526126298160408501602087016125da565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126665761266661263d565b500190565b60008282101561267d5761267d61263d565b500390565b60006020828403121561269457600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156126c357600080fd5b6120d78261252d565b6000602082840312156126de57600080fd5b6120d78261253f565b6000600182016126f9576126f961263d565b5060010190565b60008261271d57634e487b7160e01b600052601260045260246000fd5b500490565b898152602081018990526040810188905261ffff87811660608301528681166080830152851660a0820152610120810161275f60c08301866123f3565b60e08201939093526101000152979650505050505050565b60008160001904831182151516156127915761279161263d565b500290565b600061ffff8083168185168083038211156127b3576127b361263d565b01949350505050565b6000602082840312156127ce57600080fd5b815180151581146120d757600080fd5b600082516127f08184602087016125da565b919091019291505056fea2646970667358221220f8f104dd1ddf0152e332aa503317cd92ab465eb2bff60e9afda3e8990734f99c64736f6c634300080f0033000000000000000000000000823556202e86763853b40e9cde725f412e294689000000000000000000000000d2a3d88f31315ea9442d7d25cd30871bed0044ff
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806384490312116100de578063c21b6d1a11610097578063e74f3fbb11610071578063e74f3fbb14610391578063f2fde38b14610399578063fb7f3f3c146103ac578063fc0c546a146103bf57600080fd5b8063c21b6d1a1461034f578063d153b60c14610378578063d18e81b31461038b57600080fd5b806384490312146102e05780638456cb59146102f35780638da5cb5b146102fb5780639e281a9814610320578063ade47ff514610333578063b5ed298a1461033c57600080fd5b8063556400081161013057806355640008146102505780635c975abb146102675780636a331e1e14610284578063715018a6146102b25780637244fee6146102ba578063818b2986146102cd57600080fd5b80633f4ba83a1461017857806345626bd61461018257806348f1f86d1461020f5780634c75b707146102225780634e71e0c8146102355780635370f0891461023d575b600080fd5b6101806103e6565b005b6101f16101903660046123b3565b60016020818152600093845260408085209091529183529120805491810154600282015460038301546004840154600590940154929360ff83169361ffff610100850481169463010000008104821694600160281b90910490911692909189565b60405161020699989796959493929190612415565b60405180910390f35b61018061021d366004612469565b6103f8565b61018061023036600461249c565b61067e565b61018061086c565b61018061024b3660046124b7565b61099b565b61025960035481565b604051908152602001610206565b600054600160a01b900460ff166040519015158152602001610206565b61029761029236600461249c565b610bad565b60408051825181526020928301519281019290925201610206565b610180610c8b565b6102976102c83660046123b3565b610c9d565b6101806102db36600461254e565b610d2d565b6102976102ee3660046123b3565b6112d2565b6101806113c9565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610206565b61018061032e3660046123b3565b6113d9565b61025960045481565b61018061034a36600461249c565b611588565b61025961035d36600461249c565b6001600160a01b031660009081526002602052604090205490565b600554610308906001600160a01b031681565b42610259565b610180611600565b6101806103a736600461249c565b6118d2565b6101806103ba36600461249c565b61194b565b6103087f000000000000000000000000823556202e86763853b40e9cde725f412e29468981565b6103ee611b0c565b6103f6611b66565b565b610400611b0c565b6001600160a01b0383166000908152600160209081526040808320858452825291829020805483518085019094526011845270125b9d985b1a59081d995cdd1a5b99d259607a1b9284019290925291906104765760405162461bcd60e51b815260040161046d919061260a565b60405180910390fd5b50600061048282611bbb565b9050808310156040518060400160405280601f81526020017f5465726d696e617465206265666f726520746865206c61737420636c61696d00815250906104dc5760405162461bcd60e51b815260040161046d919061260a565b50815460408051808201909152601f81527f5465726d696e617465206265666f7265207468652073746172742074696d65006020820152908410156105345760405162461bcd60e51b815260040161046d919061260a565b5060006105418385611cac565b6040805161012081018252855481526001808701546020830152600287015493945060009385936105ee939289929184019160ff1690811115610586576105866123dd565b6001811115610597576105976123dd565b8152600282015461ffff6101008204811660208401526301000000820481166040840152600160281b90910416606082015260038201546080820152600482015460a082015260059091015460c090910152611f11565b6105f89190612653565b8460010154610607919061266b565b90508484600501819055508060036000828254610624919061266b565b909155505060408051878152602081018490529081018290526001600160a01b038816907fc34759c11ae2635710f0e7f6a21d269f66ffef69086b9a32dd692eec56b44bf79060600160405180910390a250505050505050565b610686611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0382166106da5760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f000000000000000000000000823556202e86763853b40e9cde725f412e2946896001600160a01b0316906370a0823190602401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190612682565b905060035481610776919061266b565b60045411156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b815250906107cc5760405162461bcd60e51b815260040161046d919061260a565b506004805460009182905560038054919283926107ea90849061266b565b9091555061082490506001600160a01b037f000000000000000000000000823556202e86763853b40e9cde725f412e294689168483611f27565b826001600160a01b03167f7c92e98c5b2af24a95052353679ff5120823a95efc7ab8c5ffbd698449edbce28260405161085f91815260200190565b60405180910390a2505050565b60055460408051808201909152601981527f496e76616c6964204d756c746973696720636f6e7472616374000000000000006020820152906001600160a01b03166108ca5760405162461bcd60e51b815260040161046d919061260a565b506005546040805180820190915260128152712737ba10383937b837b9b2b21037bbb732b960711b6020820152906001600160a01b031633146109205760405162461bcd60e51b815260040161046d919061260a565b506005546001600160a01b031661093f6000546001600160a01b031690565b6001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600554610989906001600160a01b0316611f79565b600580546001600160a01b0319169055565b6109a3611b0c565b604080518082019091526013815272086c2dc40dedcd8f240c2c8c840666040dac2f606b1b6020820152601e8211156109ef5760405162461bcd60e51b815260040161046d919061260a565b50604080518082019091526013815272139bc81cd8da19591d5b195cc81d1bc8185919606a1b602082015281610a385760405162461bcd60e51b815260040161046d919061260a565b5060005b81811015610ba857610b98838383818110610a5957610a5961269b565b905061012002016040016020810190610a72919061249c565b848484818110610a8457610a8461269b565b9050610120020160000135858585818110610aa157610aa161269b565b9050610120020160200135868686818110610abe57610abe61269b565b905061012002016080016020810190610ad791906126b1565b878787818110610ae957610ae961269b565b9050610120020160a0016020810190610b0291906126b1565b888888818110610b1457610b1461269b565b9050610120020160c0016020810190610b2d91906126b1565b898989818110610b3f57610b3f61269b565b905061012002016060016020810190610b5891906126cc565b8a8a8a818110610b6a57610b6a61269b565b9050610120020160e001358b8b8b818110610b8757610b8761269b565b905061012002016101000135610d2d565b610ba1816126e7565b9050610a3c565b505050565b604080518082018252600080825260208083018290526001600160a01b0385168252600281529083902054835180850190945260128452714e6f206163746976652076657374696e677360701b91840191909152909181610c215760405162461bcd60e51b815260040161046d919061260a565b5060008060005b83811015610c71576000610c3c8783610c9d565b8051909150610c4b9085612653565b9350806020015183610c5d9190612653565b92505080610c6a906126e7565b9050610c28565b506040805180820190915291825260208201529392505050565b610c93611b0c565b6103f66000611f79565b604080518082018252600080825260208083018290526001600160a01b038616825260018152838220858352815290839020805484518086019095526011855270125b9d985b1a59081d995cdd1a5b99d259607a1b92850192909252919290610d195760405162461bcd60e51b815260040161046d919061260a565b50610d2381611fc9565b9150505b92915050565b610d35611b0c565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000823556202e86763853b40e9cde725f412e29468916906370a0823190602401602060405180830381865afa158015610da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc49190612682565b610dce919061266b565b9050808811156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b81525090610e255760405162461bcd60e51b815260040161046d919061260a565b5060408051808201909152601081526f24b73b30b634b210323ab930ba34b7b760811b602082015261ffff8816610e6f5760405162461bcd60e51b815260040161046d919061260a565b5087610e7b8385612653565b11156040518060400160405280601e81526020017f546f74616c20636c61696d6564206d6f7265207468616e20616d6f756e74000081525090610ed15760405162461bcd60e51b815260040161046d919061260a565b506000610ee261ffff89168a612700565b9050600081116040518060400160405280601881526020017f4e6f20746f6b656e2076657374656420706572207765656b000000000000000081525090610f3c5760405162461bcd60e51b815260040161046d919061260a565b50604080518082019091526012815271496e76616c69642073746172742074696d6560701b60208201528a610f845760405162461bcd60e51b815260040161046d919061260a565b5060408051808201909152601081526f496e766c61696420746178207261746560801b602082015261271061ffff88161115610fd35760405162461bcd60e51b815260040161046d919061260a565b506001856001811115610fe857610fe86123dd565b03611047578661ffff168861ffff16116040518060400160405280601681526020017524b73b30b634b21031b634b33310323ab930ba34b7b760511b815250906110455760405162461bcd60e51b815260040161046d919061260a565b505b60006040518061012001604052808c81526020018b8152602001876001811115611073576110736123dd565b81526020018a61ffff1681526020018961ffff1681526020018861ffff168152602001868152602001858152602001600081525090506000600260008e6001600160a01b03166001600160a01b031681526020019081526020016000205490506064811061113b5760405162461bcd60e51b815260206004820152602f60248201527f4d6178696d756d2076657374696e67207363686564756c657320666f7220726560448201526e18da5c1a595b9d081c995858da1959608a1b606482015260840161046d565b6001600160a01b038d1660009081526001602081815260408084208585528252928390208551815590850151818301559184015160028301805486949360ff19909116908381811115611190576111906123dd565b02179055506060820151600282018054608085015160a086015161ffff908116600160281b0266ffff00000000001992821663010000000264ffff00000019929096166101009081029290921664ffffffff001990941693909317949094171617905560c0830151600383015560e083015160048301559091015160059091015561121c816001612653565b600260008f6001600160a01b03166001600160a01b03168152602001908152602001600020819055508c6001600160a01b03167f623e4a93286a4bc3ad27ac8c914256a7acc39060d4f94f24f2bebe441b966b108284600001518e8e8e8e8e8e8e60405161129299989796959493929190612722565b60405180910390a26112a382611f11565b6112ad908c61266b565b600360008282546112be9190612653565b909155505050505050505050505050505050565b604080518082018252600080825260208083018290526001600160a01b038616825260018152838220858352815290839020805484518086019095526011855270125b9d985b1a59081d995cdd1a5b99d259607a1b9285019290925291929061134e5760405162461bcd60e51b815260040161046d919061260a565b50600281015460018201546000916113709161010090910461ffff1690612700565b60028301549091506000906127109061139490600160281b900461ffff1684612777565b61139e9190612700565b9050604051806040016040528082846113b7919061266b565b81526020019190915295945050505050565b6113d1611b0c565b6103f6612033565b6113e1611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0383166114355760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f000000000000000000000000823556202e86763853b40e9cde725f412e2946896001600160a01b0316906370a0823190602401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190612682565b9050808211156040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b815250906115185760405162461bcd60e51b815260040161046d919061260a565b5061154d6001600160a01b037f000000000000000000000000823556202e86763853b40e9cde725f412e294689168484611f27565b826001600160a01b03167fa2bd9fcfcdba69f52bcd9a520846ad4bd685b187483f53efc42d035b2ddebff08360405161085f91815260200190565b611590611b0c565b60408051808201909152600d81526c20b63932b0b23c9037bbb732b960991b6020820152336001600160a01b038316036115dd5760405162461bcd60e51b815260040161046d919061260a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff16156116655760405162461bcd60e51b815260206004820152602260248201527f636c61696d566573746564546f6b656e732829206973206e6f7420656e61626c604482015261195960f21b606482015260840161046d565b3360009081526002602090815260409182902054825180840190935260128352714e6f206163746976652076657374696e677360701b9183019190915290816116c15760405162461bcd60e51b815260040161046d919061260a565b5060008060005b83811015611758573360009081526001602090815260408083208484529091528120906116f482611fc9565b8051600384015491925061170791612653565b6003830155602081015160048301546117209190612653565b600483015580516117319086612653565b94508060200151846117439190612653565b9350505080611751906126e7565b90506116c8565b506040516370a0823160e01b815230600482015282907f000000000000000000000000823556202e86763853b40e9cde725f412e2946896001600160a01b0316906370a0823190602401602060405180830381865afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190612682565b10156040518060400160405280601081526020016f139bc81d1bdad95b9cc81d995cdd195960821b8152509061182c5760405162461bcd60e51b815260040161046d919061260a565b50806004600082825461183f9190612653565b925050819055508160036000828254611858919061266b565b9091555061189290506001600160a01b037f000000000000000000000000823556202e86763853b40e9cde725f412e294689163384611f27565b604080518481526020810184905290810182905233907fa60e2795c057f5f16b33b778235c69080517ea6a06194e0e9a7fb3d4761ac1ea9060600161085f565b6118da611b0c565b6001600160a01b03811661193f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046d565b61194881611f79565b50565b611953611b0c565b604080518082019091526016815275125b9d985b1a5908151bdad95b8818dbdb9d1c9858dd60521b60208201526001600160a01b0382166119a75760405162461bcd60e51b815260040161046d919061260a565b506040516370a0823160e01b81523060048201526000907f000000000000000000000000823556202e86763853b40e9cde725f412e2946896001600160a01b0316906370a0823190602401602060405180830381865afa158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a339190612682565b9050600060035482611a45919061266b565b9050600081116040518060400160405280601a815260200179496e73756666696369656e7420746f6b656e2062616c616e636560301b81525090611a9c5760405162461bcd60e51b815260040161046d919061260a565b50611ad16001600160a01b037f000000000000000000000000823556202e86763853b40e9cde725f412e294689168483611f27565b826001600160a01b03167fa2bd9fcfcdba69f52bcd9a520846ad4bd685b187483f53efc42d035b2ddebff08260405161085f91815260200190565b6000546001600160a01b031633146103f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161046d565b611b6e612076565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008160030154600003611bce57505490565b60028201546001830154600091611bef9161010090910461ffff1690612700565b604080516101208101825285548152600180870154602083015260028701549394506000938593611c34939289929184019160ff1690811115610586576105866123dd565b611c3e9190612700565b9050600080600286015460ff166001811115611c5c57611c5c6123dd565b14611c68576000611c79565b60028501546301000000900461ffff165b61ffff169050611c8c62093a8083612777565b8554611c99908390612653565b611ca39190612653565b95945050505050565b6000808360050154600014611cce57611cc98385600501546120c6565b611cd0565b825b8454909150811015611ce6576000915050610d27565b8354600090611cf5908361266b565b90506000611d0662093a8083612700565b60028701549091506301000000900461ffff16811015611d2c5760009350505050610d27565b600080600288015460ff166001811115611d4857611d486123dd565b14611d60576002870154610100900461ffff16611d81565b6002870154611d819061ffff63010000008204811691610100900416612796565b61ffff169050808210611dea576040805161012081018252885481526001808a0154602083015260028a0154600093611dce93928c929184019160ff1690811115610586576105866123dd565b8860010154611ddd919061266b565b9550610d27945050505050565b600080600289015460ff166001811115611e0657611e066123dd565b14611e115782611e2b565b6002880154611e2b906301000000900461ffff168461266b565b600289015460018a0154919250600091611e4e91610100900461ffff1690612700565b90506000611e608261ffff8516612777565b60408051610120810182528c5481526001808e0154602083015260028e01549394508493611ea1938f929084019160ff1690811115610586576105866123dd565b1115611eb7576000975050505050505050610d27565b60408051610120810182528b5481526001808d0154602083015260028d0154600093611ef793928f929184019160ff1690811115610586576105866123dd565b611f01908361266b565b9850610d27975050505050505050565b60008160e001518260c00151610d279190612653565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ba89084906120de565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051808201909152600080825260208201526000611fe98342611cac565b600284015490915060009061200a908390600160281b900461ffff166121b0565b905060405180604001604052808284612023919061266b565b8152602001919091529392505050565b61203b6121c9565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b9e3390565b600054600160a01b900460ff166103f65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161046d565b60008183106120d557816120d7565b825b9392505050565b6000612133826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122169092919063ffffffff16565b805190915015610ba8578080602001905181019061215191906127bc565b610ba85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161046d565b60006127106121bf8385612777565b6120d79190612700565b600054600160a01b900460ff16156103f65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161046d565b6060612225848460008561222d565b949350505050565b60608247101561228e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161046d565b6001600160a01b0385163b6122e55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161046d565b600080866001600160a01b0316858760405161230191906127de565b60006040518083038185875af1925050503d806000811461233e576040519150601f19603f3d011682016040523d82523d6000602084013e612343565b606091505b509150915061235382828661235e565b979650505050505050565b6060831561236d5750816120d7565b82511561237d5782518084602001fd5b8160405162461bcd60e51b815260040161046d919061260a565b80356001600160a01b03811681146123ae57600080fd5b919050565b600080604083850312156123c657600080fd5b6123cf83612397565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6002811061241157634e487b7160e01b600052602160045260246000fd5b9052565b898152602081018990526101208101612431604083018a6123f3565b61ffff978816606083015295871660808201529390951660a084015260c083019190915260e082015261010001919091529392505050565b60008060006060848603121561247e57600080fd5b61248784612397565b95602085013595506040909401359392505050565b6000602082840312156124ae57600080fd5b6120d782612397565b600080602083850312156124ca57600080fd5b823567ffffffffffffffff808211156124e257600080fd5b818501915085601f8301126124f657600080fd5b81358181111561250557600080fd5b8660206101208302850101111561251b57600080fd5b60209290920196919550909350505050565b803561ffff811681146123ae57600080fd5b8035600281106123ae57600080fd5b60008060008060008060008060006101208a8c03121561256d57600080fd5b6125768a612397565b985060208a0135975060408a0135965061259260608b0161252d565b95506125a060808b0161252d565b94506125ae60a08b0161252d565b93506125bc60c08b0161253f565b925060e08a013591506101008a013590509295985092959850929598565b60005b838110156125f55781810151838201526020016125dd565b83811115612604576000848401525b50505050565b60208152600082518060208401526126298160408501602087016125da565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126665761266661263d565b500190565b60008282101561267d5761267d61263d565b500390565b60006020828403121561269457600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156126c357600080fd5b6120d78261252d565b6000602082840312156126de57600080fd5b6120d78261253f565b6000600182016126f9576126f961263d565b5060010190565b60008261271d57634e487b7160e01b600052601260045260246000fd5b500490565b898152602081018990526040810188905261ffff87811660608301528681166080830152851660a0820152610120810161275f60c08301866123f3565b60e08201939093526101000152979650505050505050565b60008160001904831182151516156127915761279161263d565b500290565b600061ffff8083168185168083038211156127b3576127b361263d565b01949350505050565b6000602082840312156127ce57600080fd5b815180151581146120d757600080fd5b600082516127f08184602087016125da565b919091019291505056fea2646970667358221220f8f104dd1ddf0152e332aa503317cd92ab465eb2bff60e9afda3e8990734f99c64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000823556202e86763853b40e9cde725f412e294689000000000000000000000000d2a3d88f31315ea9442d7d25cd30871bed0044ff
-----Decoded View---------------
Arg [0] : _token (address): 0x823556202e86763853b40e9cDE725f412e294689
Arg [1] : multisig (address): 0xD2a3d88F31315EA9442d7d25cd30871Bed0044fF
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000823556202e86763853b40e9cde725f412e294689
Arg [1] : 000000000000000000000000d2a3d88f31315ea9442d7d25cd30871bed0044ff
Deployed Bytecode Sourcemap
34678:20347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54955:67;;;:::i;:::-;;36370:79;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36370:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;48693:1084;;;;;;:::i;:::-;;:::i;52216:530::-;;;;;;:::i;:::-;;:::i;54419:333::-;;;:::i;41256:745::-;;;;;;:::i;:::-;;:::i;36511:35::-;;;;;;;;;2990:25:1;;;2978:2;2963:18;36511:35:0;2844:177:1;32767:86:0;32814:4;32838:7;-1:-1:-1;;;32838:7:0;;;;32767:86;;3191:14:1;;3184:22;3166:41;;3154:2;3139:18;32767:86:0;3026:187:1;42518:633:0;;;;;;:::i;:::-;;:::i;:::-;;;;3442:13:1;;3424:32;;3512:4;3500:17;;;3494:24;3472:20;;;3465:54;;;;3397:18;42518:633:0;3218:307:1;2852:103:0;;;:::i;43441:342::-;;;;;;:::i;:::-;;:::i;38858:2195::-;;;;;;:::i;:::-;;:::i;50898:498::-;;;;;;:::i;:::-;;:::i;54821:63::-;;;:::i;2204:87::-;2250:7;2277:6;-1:-1:-1;;;;;2277:6:0;2204:87;;;-1:-1:-1;;;;;4793:32:1;;;4775:51;;4763:2;4748:18;2204:87:0;4629:203:1;53611:364:0;;;;;;:::i;:::-;;:::i;36553:32::-;;;;;;54124:190;;;;;;:::i;:::-;;:::i;42179:123::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42272:22:0;42245:7;42272:22;;;:10;:22;;;;;;;42179:123;36594:28;;;;;-1:-1:-1;;;;;36594:28:0;;;50432:157;50566:15;50432:157;;47051:1231;;;:::i;3110:201::-;;;;;;:::i;:::-;;:::i;52909:460::-;;;;;;:::i;:::-;;:::i;36332:29::-;;;;;54955:67;2090:13;:11;:13::i;:::-;55004:10:::1;:8;:10::i;:::-;54955:67::o:0;48693:1084::-;2090:13;:11;:13::i;:::-;-1:-1:-1;;;;;48899:28:0;::::1;48857:39;48899:28:::0;;;:16:::1;:28;::::0;;;;;;;:40;;;;;;;;;48960:25;;48991:18;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;48991:18:0;;::::1;::::0;;;;48899:40;48991:18;48952:58:::1;;;;-1:-1:-1::0;;;48952:58:0::1;;;;;;;;:::i;:::-;;;;;;;;;;49023:22;49048:46;49078:15;49048:29;:46::i;:::-;49023:71;;49135:14;49115:16;:34;;49151;;;;;;;;;;;;;;;;::::0;49107:79:::1;;;;;-1:-1:-1::0;;;49107:79:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;49225:25:0;;49252:34:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;49205:45;::::1;;49197:90;;;;-1:-1:-1::0;;;49197:90:0::1;;;;;;;;:::i;:::-;;49300:29;49332:63;49361:15;49378:16;49332:28;:63::i;:::-;49484:29;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;49300:95;;-1:-1:-1;49408:34:0::1;::::0;49300:95;;49484:29:::1;::::0;;49497:15;;49484:29;;;;::::1;;::::0;;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49484:29:0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;:12:::1;:29::i;:::-;:53;;;;:::i;:::-;49445:15;:22;;;:93;;;;:::i;:::-;49408:130;;49585:16;49551:15;:31;;:50;;;;49638:26;49614:20;;:50;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;49680:89:0::1;::::0;;6307:25:1;;;6363:2;6348:18;;6341:34;;;6391:18;;;6384:34;;;-1:-1:-1;;;;;49680:89:0;::::1;::::0;::::1;::::0;6295:2:1;6280:18;49680:89:0::1;;;;;;;48846:931;;;;48693:1084:::0;;;:::o;52216:530::-;2090:13;:11;:13::i;:::-;52319::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;52319:13:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;52294:23:0;::::1;52286:47;;;;-1:-1:-1::0;;;52286:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;52364:30:0::1;::::0;-1:-1:-1;;;52364:30:0;;52388:4:::1;52364:30;::::0;::::1;4775:51:1::0;52346:15:0::1;::::0;52364:5:::1;-1:-1:-1::0;;;;;52364:15:0::1;::::0;::::1;::::0;4748:18:1;;52364:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52346:48;;52447:20;;52437:7;:30;;;;:::i;:::-;52415:17;;:53;;52470:26;;;;;;;;;;;;;-1:-1:-1::0;;;52470:26:0::1;;::::0;52407:90:::1;;;;;-1:-1:-1::0;;;52407:90:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;52533:17:0::1;::::0;;52510:20:::1;52561:21:::0;;;;52593:20:::1;:36:::0;;52533:17;;;;52593:36:::1;::::0;52533:17;;52593:36:::1;:::i;:::-;::::0;;;-1:-1:-1;52642:43:0::1;::::0;-1:-1:-1;;;;;;52642:5:0::1;:18;52661:9:::0;52672:12;52642:18:::1;:43::i;:::-;52714:9;-1:-1:-1::0;;;;;52701:37:0::1;;52725:12;52701:37;;;;2990:25:1::0;;2978:2;2963:18;;2844:177;52701:37:0::1;;;;;;;;52275:471;;52216:530:::0;:::o;54419:333::-;54481:13;;54511:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54481:13:0;54465:63;;;;-1:-1:-1;;;54465:63:0;;;;;;;;:::i;:::-;-1:-1:-1;54561:13:0;;54576:24;;;;;;;;;;;;-1:-1:-1;;;54576:24:0;;;;;-1:-1:-1;;;;;54561:13:0;54547:10;:27;54539:62;;;;-1:-1:-1;;;54539:62:0;;;;;;;;:::i;:::-;-1:-1:-1;54649:13:0;;-1:-1:-1;;;;;54649:13:0;54640:7;2250;2277:6;-1:-1:-1;;;;;2277:6:0;;2204:87;54640:7;-1:-1:-1;;;;;54619:44:0;;;;;;;;;;;54693:13;;54674:33;;-1:-1:-1;;;;;54693:13:0;54674:18;:33::i;:::-;54718:13;:26;;-1:-1:-1;;;;;;54718:26:0;;;54419:333::o;41256:745::-;2090:13;:11;:13::i;:::-;41391::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;41391:13:0::1;::::0;::::1;::::0;41387:2:::1;41367:22:::0;::::1;;41359:46;;;;-1:-1:-1::0;;;41359:46:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;41446:18:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;41446:18:0::1;::::0;::::1;::::0;41424:20;41416:49:::1;;;;-1:-1:-1::0;;;41416:49:0::1;;;;;;;;:::i;:::-;;41483:11;41478:516;41500:22:::0;;::::1;41478:516;;;41546:436;41583:9;;41593:3;41583:14;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;41626:9;;41636:3;41626:14;;;;;;;:::i;:::-;;;;;;:24;;;41669:9;;41679:3;41669:14;;;;;;;:::i;:::-;;;;;;:21;;;41709:9;;41719:3;41709:14;;;;;;;:::i;:::-;;;;;;:30;;;;;;;;;;:::i;:::-;41758:9;;41768:3;41758:14;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;41804:9;;41814:3;41804:14;;;;;;;:::i;:::-;;;;;;:25;;;;;;;;;;:::i;:::-;41848:9;;41858:3;41848:14;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;41891:9;;41901:3;41891:14;;;;;;;:::i;:::-;;;;;;:27;;;41937:9;;41947:3;41937:14;;;;;;;:::i;:::-;;;;;;:30;;;41546:18;:436::i;:::-;41524:5;::::0;::::1;:::i;:::-;;;41478:516;;;;41256:745:::0;;:::o;42518:633::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;42650:22:0;;;;:10;:22;;;;;;;42709:18;;;;;;;;;;;-1:-1:-1;;;42709:18:0;;;;;;;-1:-1:-1;;42650:22:0;42683:45;;;;-1:-1:-1;;;42683:45:0;;;;;;;;:::i;:::-;;42741:25;42777:17;42812:18;42807:260;42849:12;42836:10;:25;42807:260;;;42892:26;42921:45;42943:10;42955;42921:21;:45::i;:::-;43004:13;;42892:74;;-1:-1:-1;42983:34:0;;;;:::i;:::-;;;43045:6;:10;;;43032:23;;;;;:::i;:::-;;;42877:190;42863:12;;;;:::i;:::-;;;42807:260;;;-1:-1:-1;43086:57:0;;;;;;;;;;;;;;;;;42518:633;-1:-1:-1;;;42518:633:0:o;2852:103::-;2090:13;:11;:13::i;:::-;2917:30:::1;2944:1;2917:18;:30::i;43441:342::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;43607:28:0;;;;:16;:28;;;;;:40;;;;;;;;;43666:25;;43697:18;;;;;;;;;;;-1:-1:-1;;;43697:18:0;;;;;;;-1:-1:-1;;43697:18:0;43658:58;;;;-1:-1:-1;;;43658:58:0;;;;;;;;:::i;:::-;;43736:39;43759:15;43736:22;:39::i;:::-;43729:46;;;43441:342;;;;;:::o;38858:2195::-;2090:13;:11;:13::i;:::-;39257:20:::1;::::0;39224:30:::1;::::0;-1:-1:-1;;;39224:30:0;;39248:4:::1;39224:30;::::0;::::1;4775:51:1::0;39197:24:0::1;::::0;39257:20;-1:-1:-1;;;;;39224:5:0::1;:15;::::0;::::1;::::0;4748:18:1;;39224:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;39197:80;;39307:16;39296:7;:27;;39325:26;;;;;;;;;;;;;-1:-1:-1::0;;;39325:26:0::1;;::::0;39288:64:::1;;;;;-1:-1:-1::0;;;39288:64:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39393:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;39393:16:0::1;::::0;::::1;::::0;39371:20:::1;::::0;::::1;39363:47;;;;-1:-1:-1::0;;;39363:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39467:7:0;39430:32:::1;39446:16:::0;39430:13;:32:::1;:::i;:::-;39429:45;;39476:23;;;;;;;;;;;;;;;;::::0;39421:79:::1;;;;;-1:-1:-1::0;;;39421:79:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39513:27:0::1;39543:26;;::::0;::::1;:7:::0;:26:::1;:::i;:::-;39513:56;;39610:1;39588:19;:23;39613:25;;;;;;;;;;;;;;;;::::0;39580:59:::1;;;;;-1:-1:-1::0;;;39580:59:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39674:18:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;39674:18:0::1;::::0;::::1;::::0;39658:14;39650:43:::1;;;;-1:-1:-1::0;;;39650:43:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39734:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;39734:16:0::1;::::0;::::1;::::0;39727:5:::1;39712:20;::::0;::::1;;;39704:47;;;;-1:-1:-1::0;;;39704:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39782:15:0::1;39768:10;:29;;;;;;;;:::i;:::-;::::0;39764:127:::1;;39841:13;39822:32;;:16;:32;;;39856:22;;;;;;;;;;;;;-1:-1:-1::0;;;39856:22:0::1;;::::0;39814:65:::1;;;;;-1:-1:-1::0;;;39814:65:0::1;;;;;;;;:::i;:::-;;39764:127;39903:30;39936:381;;;;;;;;39978:10;39936:381;;;;40011:7;39936:381;;;;40092:10;39936:381;;;;;;;;:::i;:::-;;;;;40050:16;39936:381;;;;;;40131:13;39936:381;;;;;;40261:11;39936:381;;;;;;40173:13;39936:381;;;;40218:16;39936:381;;;;40304:1;39936:381;;::::0;39903:414:::1;;40330:17;40350:10;:22;40361:10;-1:-1:-1::0;;;;;40350:22:0::1;-1:-1:-1::0;;;;;40350:22:0::1;;;;;;;;;;;;;40330:42;;40405:3;40393:9;:15;40385:75;;;::::0;-1:-1:-1;;;40385:75:0;;7715:2:1;40385:75:0::1;::::0;::::1;7697:21:1::0;7754:2;7734:18;;;7727:30;7793:34;7773:18;;;7766:62;-1:-1:-1;;;7844:18:1;;;7837:45;7899:19;;40385:75:0::1;7513:411:1::0;40385:75:0::1;-1:-1:-1::0;;;;;40473:28:0;::::1;;::::0;;;:16:::1;:28;::::0;;;;;;;:39;;;;;;;;;:49;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;40515:7;;40473:39;-1:-1:-1;;40473:49:0;;::::1;::::0;;;;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;40473:49:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;40473:49:0::1;-1:-1:-1::0;;40473:49:0;;::::1;::::0;::::1;-1:-1:-1::0;;40473:49:0;;;::::1;;::::0;;::::1;::::0;;;;-1:-1:-1;;40473:49:0;;;;;;;;;;::::1;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;40558:13:::1;:9:::0;40473:49:::1;40558:13;:::i;:::-;40533:10;:22;40544:10;-1:-1:-1::0;;;;;40533:22:0::1;-1:-1:-1::0;;;;;40533:22:0::1;;;;;;;;;;;;:38;;;;40694:10;-1:-1:-1::0;;;;;40589:295:0::1;;40616:9;40640:7;:17;;;40672:7;40719:16;40750:13;40778:11;40804:10;40829:13;40857:16;40589:295;;;;;;;;;;;;;;:::i;:::-;;;;;;;;41023:21;41036:7;41023:12;:21::i;:::-;41013:31;::::0;:7;:31:::1;:::i;:::-;40988:20;;:57;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;;38858:2195:0:o;50898:498::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;51062:28:0;;;;:16;:28;;;;;:40;;;;;;;;;51121:25;;51152:18;;;;;;;;;;;-1:-1:-1;;;51152:18:0;;;;;;;-1:-1:-1;;51152:18:0;51113:58;;;;-1:-1:-1;;;51113:58:0;;;;;;;;:::i;:::-;-1:-1:-1;51225:31:0;;;;;51200:22;;;51184:13;;51200:56;;51225:31;;;;;;;51200:56;:::i;:::-;51290:26;;;;51184:72;;-1:-1:-1;51267:11:0;;51320:5;;51282:34;;-1:-1:-1;;;51290:26:0;;;;51184:72;51282:34;:::i;:::-;51281:44;;;;:::i;:::-;51267:58;;51343:45;;;;;;;;51373:3;51365:5;:11;;;;:::i;:::-;51343:45;;;;;;;;;50898:498;-1:-1:-1;;;;;50898:498:0:o;54821:63::-;2090:13;:11;:13::i;:::-;54868:8:::1;:6;:8::i;53611:364::-:0;2090:13;:11;:13::i;:::-;53732::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;53732:13:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;53707:23:0;::::1;53699:47;;;;-1:-1:-1::0;;;53699:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53775:30:0::1;::::0;-1:-1:-1;;;53775:30:0;;53799:4:::1;53775:30;::::0;::::1;4775:51:1::0;53757:15:0::1;::::0;53775:5:::1;-1:-1:-1::0;;;;;53775:15:0::1;::::0;::::1;::::0;4748:18:1;;53775:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53757:48;;53834:7;53824:6;:17;;53843:26;;;;;;;;;;;;;-1:-1:-1::0;;;53843:26:0::1;;::::0;53816:54:::1;;;;;-1:-1:-1::0;;;53816:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53881:37:0::1;-1:-1:-1::0;;;;;53881:5:0::1;:18;53900:9:::0;53911:6;53881:18:::1;:37::i;:::-;53949:9;-1:-1:-1::0;;;;;53934:33:0::1;;53960:6;53934:33;;;;2990:25:1::0;;2978:2;2963:18;;2844:177;54124:190:0;2090:13;:11;:13::i;:::-;54238:26:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;54238:26:0::1;::::0;::::1;::::0;54208:10:::1;-1:-1:-1::0;;;;;54208:28:0;::::1;::::0;54200:65:::1;;;;-1:-1:-1::0;;;54200:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;54276:13:0::1;:30:::0;;-1:-1:-1;;;;;;54276:30:0::1;-1:-1:-1::0;;;;;54276:30:0;;;::::1;::::0;;;::::1;::::0;;54124:190::o;47051:1231::-;32814:4;32838:7;-1:-1:-1;;;32838:7:0;;;;47108:9;47100:56;;;;-1:-1:-1;;;47100:56:0;;9137:2:1;47100:56:0;;;9119:21:1;9176:2;9156:18;;;9149:30;9215:34;9195:18;;;9188:62;-1:-1:-1;;;9266:18:1;;;9259:32;9308:19;;47100:56:0;8935:398:1;47100:56:0;47203:10;47169:20;47192:22;;;:10;:22;;;;;;;;;;47251:18;;;;;;;;;;;-1:-1:-1;;;47251:18:0;;;;;;;47192:22;47233:16;47225:45;;;;-1:-1:-1;;;47225:45:0;;;;;;;;:::i;:::-;;47283:25;47319:17;47354:18;47349:586;47391:12;47378:10;:25;47349:586;;;47493:10;47434:39;47476:28;;;:16;:28;;;;;;;;:40;;;;;;;;;47568:39;47476:40;47568:22;:39::i;:::-;47694:19;;47663:28;;;;47533:74;;-1:-1:-1;47663:50:0;;;:::i;:::-;47624:28;;;:90;47805:16;;;;47771:31;;;;:50;;47805:16;47771:50;:::i;:::-;47729:31;;;:93;47860:19;;47839:40;;;;:::i;:::-;;;47907:12;:16;;;47894:29;;;;;:::i;:::-;;;47419:516;;47405:12;;;;:::i;:::-;;;47349:586;;;-1:-1:-1;47955:30:0;;-1:-1:-1;;;47955:30:0;;47979:4;47955:30;;;4775:51:1;47989:17:0;;47955:5;-1:-1:-1;;;;;47955:15:0;;;;4748:18:1;;47955:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;48008:16;;;;;;;;;;;;;-1:-1:-1;;;48008:16:0;;;47947:78;;;;;-1:-1:-1;;;47947:78:0;;;;;;;;:::i;:::-;;48059:9;48038:17;;:30;;;;;;;:::i;:::-;;;;;;;;48103:17;48079:20;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;48133:49:0;;-1:-1:-1;;;;;;48133:5:0;:18;48152:10;48164:17;48133:18;:49::i;:::-;48198:76;;;6307:25:1;;;6363:2;6348:18;;6341:34;;;6391:18;;;6384:34;;;48219:10:0;;48198:76;;6295:2:1;6280:18;48198:76:0;6105:319:1;3110:201:0;2090:13;:11;:13::i;:::-;-1:-1:-1;;;;;3199:22:0;::::1;3191:73;;;::::0;-1:-1:-1;;;3191:73:0;;9540:2:1;3191:73:0::1;::::0;::::1;9522:21:1::0;9579:2;9559:18;;;9552:30;9618:34;9598:18;;;9591:62;-1:-1:-1;;;9669:18:1;;;9662:36;9715:19;;3191:73:0::1;9338:402:1::0;3191:73:0::1;3275:28;3294:8;3275:18;:28::i;:::-;3110:201:::0;:::o;52909:460::-;2090:13;:11;:13::i;:::-;53025::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;53025:13:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;53000:23:0;::::1;52992:47;;;;-1:-1:-1::0;;;52992:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53070:30:0::1;::::0;-1:-1:-1;;;53070:30:0;;53094:4:::1;53070:30;::::0;::::1;4775:51:1::0;53052:15:0::1;::::0;53070:5:::1;-1:-1:-1::0;;;;;53070:15:0::1;::::0;::::1;::::0;4748:18:1;;53070:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53052:48;;53111:25;53149:20;;53139:7;:30;;;;:::i;:::-;53111:58;;53210:1;53190:17;:21;53213:26;;;;;;;;;;;;;-1:-1:-1::0;;;53213:26:0::1;;::::0;53182:58:::1;;;;;-1:-1:-1::0;;;53182:58:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53253:48:0::1;-1:-1:-1::0;;;;;53253:5:0::1;:18;53272:9:::0;53283:17;53253:18:::1;:48::i;:::-;53332:9;-1:-1:-1::0;;;;;53317:44:0::1;;53343:17;53317:44;;;;2990:25:1::0;;2978:2;2963:18;;2844:177;2369:132:0;2250:7;2277:6;-1:-1:-1;;;;;2277:6:0;829:10;2433:23;2425:68;;;;-1:-1:-1;;;2425:68:0;;9947:2:1;2425:68:0;;;9929:21:1;;;9966:18;;;9959:30;10025:34;10005:18;;;9998:62;10077:18;;2425:68:0;9745:356:1;33622:120:0;32631:16;:14;:16::i;:::-;33691:5:::1;33681:15:::0;;-1:-1:-1;;;;33681:15:0::1;::::0;;33712:22:::1;829:10:::0;33721:12:::1;33712:22;::::0;-1:-1:-1;;;;;4793:32:1;;;4775:51;;4763:2;4748:18;33712:22:0::1;;;;;;;33622:120::o:0;49785:639::-;49888:7;49912:15;:28;;;49944:1;49912:33;49908:98;;-1:-1:-1;49969:25:0;;49785:639::o;49908:98::-;50073:31;;;;;50048:22;;;50018:27;;50048:56;;50073:31;;;;;;;50048:56;:::i;:::-;50138:29;;;;;;;;;;;;;;;;;;;;;;;;;50018:86;;-1:-1:-1;50115:20:0;;50018:86;;50138:29;;;50151:15;;50138:29;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;50115:74;-1:-1:-1;50202:29:0;;50234:25;;;;;;;:44;;;;;;;:::i;:::-;;:79;;50312:1;50234:79;;;50281:28;;;;;;;;;50234:79;50202:111;;;-1:-1:-1;50384:31:0;34816:7;50384:12;:31;:::i;:::-;50331:25;;:49;;50359:21;;50331:49;:::i;:::-;:85;;;;:::i;:::-;50324:92;49785:639;-1:-1:-1;;;;;49785:639:0:o;44716:2097::-;44867:7;44892:28;44923:15;:31;;;44958:1;44923:36;:135;;45003:55;45012:12;45026:15;:31;;;45003:8;:55::i;:::-;44923:135;;;44975:12;44923:135;45098:25;;44892:166;;-1:-1:-1;45075:48:0;;45071:89;;;45147:1;45140:8;;;;;45071:89;45217:25;;45172:19;;45194:48;;:20;:48;:::i;:::-;45172:70;-1:-1:-1;45253:26:0;45282:30;34816:7;45172:70;45282:30;:::i;:::-;45432:28;;;;45253:59;;-1:-1:-1;45432:28:0;;;;;45411:49;;45407:90;;;45484:1;45477:8;;;;;;;45407:90;45590:25;;45618;;;;;;;:44;;;;;;;:::i;:::-;;:169;;45756:31;;;;;;;;;45618:169;;;45712:28;;;;45678:62;;45712:28;;;;;;;;45678:31;;;:62;:::i;:::-;45590:197;;;;45826:17;45804:18;:39;45800:1006;;45912:29;;;;;;;;;;;;;;;;;;;;;;;;;45860:24;;45912:29;;;45925:15;;45912:29;;;;;;;;;;;;;;:::i;:::-;45887:15;:22;;;:54;;;;:::i;:::-;45860:81;-1:-1:-1;45958:23:0;;-1:-1:-1;;;;;45958:23:0;45800:1006;46099:21;;46123:25;;;;;;;:44;;;;;;;:::i;:::-;;:167;;46271:18;46123:167;;;46215:28;;;;46194:49;;46215:28;;;;;46194:18;:49;:::i;:::-;46362:31;;;;;46337:22;;;46099:191;;-1:-1:-1;46307:27:0;;46337:56;;46362:31;;;;;;46337:56;:::i;:::-;46307:86;-1:-1:-1;46408:23:0;46434:36;46307:86;46434:36;;;;:::i;:::-;46580:29;;;;;;;;;;;;;;;;;;;;;;;;;46408:62;;-1:-1:-1;46408:62:0;;46580:29;;46593:15;;46580:29;;;;;;;;;;;;;;:::i;:::-;:47;46576:96;;;46655:1;46648:8;;;;;;;;;;;46576:96;46729:29;;;;;;;;;;;;;;;;;;;;;;;;;46688:20;;46729:29;;;46742:15;;46729:29;;;;;;;;;;;;;;:::i;:::-;46711:47;;:15;:47;:::i;:::-;46688:70;-1:-1:-1;46775:19:0;;-1:-1:-1;;;;;;;;46775:19:0;51580:182;51665:7;51723:15;:31;;;51692:15;:28;;;:62;;;;:::i;27298:211::-;27442:58;;;-1:-1:-1;;;;;10527:32:1;;27442:58:0;;;10509:51:1;10576:18;;;;10569:34;;;27442:58:0;;;;;;;;;;10482:18:1;;;;27442:58:0;;;;;;;;-1:-1:-1;;;;;27442:58:0;-1:-1:-1;;;27442:58:0;;;27415:86;;27435:5;;27415:19;:86::i;3471:191::-;3545:16;3564:6;;-1:-1:-1;;;;;3581:17:0;;;-1:-1:-1;;;;;;3581:17:0;;;;;;3614:40;;3564:6;;;;;;;3614:40;;3545:16;3614:40;3534:128;3471:191;:::o;44009:417::-;-1:-1:-1;;;;;;;;;;;;;;;;;44169:25:0;44197:60;44226:15;50566;44197:28;:60::i;:::-;44314:26;;;;44169:88;;-1:-1:-1;44268:11:0;;44282:59;;44169:88;;-1:-1:-1;;;44314:26:0;;;;44282:12;:59::i;:::-;44268:73;;44361:57;;;;;;;;44403:3;44383:17;:23;;;;:::i;:::-;44361:57;;;;;;;;44354:64;44009:417;-1:-1:-1;;;44009:417:0:o;33363:118::-;32372:19;:17;:19::i;:::-;33423:7:::1;:14:::0;;-1:-1:-1;;;;33423:14:0::1;-1:-1:-1::0;;;33423:14:0::1;::::0;;33453:20:::1;33460:12;829:10:::0;;749:98;33111:108;32814:4;32838:7;-1:-1:-1;;;32838:7:0;;;;33170:41;;;;-1:-1:-1;;;33170:41:0;;10816:2:1;33170:41:0;;;10798:21:1;10855:2;10835:18;;;10828:30;-1:-1:-1;;;10874:18:1;;;10867:50;10934:18;;33170:41:0;10614:344:1;7203:106:0;7261:7;7292:1;7288;:5;:13;;7300:1;7288:13;;;7296:1;7288:13;7281:20;7203:106;-1:-1:-1;;;7203:106:0:o;30365:716::-;30789:23;30815:69;30843:4;30815:69;;;;;;;;;;;;;;;;;30823:5;-1:-1:-1;;;;;30815:27:0;;;:69;;;;;:::i;:::-;30899:17;;30789:95;;-1:-1:-1;30899:21:0;30895:179;;30996:10;30985:30;;;;;;;;;;;;:::i;:::-;30977:85;;;;-1:-1:-1;;;30977:85:0;;11447:2:1;30977:85:0;;;11429:21:1;11486:2;11466:18;;;11459:30;11525:34;11505:18;;;11498:62;-1:-1:-1;;;11576:18:1;;;11569:40;11626:19;;30977:85:0;11245:406:1;51933:143:0;52013:7;52063:5;52041:18;52049:10;52041:5;:18;:::i;:::-;52040:28;;;;:::i;32926:108::-;32814:4;32838:7;-1:-1:-1;;;32838:7:0;;;;32996:9;32988:38;;;;-1:-1:-1;;;32988:38:0;;11858:2:1;32988:38:0;;;11840:21:1;11897:2;11877:18;;;11870:30;-1:-1:-1;;;11916:18:1;;;11909:46;11972:18;;32988:38:0;11656:340:1;22003:229:0;22140:12;22172:52;22194:6;22202:4;22208:1;22211:12;22172:21;:52::i;:::-;22165:59;22003:229;-1:-1:-1;;;;22003:229:0:o;23123:510::-;23293:12;23351:5;23326:21;:30;;23318:81;;;;-1:-1:-1;;;23318:81:0;;12203:2:1;23318:81:0;;;12185:21:1;12242:2;12222:18;;;12215:30;12281:34;12261:18;;;12254:62;-1:-1:-1;;;12332:18:1;;;12325:36;12378:19;;23318:81:0;12001:402:1;23318:81:0;-1:-1:-1;;;;;19553:19:0;;;23410:60;;;;-1:-1:-1;;;23410:60:0;;12610:2:1;23410:60:0;;;12592:21:1;12649:2;12629:18;;;12622:30;12688:31;12668:18;;;12661:59;12737:18;;23410:60:0;12408:353:1;23410:60:0;23484:12;23498:23;23525:6;-1:-1:-1;;;;;23525:11:0;23544:5;23551:4;23525:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23483:73;;;;23574:51;23591:7;23600:10;23612:12;23574:16;:51::i;:::-;23567:58;23123:510;-1:-1:-1;;;;;;;23123:510:0:o;25809:762::-;25959:12;25988:7;25984:580;;;-1:-1:-1;26019:10:0;26012:17;;25984:580;26133:17;;:21;26129:424;;26381:10;26375:17;26442:15;26429:10;26425:2;26421:19;26414:44;26129:424;26524:12;26517:20;;-1:-1:-1;;;26517: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:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;451:127::-;512:10;507:3;503:20;500:1;493:31;543:4;540:1;533:15;567:4;564:1;557:15;583:237;664:1;657:5;654:12;644:143;;709:10;704:3;700:20;697:1;690:31;744:4;741:1;734:15;772:4;769:1;762:15;644:143;796:18;;583:237::o;825:828::-;1202:25;;;1258:2;1243:18;;1236:34;;;1189:3;1174:19;;1279:53;1328:2;1313:18;;1305:6;1279:53;:::i;:::-;1351:6;1393:15;;;1388:2;1373:18;;1366:43;1446:15;;;1440:3;1425:19;;1418:44;1499:15;;;;1493:3;1478:19;;1471:44;1546:3;1531:19;;1524:35;;;;1590:3;1575:19;;1568:35;1634:3;1619:19;1612:35;;;;825:828;;-1:-1:-1;;;825:828:1:o;1658:322::-;1735:6;1743;1751;1804:2;1792:9;1783:7;1779:23;1775:32;1772:52;;;1820:1;1817;1810:12;1772:52;1843:29;1862:9;1843:29;:::i;:::-;1833:39;1919:2;1904:18;;1891:32;;-1:-1:-1;1970:2:1;1955:18;;;1942:32;;1658:322;-1:-1:-1;;;1658:322:1:o;1985:186::-;2044:6;2097:2;2085:9;2076:7;2072:23;2068:32;2065:52;;;2113:1;2110;2103:12;2065:52;2136:29;2155:9;2136:29;:::i;2176:663::-;2305:6;2313;2366:2;2354:9;2345:7;2341:23;2337:32;2334:52;;;2382:1;2379;2372:12;2334:52;2422:9;2409:23;2451:18;2492:2;2484:6;2481:14;2478:34;;;2508:1;2505;2498:12;2478:34;2546:6;2535:9;2531:22;2521:32;;2591:7;2584:4;2580:2;2576:13;2572:27;2562:55;;2613:1;2610;2603:12;2562:55;2653:2;2640:16;2679:2;2671:6;2668:14;2665:34;;;2695:1;2692;2685:12;2665:34;2753:7;2748:2;2738:6;2730;2726:19;2722:2;2718:28;2714:37;2711:50;2708:70;;;2774:1;2771;2764:12;2708:70;2805:2;2797:11;;;;;2827:6;;-1:-1:-1;2176:663:1;;-1:-1:-1;;;;2176:663:1:o;3530:159::-;3597:20;;3657:6;3646:18;;3636:29;;3626:57;;3679:1;3676;3669:12;3694:150;3769:20;;3818:1;3808:12;;3798:40;;3834:1;3831;3824:12;3849:775;3991:6;3999;4007;4015;4023;4031;4039;4047;4055;4108:3;4096:9;4087:7;4083:23;4079:33;4076:53;;;4125:1;4122;4115:12;4076:53;4148:29;4167:9;4148:29;:::i;:::-;4138:39;;4224:2;4213:9;4209:18;4196:32;4186:42;;4275:2;4264:9;4260:18;4247:32;4237:42;;4298:37;4331:2;4320:9;4316:18;4298:37;:::i;:::-;4288:47;;4354:38;4387:3;4376:9;4372:19;4354:38;:::i;:::-;4344:48;;4411:38;4444:3;4433:9;4429:19;4411:38;:::i;:::-;4401:48;;4468:46;4509:3;4498:9;4494:19;4468:46;:::i;:::-;4458:56;;4561:3;4550:9;4546:19;4533:33;4523:43;;4613:3;4602:9;4598:19;4585:33;4575:43;;3849:775;;;;;;;;;;;:::o;5059:258::-;5131:1;5141:113;5155:6;5152:1;5149:13;5141:113;;;5231:11;;;5225:18;5212:11;;;5205:39;5177:2;5170:10;5141:113;;;5272:6;5269:1;5266:13;5263:48;;;5307:1;5298:6;5293:3;5289:16;5282:27;5263:48;;5059:258;;;:::o;5322:383::-;5471:2;5460:9;5453:21;5434:4;5503:6;5497:13;5546:6;5541:2;5530:9;5526:18;5519:34;5562:66;5621:6;5616:2;5605:9;5601:18;5596:2;5588:6;5584:15;5562:66;:::i;:::-;5689:2;5668:15;-1:-1:-1;;5664:29:1;5649:45;;;;5696:2;5645:54;;5322:383;-1:-1:-1;;5322:383:1:o;5710:127::-;5771:10;5766:3;5762:20;5759:1;5752:31;5802:4;5799:1;5792:15;5826:4;5823:1;5816:15;5842:128;5882:3;5913:1;5909:6;5906:1;5903:13;5900:39;;;5919:18;;:::i;:::-;-1:-1:-1;5955:9:1;;5842:128::o;5975:125::-;6015:4;6043:1;6040;6037:8;6034:34;;;6048:18;;:::i;:::-;-1:-1:-1;6085:9:1;;5975:125::o;6429:184::-;6499:6;6552:2;6540:9;6531:7;6527:23;6523:32;6520:52;;;6568:1;6565;6558:12;6520:52;-1:-1:-1;6591:16:1;;6429:184;-1:-1:-1;6429:184:1:o;6618:127::-;6679:10;6674:3;6670:20;6667:1;6660:31;6710:4;6707:1;6700:15;6734:4;6731:1;6724:15;6750:184;6808:6;6861:2;6849:9;6840:7;6836:23;6832:32;6829:52;;;6877:1;6874;6867:12;6829:52;6900:28;6918:9;6900:28;:::i;6939:207::-;7012:6;7065:2;7053:9;7044:7;7040:23;7036:32;7033:52;;;7081:1;7078;7071:12;7033:52;7104:36;7130:9;7104:36;:::i;7151:135::-;7190:3;7211:17;;;7208:43;;7231:18;;:::i;:::-;-1:-1:-1;7278:1:1;7267:13;;7151:135::o;7291:217::-;7331:1;7357;7347:132;;7401:10;7396:3;7392:20;7389:1;7382:31;7436:4;7433:1;7426:15;7464:4;7461:1;7454:15;7347:132;-1:-1:-1;7493:9:1;;7291:217::o;7929:828::-;8306:25;;;8362:2;8347:18;;8340:34;;;8405:2;8390:18;;8383:34;;;8436:6;8478:15;;;8473:2;8458:18;;8451:43;8531:15;;;8525:3;8510:19;;8503:44;8584:15;;8578:3;8563:19;;8556:44;8293:3;8278:19;;8609:54;8658:3;8643:19;;8635:6;8609:54;:::i;:::-;8694:3;8679:19;;8672:35;;;;8738:3;8723:19;8716:35;7929:828;;-1:-1:-1;;;;;;;7929:828:1:o;8762:168::-;8802:7;8868:1;8864;8860:6;8856:14;8853:1;8850:21;8845:1;8838:9;8831:17;8827:45;8824:71;;;8875:18;;:::i;:::-;-1:-1:-1;8915:9:1;;8762:168::o;10106:224::-;10145:3;10173:6;10206:2;10203:1;10199:10;10236:2;10233:1;10229:10;10267:3;10263:2;10259:12;10254:3;10251:21;10248:47;;;10275:18;;:::i;:::-;10311:13;;10106:224;-1:-1:-1;;;;10106:224:1:o;10963:277::-;11030:6;11083:2;11071:9;11062:7;11058:23;11054:32;11051:52;;;11099:1;11096;11089:12;11051:52;11131:9;11125:16;11184:5;11177:13;11170:21;11163:5;11160:32;11150:60;;11206:1;11203;11196:12;12766:274;12895:3;12933:6;12927:13;12949:53;12995:6;12990:3;12983:4;12975:6;12971:17;12949:53;:::i;:::-;13018:16;;;;;12766:274;-1:-1:-1;;12766:274:1:o
Swarm Source
ipfs://f8f104dd1ddf0152e332aa503317cd92ab465eb2bff60e9afda3e8990734f99c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.011126 | 9,035,504.5462 | $100,527.31 |
Loading...
Loading
[ 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.