Overview
BTT Balance
0 BTT
BTT Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 13980919 | 762 days ago | IN | 0 BTT | 8.7069 |
Loading...
Loading
Contract Name:
TokenVesting
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at bttcscan.com on 2022-11-08 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.11; // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) /** * @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.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) /** * @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.8.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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) /** * @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/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/TokenVesting.sol // contracts/TokenVesting.sol /** * @title TokenVesting */ contract TokenVesting is Ownable, ReentrancyGuard{ using SafeMath for uint256; using SafeERC20 for IERC20; struct VestingSchedule{ bool initialized; // beneficiary of tokens after they are released address beneficiary; // cliff period in seconds uint256 cliff; // start time of the vesting period uint256 start; // duration of the vesting period in seconds uint256 duration; // duration of a slice period for the vesting in seconds uint256 slicePeriodSeconds; // whether or not the vesting is revocable bool revocable; // total amount of tokens to be released at the end of the vesting uint256 amountTotal; // amount of tokens released uint256 released; // whether or not the vesting has been revoked bool revoked; } // address of the ERC20 token IERC20 immutable private _token; bytes32[] private vestingSchedulesIds; mapping(bytes32 => VestingSchedule) private vestingSchedules; uint256 private vestingSchedulesTotalAmount; mapping(address => uint256) private holdersVestingCount; event Released(uint256 amount); event Revoked(); /** * @dev Reverts if no vesting schedule matches the passed identifier. */ modifier onlyIfVestingScheduleExists(bytes32 vestingScheduleId) { require(vestingSchedules[vestingScheduleId].initialized == true); _; } /** * @dev Reverts if the vesting schedule does not exist or has been revoked. */ modifier onlyIfVestingScheduleNotRevoked(bytes32 vestingScheduleId) { require(vestingSchedules[vestingScheduleId].initialized == true); require(vestingSchedules[vestingScheduleId].revoked == false); _; } /** * @dev Creates a vesting contract. * @param token_ address of the ERC20 token contract */ constructor(address token_) { require(token_ != address(0x0)); _token = IERC20(token_); } receive() external payable {} fallback() external payable {} /** * @dev Returns the number of vesting schedules associated to a beneficiary. * @return the number of vesting schedules */ function getVestingSchedulesCountByBeneficiary(address _beneficiary) external view returns(uint256){ return holdersVestingCount[_beneficiary]; } /** * @dev Returns the vesting schedule id at the given index. * @return the vesting id */ function getVestingIdAtIndex(uint256 index) external view returns(bytes32){ require(index < getVestingSchedulesCount(), "TokenVesting: index out of bounds"); return vestingSchedulesIds[index]; } /** * @notice Returns the vesting schedule information for a given holder and index. * @return the vesting schedule structure information */ function getVestingScheduleByAddressAndIndex(address holder, uint256 index) external view returns(VestingSchedule memory){ return getVestingSchedule(computeVestingScheduleIdForAddressAndIndex(holder, index)); } /** * @notice Returns the total amount of vesting schedules. * @return the total amount of vesting schedules */ function getVestingSchedulesTotalAmount() external view returns(uint256){ return vestingSchedulesTotalAmount; } /** * @dev Returns the address of the ERC20 token managed by the vesting contract. */ function getToken() external view returns(address){ return address(_token); } /** * @notice Creates a new vesting schedule for a beneficiary. * @param _beneficiary address of the beneficiary to whom vested tokens are transferred * @param _start start time of the vesting period * @param _cliff duration in seconds of the cliff in which tokens will begin to vest * @param _duration duration in seconds of the period in which the tokens will vest * @param _slicePeriodSeconds duration of a slice period for the vesting in seconds * @param _revocable whether the vesting is revocable or not * @param _amount total amount of tokens to be released at the end of the vesting */ function createVestingSchedule( address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, uint256 _slicePeriodSeconds, bool _revocable, uint256 _amount ) public onlyOwner{ require( this.getWithdrawableAmount() >= _amount, "TokenVesting: cannot create vesting schedule because not sufficient tokens" ); require(_duration > 0, "TokenVesting: duration must be > 0"); require(_amount > 0, "TokenVesting: amount must be > 0"); require(_slicePeriodSeconds >= 1, "TokenVesting: slicePeriodSeconds must be >= 1"); bytes32 vestingScheduleId = this.computeNextVestingScheduleIdForHolder(_beneficiary); uint256 cliff = _start.add(_cliff); vestingSchedules[vestingScheduleId] = VestingSchedule( true, _beneficiary, cliff, _start, _duration, _slicePeriodSeconds, _revocable, _amount, 0, false ); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.add(_amount); vestingSchedulesIds.push(vestingScheduleId); uint256 currentVestingCount = holdersVestingCount[_beneficiary]; holdersVestingCount[_beneficiary] = currentVestingCount.add(1); } /** * @notice Revokes the vesting schedule for given identifier. * @param vestingScheduleId the vesting schedule identifier */ function revoke(bytes32 vestingScheduleId) public onlyOwner onlyIfVestingScheduleNotRevoked(vestingScheduleId){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; require(vestingSchedule.revocable == true, "TokenVesting: vesting is not revocable"); uint256 vestedAmount = _computeReleasableAmount(vestingSchedule); if(vestedAmount > 0){ release(vestingScheduleId, vestedAmount); } uint256 unreleased = vestingSchedule.amountTotal.sub(vestingSchedule.released); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.sub(unreleased); vestingSchedule.revoked = true; } /** * @notice Withdraw the specified amount if possible. * @param amount the amount to withdraw */ function withdraw(uint256 amount) public nonReentrant onlyOwner{ require(this.getWithdrawableAmount() >= amount, "TokenVesting: not enough withdrawable funds"); _token.safeTransfer(owner(), amount); } /** * @notice Release vested amount of tokens. * @param vestingScheduleId the vesting schedule identifier * @param amount the amount to release */ function release( bytes32 vestingScheduleId, uint256 amount ) public nonReentrant onlyIfVestingScheduleNotRevoked(vestingScheduleId){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; bool isBeneficiary = msg.sender == vestingSchedule.beneficiary; bool isOwner = msg.sender == owner(); require( isBeneficiary || isOwner, "TokenVesting: only beneficiary and owner can release vested tokens" ); uint256 vestedAmount = _computeReleasableAmount(vestingSchedule); require(vestedAmount >= amount, "TokenVesting: cannot release tokens, not enough vested tokens"); vestingSchedule.released = vestingSchedule.released.add(amount); address payable beneficiaryPayable = payable(vestingSchedule.beneficiary); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount.sub(amount); _token.safeTransfer(beneficiaryPayable, amount); } /** * @dev Returns the number of vesting schedules managed by this contract. * @return the number of vesting schedules */ function getVestingSchedulesCount() public view returns(uint256){ return vestingSchedulesIds.length; } /** * @notice Computes the vested amount of tokens for the given vesting schedule identifier. * @return the vested amount */ function computeReleasableAmount(bytes32 vestingScheduleId) public onlyIfVestingScheduleNotRevoked(vestingScheduleId) view returns(uint256){ VestingSchedule storage vestingSchedule = vestingSchedules[vestingScheduleId]; return _computeReleasableAmount(vestingSchedule); } /** * @notice Returns the vesting schedule information for a given identifier. * @return the vesting schedule structure information */ function getVestingSchedule(bytes32 vestingScheduleId) public view returns(VestingSchedule memory){ return vestingSchedules[vestingScheduleId]; } /** * @dev Returns the amount of tokens that can be withdrawn by the owner. * @return the amount of tokens */ function getWithdrawableAmount() public view returns(uint256){ return _token.balanceOf(address(this)).sub(vestingSchedulesTotalAmount); } /** * @dev Computes the next vesting schedule identifier for a given holder address. */ function computeNextVestingScheduleIdForHolder(address holder) public view returns(bytes32){ return computeVestingScheduleIdForAddressAndIndex(holder, holdersVestingCount[holder]); } /** * @dev Returns the last vesting schedule for a given holder address. */ function getLastVestingScheduleForHolder(address holder) public view returns(VestingSchedule memory){ return vestingSchedules[computeVestingScheduleIdForAddressAndIndex(holder, holdersVestingCount[holder] - 1)]; } /** * @dev Computes the vesting schedule identifier for an address and an index. */ function computeVestingScheduleIdForAddressAndIndex(address holder, uint256 index) public pure returns(bytes32){ return keccak256(abi.encodePacked(holder, index)); } /** * @dev Computes the releasable amount of tokens for a vesting schedule. * @return the amount of releasable tokens */ function _computeReleasableAmount(VestingSchedule memory vestingSchedule) internal view returns(uint256){ uint256 currentTime = getCurrentTime(); if ((currentTime < vestingSchedule.cliff) || vestingSchedule.revoked == true) { return 0; } else if (currentTime >= vestingSchedule.start.add(vestingSchedule.duration)) { return vestingSchedule.amountTotal.sub(vestingSchedule.released); } else { uint256 timeFromStart = currentTime.sub(vestingSchedule.start); uint secondsPerSlice = vestingSchedule.slicePeriodSeconds; uint256 vestedSlicePeriods = timeFromStart.div(secondsPerSlice); uint256 vestedSeconds = vestedSlicePeriods.mul(secondsPerSlice); uint256 vestedAmount = vestingSchedule.amountTotal.mul(vestedSeconds).div(vestingSchedule.duration); vestedAmount = vestedAmount.sub(vestingSchedule.released); return vestedAmount; } } function getCurrentTime() internal virtual view returns(uint256){ return block.timestamp; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"token_","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":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[],"name":"Revoked","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"computeNextVestingScheduleIdForHolder","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"computeReleasableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"computeVestingScheduleIdForAddressAndIndex","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_cliff","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getLastVestingScheduleForHolder","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct TokenVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getVestingIdAtIndex","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"getVestingSchedule","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct TokenVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getVestingScheduleByAddressAndIndex","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"slicePeriodSeconds","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct TokenVesting.VestingSchedule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingSchedulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getVestingSchedulesCountByBeneficiary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingSchedulesTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingScheduleId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200311e3803806200311e83398181016040528101906200003791906200020a565b620000576200004b620000d460201b60201c565b620000dc60201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200009957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200023c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d282620001a5565b9050919050565b620001e481620001c5565b8114620001f057600080fd5b50565b6000815190506200020481620001d9565b92915050565b600060208284031215620002235762000222620001a0565b5b60006200023384828501620001f3565b91505092915050565b608051612eb16200026d6000396000818161093801528181610a2b01528181610dd7015261100c0152612eb16000f3fe6080604052600436106101185760003560e01c80638af104da116100a0578063ea1bb3d511610064578063ea1bb3d5146103a7578063f2fde38b146103e4578063f51321d71461040d578063f7c469f01461044a578063f9079b37146104875761011f565b80638af104da146102ae5780638da5cb5b146102eb57806390be10cc146103165780639ef346b414610341578063b75c7dc61461037e5761011f565b806348deb471116100e757806348deb471146101c95780635a7bb69a146101f457806366afd8ef14610231578063715018a61461025a5780637e913dc6146102715761011f565b8063130836171461012157806317e289e91461014c57806321df0da7146101755780632e1a7d4d146101a05761011f565b3661011f57005b005b34801561012d57600080fd5b506101366104c4565b6040516101439190611dd0565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e9190611eb2565b6104d1565b005b34801561018157600080fd5b5061018a610934565b6040516101979190611f63565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190611f7e565b61095c565b005b3480156101d557600080fd5b506101de610a7a565b6040516101eb9190611dd0565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190611fab565b610a84565b6040516102289190611dd0565b60405180910390f35b34801561023d57600080fd5b506102586004803603810190610253919061200e565b610acd565b005b34801561026657600080fd5b5061026f610e2d565b005b34801561027d57600080fd5b5061029860048036038101906102939190611fab565b610e41565b6040516102a59190612147565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612163565b610fa6565b6040516102e291906121b2565b60405180910390f35b3480156102f757600080fd5b50610300610fd9565b60405161030d9190611f63565b60405180910390f35b34801561032257600080fd5b5061032b611002565b6040516103389190611dd0565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906121cd565b6110b7565b6040516103759190612147565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a091906121cd565b6111c8565b005b3480156103b357600080fd5b506103ce60048036038101906103c991906121cd565b611416565b6040516103db9190611dd0565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190611fab565b611599565b005b34801561041957600080fd5b50610434600480360381019061042f9190612163565b61161d565b6040516104419190612147565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c9190611fab565b61163f565b60405161047e91906121b2565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190611f7e565b611691565b6040516104bb91906121b2565b60405180910390f35b6000600280549050905090565b6104d9611702565b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610549919061220f565b101561058a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610581906122e5565b60405180910390fd5b600084116105cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c490612377565b60405180910390fd5b60008111610610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610607906123e3565b60405180910390fd5b6001831015610654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064b90612475565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663f7c469f0896040518263ffffffff1660e01b815260040161068f9190611f63565b602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d091906124aa565b905060006106e7878961178090919063ffffffff16565b90506040518061014001604052806001151581526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001828152602001898152602001878152602001868152602001851515815260200184815260200160008152602001600015158152506003600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548160ff02191690831515021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff02191690831515021790555090505061085e8360045461178090919063ffffffff16565b60048190555060028290806001815401808255809150506001900390600052602060002001600090919091909150556000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506108e560018261178090919063ffffffff16565b600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b610964611796565b61096c611702565b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc919061220f565b1015610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612549565b60405180910390fd5b610a6f610a28610fd9565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166117e69092919063ffffffff16565b610a7761186c565b50565b6000600454905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ad5611796565b81600115156003600083815260200190815260200160002060000160009054906101000a900460ff16151514610b0a57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff16151514610b3e57600080fd5b600060036000858152602001908152602001600020905060008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490506000610bb6610fd9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508180610bef5750805b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612601565b60405180910390fd5b6000610d2884604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b905085811015610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490612693565b60405180910390fd5b610d8486856007015461178090919063ffffffff16565b846007018190555060008460000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610dca8760045461199d90919063ffffffff16565b600481905550610e1b81887f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166117e69092919063ffffffff16565b505050505050610e2961186c565b5050565b610e35611702565b610e3f60006119b3565b565b610e49611d48565b60036000610ea2846001600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e9d91906126e2565b610fa6565b8152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b60008282604051602001610fbb92919061277f565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006110b26004547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110639190611f63565b602060405180830381865afa158015611080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a4919061220f565b61199d90919063ffffffff16565b905090565b6110bf611d48565b60036000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b6111d0611702565b80600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461120557600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461123957600080fd5b6000600360008481526020019081526020016000209050600115158160050160009054906101000a900460ff161515146112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f9061281d565b60405180910390fd5b60006113a282604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b905060008111156113b8576113b78482610acd565b5b60006113d58360070154846006015461199d90919063ffffffff16565b90506113ec8160045461199d90919063ffffffff16565b60048190555060018360080160006101000a81548160ff0219169083151502179055505050505050565b600081600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461144d57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461148157600080fd5b600060036000858152602001908152602001600020905061159081604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b92505050919050565b6115a1611702565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906128af565b60405180910390fd5b61161a816119b3565b50565b611625611d48565b6116376116328484610fa6565b6110b7565b905092915050565b600061168a82600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fa6565b9050919050565b600061169b6104c4565b82106116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d390612941565b60405180910390fd5b600282815481106116f0576116ef612961565b5b90600052602060002001549050919050565b61170a611a77565b73ffffffffffffffffffffffffffffffffffffffff16611728610fd9565b73ffffffffffffffffffffffffffffffffffffffff161461177e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611775906129dc565b60405180910390fd5b565b6000818361178e91906129fc565b905092915050565b600260015414156117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390612a9e565b60405180910390fd5b6002600181905550565b6118678363a9059cbb60e01b8484604051602401611805929190612abe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a7f565b505050565b60018081905550565b600080611880611b46565b9050826040015181108061189d5750600115158361012001511515145b156118ac576000915050611998565b6118c78360800151846060015161178090919063ffffffff16565b81106118f1576118e98361010001518460e0015161199d90919063ffffffff16565b915050611998565b600061190a84606001518361199d90919063ffffffff16565b905060008460a001519050600061192a8284611b4e90919063ffffffff16565b905060006119418383611b6490919063ffffffff16565b905060006119728860800151611964848b60e00151611b6490919063ffffffff16565b611b4e90919063ffffffff16565b905061198c8861010001518261199d90919063ffffffff16565b90508096505050505050505b919050565b600081836119ab91906126e2565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000611ae1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b7a9092919063ffffffff16565b9050600081511115611b415780806020019051810190611b019190612afc565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790612b9b565b60405180910390fd5b5b505050565b600042905090565b60008183611b5c9190612bea565b905092915050565b60008183611b729190612c1b565b905092915050565b6060611b898484600085611b92565b90509392505050565b606082471015611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90612ce7565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c009190612d81565b60006040518083038185875af1925050503d8060008114611c3d576040519150601f19603f3d011682016040523d82523d6000602084013e611c42565b606091505b5091509150611c5387838387611c5f565b92505050949350505050565b60608315611cc257600083511415611cba57611c7a85611cd5565b611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090612de4565b60405180910390fd5b5b829050611ccd565b611ccc8383611cf8565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611d0b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9190612e59565b60405180910390fd5b604051806101400160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000151581525090565b6000819050919050565b611dca81611db7565b82525050565b6000602082019050611de56000830184611dc1565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e1b82611df0565b9050919050565b611e2b81611e10565b8114611e3657600080fd5b50565b600081359050611e4881611e22565b92915050565b611e5781611db7565b8114611e6257600080fd5b50565b600081359050611e7481611e4e565b92915050565b60008115159050919050565b611e8f81611e7a565b8114611e9a57600080fd5b50565b600081359050611eac81611e86565b92915050565b600080600080600080600060e0888a031215611ed157611ed0611deb565b5b6000611edf8a828b01611e39565b9750506020611ef08a828b01611e65565b9650506040611f018a828b01611e65565b9550506060611f128a828b01611e65565b9450506080611f238a828b01611e65565b93505060a0611f348a828b01611e9d565b92505060c0611f458a828b01611e65565b91505092959891949750929550565b611f5d81611e10565b82525050565b6000602082019050611f786000830184611f54565b92915050565b600060208284031215611f9457611f93611deb565b5b6000611fa284828501611e65565b91505092915050565b600060208284031215611fc157611fc0611deb565b5b6000611fcf84828501611e39565b91505092915050565b6000819050919050565b611feb81611fd8565b8114611ff657600080fd5b50565b60008135905061200881611fe2565b92915050565b6000806040838503121561202557612024611deb565b5b600061203385828601611ff9565b925050602061204485828601611e65565b9150509250929050565b61205781611e7a565b82525050565b61206681611e10565b82525050565b61207581611db7565b82525050565b61014082016000820151612092600085018261204e565b5060208201516120a5602085018261205d565b5060408201516120b8604085018261206c565b5060608201516120cb606085018261206c565b5060808201516120de608085018261206c565b5060a08201516120f160a085018261206c565b5060c082015161210460c085018261204e565b5060e082015161211760e085018261206c565b5061010082015161212c61010085018261206c565b5061012082015161214161012085018261204e565b50505050565b60006101408201905061215d600083018461207b565b92915050565b6000806040838503121561217a57612179611deb565b5b600061218885828601611e39565b925050602061219985828601611e65565b9150509250929050565b6121ac81611fd8565b82525050565b60006020820190506121c760008301846121a3565b92915050565b6000602082840312156121e3576121e2611deb565b5b60006121f184828501611ff9565b91505092915050565b60008151905061220981611e4e565b92915050565b60006020828403121561222557612224611deb565b5b6000612233848285016121fa565b91505092915050565b600082825260208201905092915050565b7f546f6b656e56657374696e673a2063616e6e6f7420637265617465207665737460008201527f696e67207363686564756c652062656361757365206e6f74207375666669636960208201527f656e7420746f6b656e7300000000000000000000000000000000000000000000604082015250565b60006122cf604a8361223c565b91506122da8261224d565b606082019050919050565b600060208201905081810360008301526122fe816122c2565b9050919050565b7f546f6b656e56657374696e673a206475726174696f6e206d757374206265203e60008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061236160228361223c565b915061236c82612305565b604082019050919050565b6000602082019050818103600083015261239081612354565b9050919050565b7f546f6b656e56657374696e673a20616d6f756e74206d757374206265203e2030600082015250565b60006123cd60208361223c565b91506123d882612397565b602082019050919050565b600060208201905081810360008301526123fc816123c0565b9050919050565b7f546f6b656e56657374696e673a20736c696365506572696f645365636f6e647360008201527f206d757374206265203e3d203100000000000000000000000000000000000000602082015250565b600061245f602d8361223c565b915061246a82612403565b604082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b6000815190506124a481611fe2565b92915050565b6000602082840312156124c0576124bf611deb565b5b60006124ce84828501612495565b91505092915050565b7f546f6b656e56657374696e673a206e6f7420656e6f756768207769746864726160008201527f7761626c652066756e6473000000000000000000000000000000000000000000602082015250565b6000612533602b8361223c565b915061253e826124d7565b604082019050919050565b6000602082019050818103600083015261256281612526565b9050919050565b7f546f6b656e56657374696e673a206f6e6c792062656e6566696369617279206160008201527f6e64206f776e65722063616e2072656c656173652076657374656420746f6b6560208201527f6e73000000000000000000000000000000000000000000000000000000000000604082015250565b60006125eb60428361223c565b91506125f682612569565b606082019050919050565b6000602082019050818103600083015261261a816125de565b9050919050565b7f546f6b656e56657374696e673a2063616e6e6f742072656c6561736520746f6b60008201527f656e732c206e6f7420656e6f7567682076657374656420746f6b656e73000000602082015250565b600061267d603d8361223c565b915061268882612621565b604082019050919050565b600060208201905081810360008301526126ac81612670565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ed82611db7565b91506126f883611db7565b92508282101561270b5761270a6126b3565b5b828203905092915050565b60008160601b9050919050565b600061272e82612716565b9050919050565b600061274082612723565b9050919050565b61275861275382611e10565b612735565b82525050565b6000819050919050565b61277961277482611db7565b61275e565b82525050565b600061278b8285612747565b60148201915061279b8284612768565b6020820191508190509392505050565b7f546f6b656e56657374696e673a2076657374696e67206973206e6f742072657660008201527f6f6361626c650000000000000000000000000000000000000000000000000000602082015250565b600061280760268361223c565b9150612812826127ab565b604082019050919050565b60006020820190508181036000830152612836816127fa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061289960268361223c565b91506128a48261283d565b604082019050919050565b600060208201905081810360008301526128c88161288c565b9050919050565b7f546f6b656e56657374696e673a20696e646578206f7574206f6620626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061292b60218361223c565b9150612936826128cf565b604082019050919050565b6000602082019050818103600083015261295a8161291e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129c660208361223c565b91506129d182612990565b602082019050919050565b600060208201905081810360008301526129f5816129b9565b9050919050565b6000612a0782611db7565b9150612a1283611db7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a4757612a466126b3565b5b828201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612a88601f8361223c565b9150612a9382612a52565b602082019050919050565b60006020820190508181036000830152612ab781612a7b565b9050919050565b6000604082019050612ad36000830185611f54565b612ae06020830184611dc1565b9392505050565b600081519050612af681611e86565b92915050565b600060208284031215612b1257612b11611deb565b5b6000612b2084828501612ae7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612b85602a8361223c565b9150612b9082612b29565b604082019050919050565b60006020820190508181036000830152612bb481612b78565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bf582611db7565b9150612c0083611db7565b925082612c1057612c0f612bbb565b5b828204905092915050565b6000612c2682611db7565b9150612c3183611db7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c6a57612c696126b3565b5b828202905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612cd160268361223c565b9150612cdc82612c75565b604082019050919050565b60006020820190508181036000830152612d0081612cc4565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612d3b578082015181840152602081019050612d20565b83811115612d4a576000848401525b50505050565b6000612d5b82612d07565b612d658185612d12565b9350612d75818560208601612d1d565b80840191505092915050565b6000612d8d8284612d50565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612dce601d8361223c565b9150612dd982612d98565b602082019050919050565b60006020820190508181036000830152612dfd81612dc1565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000612e2b82612e04565b612e35818561223c565b9350612e45818560208601612d1d565b612e4e81612e0f565b840191505092915050565b60006020820190508181036000830152612e738184612e20565b90509291505056fea2646970667358221220abdd70c422e2af32dfb194968ff149ce7420d601e3c6fdd04f232d13d36df0b364736f6c634300080b0033000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a
Deployed Bytecode
0x6080604052600436106101185760003560e01c80638af104da116100a0578063ea1bb3d511610064578063ea1bb3d5146103a7578063f2fde38b146103e4578063f51321d71461040d578063f7c469f01461044a578063f9079b37146104875761011f565b80638af104da146102ae5780638da5cb5b146102eb57806390be10cc146103165780639ef346b414610341578063b75c7dc61461037e5761011f565b806348deb471116100e757806348deb471146101c95780635a7bb69a146101f457806366afd8ef14610231578063715018a61461025a5780637e913dc6146102715761011f565b8063130836171461012157806317e289e91461014c57806321df0da7146101755780632e1a7d4d146101a05761011f565b3661011f57005b005b34801561012d57600080fd5b506101366104c4565b6040516101439190611dd0565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e9190611eb2565b6104d1565b005b34801561018157600080fd5b5061018a610934565b6040516101979190611f63565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190611f7e565b61095c565b005b3480156101d557600080fd5b506101de610a7a565b6040516101eb9190611dd0565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190611fab565b610a84565b6040516102289190611dd0565b60405180910390f35b34801561023d57600080fd5b506102586004803603810190610253919061200e565b610acd565b005b34801561026657600080fd5b5061026f610e2d565b005b34801561027d57600080fd5b5061029860048036038101906102939190611fab565b610e41565b6040516102a59190612147565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612163565b610fa6565b6040516102e291906121b2565b60405180910390f35b3480156102f757600080fd5b50610300610fd9565b60405161030d9190611f63565b60405180910390f35b34801561032257600080fd5b5061032b611002565b6040516103389190611dd0565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906121cd565b6110b7565b6040516103759190612147565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a091906121cd565b6111c8565b005b3480156103b357600080fd5b506103ce60048036038101906103c991906121cd565b611416565b6040516103db9190611dd0565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190611fab565b611599565b005b34801561041957600080fd5b50610434600480360381019061042f9190612163565b61161d565b6040516104419190612147565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c9190611fab565b61163f565b60405161047e91906121b2565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190611f7e565b611691565b6040516104bb91906121b2565b60405180910390f35b6000600280549050905090565b6104d9611702565b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610549919061220f565b101561058a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610581906122e5565b60405180910390fd5b600084116105cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c490612377565b60405180910390fd5b60008111610610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610607906123e3565b60405180910390fd5b6001831015610654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064b90612475565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663f7c469f0896040518263ffffffff1660e01b815260040161068f9190611f63565b602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d091906124aa565b905060006106e7878961178090919063ffffffff16565b90506040518061014001604052806001151581526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001828152602001898152602001878152602001868152602001851515815260200184815260200160008152602001600015158152506003600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548160ff02191690831515021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff02191690831515021790555090505061085e8360045461178090919063ffffffff16565b60048190555060028290806001815401808255809150506001900390600052602060002001600090919091909150556000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506108e560018261178090919063ffffffff16565b600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050565b60007f000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a905090565b610964611796565b61096c611702565b803073ffffffffffffffffffffffffffffffffffffffff166390be10cc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc919061220f565b1015610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612549565b60405180910390fd5b610a6f610a28610fd9565b827f000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a73ffffffffffffffffffffffffffffffffffffffff166117e69092919063ffffffff16565b610a7761186c565b50565b6000600454905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ad5611796565b81600115156003600083815260200190815260200160002060000160009054906101000a900460ff16151514610b0a57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff16151514610b3e57600080fd5b600060036000858152602001908152602001600020905060008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490506000610bb6610fd9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508180610bef5750805b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612601565b60405180910390fd5b6000610d2884604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b905085811015610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490612693565b60405180910390fd5b610d8486856007015461178090919063ffffffff16565b846007018190555060008460000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610dca8760045461199d90919063ffffffff16565b600481905550610e1b81887f000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a73ffffffffffffffffffffffffffffffffffffffff166117e69092919063ffffffff16565b505050505050610e2961186c565b5050565b610e35611702565b610e3f60006119b3565b565b610e49611d48565b60036000610ea2846001600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e9d91906126e2565b610fa6565b8152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b60008282604051602001610fbb92919061277f565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006110b26004547f000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110639190611f63565b602060405180830381865afa158015611080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a4919061220f565b61199d90919063ffffffff16565b905090565b6110bf611d48565b60036000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050919050565b6111d0611702565b80600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461120557600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461123957600080fd5b6000600360008481526020019081526020016000209050600115158160050160009054906101000a900460ff161515146112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f9061281d565b60405180910390fd5b60006113a282604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b905060008111156113b8576113b78482610acd565b5b60006113d58360070154846006015461199d90919063ffffffff16565b90506113ec8160045461199d90919063ffffffff16565b60048190555060018360080160006101000a81548160ff0219169083151502179055505050505050565b600081600115156003600083815260200190815260200160002060000160009054906101000a900460ff1615151461144d57600080fd5b600015156003600083815260200190815260200160002060080160009054906101000a900460ff1615151461148157600080fd5b600060036000858152602001908152602001600020905061159081604051806101400160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff161515151581525050611875565b92505050919050565b6115a1611702565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906128af565b60405180910390fd5b61161a816119b3565b50565b611625611d48565b6116376116328484610fa6565b6110b7565b905092915050565b600061168a82600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fa6565b9050919050565b600061169b6104c4565b82106116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d390612941565b60405180910390fd5b600282815481106116f0576116ef612961565b5b90600052602060002001549050919050565b61170a611a77565b73ffffffffffffffffffffffffffffffffffffffff16611728610fd9565b73ffffffffffffffffffffffffffffffffffffffff161461177e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611775906129dc565b60405180910390fd5b565b6000818361178e91906129fc565b905092915050565b600260015414156117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390612a9e565b60405180910390fd5b6002600181905550565b6118678363a9059cbb60e01b8484604051602401611805929190612abe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a7f565b505050565b60018081905550565b600080611880611b46565b9050826040015181108061189d5750600115158361012001511515145b156118ac576000915050611998565b6118c78360800151846060015161178090919063ffffffff16565b81106118f1576118e98361010001518460e0015161199d90919063ffffffff16565b915050611998565b600061190a84606001518361199d90919063ffffffff16565b905060008460a001519050600061192a8284611b4e90919063ffffffff16565b905060006119418383611b6490919063ffffffff16565b905060006119728860800151611964848b60e00151611b6490919063ffffffff16565b611b4e90919063ffffffff16565b905061198c8861010001518261199d90919063ffffffff16565b90508096505050505050505b919050565b600081836119ab91906126e2565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000611ae1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b7a9092919063ffffffff16565b9050600081511115611b415780806020019051810190611b019190612afc565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790612b9b565b60405180910390fd5b5b505050565b600042905090565b60008183611b5c9190612bea565b905092915050565b60008183611b729190612c1b565b905092915050565b6060611b898484600085611b92565b90509392505050565b606082471015611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90612ce7565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c009190612d81565b60006040518083038185875af1925050503d8060008114611c3d576040519150601f19603f3d011682016040523d82523d6000602084013e611c42565b606091505b5091509150611c5387838387611c5f565b92505050949350505050565b60608315611cc257600083511415611cba57611c7a85611cd5565b611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090612de4565b60405180910390fd5b5b829050611ccd565b611ccc8383611cf8565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611d0b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9190612e59565b60405180910390fd5b604051806101400160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000151581525090565b6000819050919050565b611dca81611db7565b82525050565b6000602082019050611de56000830184611dc1565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e1b82611df0565b9050919050565b611e2b81611e10565b8114611e3657600080fd5b50565b600081359050611e4881611e22565b92915050565b611e5781611db7565b8114611e6257600080fd5b50565b600081359050611e7481611e4e565b92915050565b60008115159050919050565b611e8f81611e7a565b8114611e9a57600080fd5b50565b600081359050611eac81611e86565b92915050565b600080600080600080600060e0888a031215611ed157611ed0611deb565b5b6000611edf8a828b01611e39565b9750506020611ef08a828b01611e65565b9650506040611f018a828b01611e65565b9550506060611f128a828b01611e65565b9450506080611f238a828b01611e65565b93505060a0611f348a828b01611e9d565b92505060c0611f458a828b01611e65565b91505092959891949750929550565b611f5d81611e10565b82525050565b6000602082019050611f786000830184611f54565b92915050565b600060208284031215611f9457611f93611deb565b5b6000611fa284828501611e65565b91505092915050565b600060208284031215611fc157611fc0611deb565b5b6000611fcf84828501611e39565b91505092915050565b6000819050919050565b611feb81611fd8565b8114611ff657600080fd5b50565b60008135905061200881611fe2565b92915050565b6000806040838503121561202557612024611deb565b5b600061203385828601611ff9565b925050602061204485828601611e65565b9150509250929050565b61205781611e7a565b82525050565b61206681611e10565b82525050565b61207581611db7565b82525050565b61014082016000820151612092600085018261204e565b5060208201516120a5602085018261205d565b5060408201516120b8604085018261206c565b5060608201516120cb606085018261206c565b5060808201516120de608085018261206c565b5060a08201516120f160a085018261206c565b5060c082015161210460c085018261204e565b5060e082015161211760e085018261206c565b5061010082015161212c61010085018261206c565b5061012082015161214161012085018261204e565b50505050565b60006101408201905061215d600083018461207b565b92915050565b6000806040838503121561217a57612179611deb565b5b600061218885828601611e39565b925050602061219985828601611e65565b9150509250929050565b6121ac81611fd8565b82525050565b60006020820190506121c760008301846121a3565b92915050565b6000602082840312156121e3576121e2611deb565b5b60006121f184828501611ff9565b91505092915050565b60008151905061220981611e4e565b92915050565b60006020828403121561222557612224611deb565b5b6000612233848285016121fa565b91505092915050565b600082825260208201905092915050565b7f546f6b656e56657374696e673a2063616e6e6f7420637265617465207665737460008201527f696e67207363686564756c652062656361757365206e6f74207375666669636960208201527f656e7420746f6b656e7300000000000000000000000000000000000000000000604082015250565b60006122cf604a8361223c565b91506122da8261224d565b606082019050919050565b600060208201905081810360008301526122fe816122c2565b9050919050565b7f546f6b656e56657374696e673a206475726174696f6e206d757374206265203e60008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061236160228361223c565b915061236c82612305565b604082019050919050565b6000602082019050818103600083015261239081612354565b9050919050565b7f546f6b656e56657374696e673a20616d6f756e74206d757374206265203e2030600082015250565b60006123cd60208361223c565b91506123d882612397565b602082019050919050565b600060208201905081810360008301526123fc816123c0565b9050919050565b7f546f6b656e56657374696e673a20736c696365506572696f645365636f6e647360008201527f206d757374206265203e3d203100000000000000000000000000000000000000602082015250565b600061245f602d8361223c565b915061246a82612403565b604082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b6000815190506124a481611fe2565b92915050565b6000602082840312156124c0576124bf611deb565b5b60006124ce84828501612495565b91505092915050565b7f546f6b656e56657374696e673a206e6f7420656e6f756768207769746864726160008201527f7761626c652066756e6473000000000000000000000000000000000000000000602082015250565b6000612533602b8361223c565b915061253e826124d7565b604082019050919050565b6000602082019050818103600083015261256281612526565b9050919050565b7f546f6b656e56657374696e673a206f6e6c792062656e6566696369617279206160008201527f6e64206f776e65722063616e2072656c656173652076657374656420746f6b6560208201527f6e73000000000000000000000000000000000000000000000000000000000000604082015250565b60006125eb60428361223c565b91506125f682612569565b606082019050919050565b6000602082019050818103600083015261261a816125de565b9050919050565b7f546f6b656e56657374696e673a2063616e6e6f742072656c6561736520746f6b60008201527f656e732c206e6f7420656e6f7567682076657374656420746f6b656e73000000602082015250565b600061267d603d8361223c565b915061268882612621565b604082019050919050565b600060208201905081810360008301526126ac81612670565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ed82611db7565b91506126f883611db7565b92508282101561270b5761270a6126b3565b5b828203905092915050565b60008160601b9050919050565b600061272e82612716565b9050919050565b600061274082612723565b9050919050565b61275861275382611e10565b612735565b82525050565b6000819050919050565b61277961277482611db7565b61275e565b82525050565b600061278b8285612747565b60148201915061279b8284612768565b6020820191508190509392505050565b7f546f6b656e56657374696e673a2076657374696e67206973206e6f742072657660008201527f6f6361626c650000000000000000000000000000000000000000000000000000602082015250565b600061280760268361223c565b9150612812826127ab565b604082019050919050565b60006020820190508181036000830152612836816127fa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061289960268361223c565b91506128a48261283d565b604082019050919050565b600060208201905081810360008301526128c88161288c565b9050919050565b7f546f6b656e56657374696e673a20696e646578206f7574206f6620626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061292b60218361223c565b9150612936826128cf565b604082019050919050565b6000602082019050818103600083015261295a8161291e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129c660208361223c565b91506129d182612990565b602082019050919050565b600060208201905081810360008301526129f5816129b9565b9050919050565b6000612a0782611db7565b9150612a1283611db7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a4757612a466126b3565b5b828201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612a88601f8361223c565b9150612a9382612a52565b602082019050919050565b60006020820190508181036000830152612ab781612a7b565b9050919050565b6000604082019050612ad36000830185611f54565b612ae06020830184611dc1565b9392505050565b600081519050612af681611e86565b92915050565b600060208284031215612b1257612b11611deb565b5b6000612b2084828501612ae7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612b85602a8361223c565b9150612b9082612b29565b604082019050919050565b60006020820190508181036000830152612bb481612b78565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bf582611db7565b9150612c0083611db7565b925082612c1057612c0f612bbb565b5b828204905092915050565b6000612c2682611db7565b9150612c3183611db7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c6a57612c696126b3565b5b828202905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612cd160268361223c565b9150612cdc82612c75565b604082019050919050565b60006020820190508181036000830152612d0081612cc4565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612d3b578082015181840152602081019050612d20565b83811115612d4a576000848401525b50505050565b6000612d5b82612d07565b612d658185612d12565b9350612d75818560208601612d1d565b80840191505092915050565b6000612d8d8284612d50565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612dce601d8361223c565b9150612dd982612d98565b602082019050919050565b60006020820190508181036000830152612dfd81612dc1565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000612e2b82612e04565b612e35818561223c565b9350612e45818560208601612d1d565b612e4e81612e0f565b840191505092915050565b60006020820190508181036000830152612e738184612e20565b90509291505056fea2646970667358221220abdd70c422e2af32dfb194968ff149ce7420d601e3c6fdd04f232d13d36df0b364736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a
-----Decoded View---------------
Arg [0] : token_ (address): 0xd7878b71eAc29080559491D16419Ca97cfcFfD3a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7878b71eac29080559491d16419ca97cfcffd3a
Deployed Bytecode Sourcemap
45699:12035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54129:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50117:1409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49359:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52522:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49110:140;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48036:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52952:1027;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24903:103;;;;;;;;;;;;;:::i;:::-;;55853:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56214:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24255:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55242:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54918:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51681:714;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54425:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25161:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48729:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55531:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48328:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54129:143;54212:7;54238:19;:26;;;;54231:33;;54129:143;:::o;50117:1409::-;24141:13;:11;:13::i;:::-;50453:7:::1;50421:4;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;50399:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;50593:1;50581:9;:13;50573:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50662:1;50652:7;:11;50644:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50742:1;50719:19;:24;;50711:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50804:25;50832:4;:42;;;50875:12;50832:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50804:84;;50899:13;50915:18;50926:6;50915;:10;;:18;;;;:::i;:::-;50899:34;;50982:254;;;;;;;;51012:4;50982:254;;;;;;51031:12;50982:254;;;;;;51058:5;50982:254;;;;51078:6;50982:254;;;;51099:9;50982:254;;;;51123:19;50982:254;;;;51157:10;50982:254;;;;;;51182:7;50982:254;;;;51204:1;50982:254;;;;51220:5;50982:254;;;;::::0;50944:16:::1;:35;50961:17;50944:35;;;;;;;;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51277:40;51309:7;51277:27;;:31;;:40;;;;:::i;:::-;51247:27;:70;;;;51328:19;51353:17;51328:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51382:27;51412:19;:33;51432:12;51412:33;;;;;;;;;;;;;;;;51382:63;;51492:26;51516:1;51492:19;:23;;:26;;;;:::i;:::-;51456:19;:33;51476:12;51456:33;;;;;;;;;;;;;;;:62;;;;50388:1138;;;50117:1409:::0;;;;;;;:::o;49359:106::-;49416:7;49450:6;49435:22;;49359:106;:::o;52522:250::-;21570:21;:19;:21::i;:::-;24141:13:::1;:11;:13::i;:::-;52663:6:::2;52631:4;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;52623:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;52728:36;52748:7;:5;:7::i;:::-;52757:6;52728;:19;;;;:36;;;;;:::i;:::-;21614:20:::0;:18;:20::i;:::-;52522:250;:::o;49110:140::-;49189:7;49215:27;;49208:34;;49110:140;:::o;48036:173::-;48142:7;48168:19;:33;48188:12;48168:33;;;;;;;;;;;;;;;;48161:40;;48036:173;;;:::o;52952:1027::-;21570:21;:19;:21::i;:::-;53116:17:::1;47474:4;47423:55;;:16;:35;47440:17;47423:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;47415:64;;;::::0;::::1;;47545:5;47498:52;;:16;:35;47515:17;47498:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;47490:61;;;::::0;::::1;;53145:39:::2;53187:16;:35;53204:17;53187:35;;;;;;;;;;;53145:77;;53233:18;53268:15;:27;;;;;;;;;;;;53254:41;;:10;:41;;;53233:62;;53306:12;53335:7;:5;:7::i;:::-;53321:21;;:10;:21;;;53306:36;;53375:13;:24;;;;53392:7;53375:24;53353:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;53504:20;53527:41;53552:15;53527:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;53504:64;;53603:6;53587:12;:22;;53579:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;53713:36;53742:6;53713:15;:24;;;:28;;:36;;;;:::i;:::-;53686:15;:24;;:63;;;;53760:34;53805:15;:27;;;;;;;;;;;;53760:73;;53874:39;53906:6;53874:27;;:31;;:39;;;;:::i;:::-;53844:27;:69;;;;53924:47;53944:18;53964:6;53924;:19;;;;:47;;;;;:::i;:::-;53134:845;;;;;21602:1:::1;21614:20:::0;:18;:20::i;:::-;52952:1027;;:::o;24903:103::-;24141:13;:11;:13::i;:::-;24968:30:::1;24995:1;24968:18;:30::i;:::-;24903:103::o:0;55853:254::-;55957:22;;:::i;:::-;55998:16;:101;56015:83;56058:6;56096:1;56066:19;:27;56086:6;56066:27;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;56015:42;:83::i;:::-;55998:101;;;;;;;;;;;55991:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55853:254;;;:::o;56214:206::-;56344:7;56397:6;56405:5;56380:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56370:42;;;;;;56363:49;;56214:206;;;;:::o;24255:87::-;24301:7;24328:6;;;;;;;;;;;24321:13;;24255:87;:::o;55242:178::-;55322:7;55348:64;55384:27;;55348:6;:16;;;55373:4;55348:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;:64;;;;:::i;:::-;55341:71;;55242:178;:::o;54918:186::-;55020:22;;:::i;:::-;55061:16;:35;55078:17;55061:35;;;;;;;;;;;55054:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54918:186;;;:::o;51681:714::-;24141:13;:11;:13::i;:::-;51800:17:::1;47474:4;47423:55;;:16;:35;47440:17;47423:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;47415:64;;;::::0;::::1;;47545:5;47498:52;;:16;:35;47515:17;47498:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;47490:61;;;::::0;::::1;;51829:39:::2;51871:16;:35;51888:17;51871:35;;;;;;;;;;;51829:77;;51954:4;51925:33;;:15;:25;;;;;;;;;;;;:33;;;51917:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;52012:20;52035:41;52060:15;52035:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;52012:64;;52105:1;52090:12;:16;52087:87;;;52122:40;52130:17;52149:12;52122:7;:40::i;:::-;52087:87;52184:18;52205:57;52237:15;:24;;;52205:15;:27;;;:31;;:57;;;;:::i;:::-;52184:78;;52303:43;52335:10;52303:27;;:31;;:43;;;;:::i;:::-;52273:27;:73;;;;52383:4;52357:15;:23;;;:30;;;;;;;;;;;;;;;;;;51818:577;;;24165:1:::1;51681:714:::0;:::o;54425:330::-;54592:7;54542:17;47474:4;47423:55;;:16;:35;47440:17;47423:35;;;;;;;;;;;:47;;;;;;;;;;;;:55;;;47415:64;;;;;;47545:5;47498:52;;:16;:35;47515:17;47498:35;;;;;;;;;;;:43;;;;;;;;;;;;:52;;;47490:61;;;;;;54611:39:::1;54653:16;:35;54670:17;54653:35;;;;;;;;;;;54611:77;;54706:41;54731:15;54706:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:24;:41::i;:::-;54699:48;;;54425:330:::0;;;;:::o;25161:201::-;24141:13;:11;:13::i;:::-;25270:1:::1;25250:22;;:8;:22;;;;25242:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25326:28;25345:8;25326:18;:28::i;:::-;25161:201:::0;:::o;48729:239::-;48842:22;;:::i;:::-;48883:77;48902:57;48945:6;48953:5;48902:42;:57::i;:::-;48883:18;:77::i;:::-;48876:84;;48729:239;;;;:::o;55531:223::-;55641:7;55667:79;55710:6;55718:19;:27;55738:6;55718:27;;;;;;;;;;;;;;;;55667:42;:79::i;:::-;55660:86;;55531:223;;;:::o;48328:232::-;48409:7;48444:26;:24;:26::i;:::-;48436:5;:34;48428:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;48526:19;48546:5;48526:26;;;;;;;;:::i;:::-;;;;;;;;;;48519:33;;48328:232;;;:::o;24420:132::-;24495:12;:10;:12::i;:::-;24484:23;;:7;:5;:7::i;:::-;:23;;;24476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24420:132::o;41431:98::-;41489:7;41520:1;41516;:5;;;;:::i;:::-;41509:12;;41431:98;;;;:::o;21650:293::-;21052:1;21784:7;;:19;;21776:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21052:1;21917:7;:18;;;;21650:293::o;15456:211::-;15573:86;15593:5;15623:23;;;15648:2;15652:5;15600:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15573:19;:86::i;:::-;15456:211;;;:::o;21951:213::-;21008:1;22134:7;:22;;;;21951:213::o;56569:1011::-;56680:7;56699:19;56721:16;:14;:16::i;:::-;56699:38;;56767:15;:21;;;56753:11;:35;56752:72;;;;56820:4;56793:31;;:15;:23;;;:31;;;56752:72;56748:825;;;56848:1;56841:8;;;;;56748:825;56886:51;56912:15;:24;;;56886:15;:21;;;:25;;:51;;;;:::i;:::-;56871:11;:66;56867:706;;56961:57;56993:15;:24;;;56961:15;:27;;;:31;;:57;;;;:::i;:::-;56954:64;;;;;56867:706;57051:21;57075:38;57091:15;:21;;;57075:11;:15;;:38;;;;:::i;:::-;57051:62;;57128:20;57151:15;:34;;;57128:57;;57200:26;57229:34;57247:15;57229:13;:17;;:34;;;;:::i;:::-;57200:63;;57278:21;57302:39;57325:15;57302:18;:22;;:39;;;;:::i;:::-;57278:63;;57356:20;57379:76;57430:15;:24;;;57379:46;57411:13;57379:15;:27;;;:31;;:46;;;;:::i;:::-;:50;;:76;;;;:::i;:::-;57356:99;;57485:42;57502:15;:24;;;57485:12;:16;;:42;;;;:::i;:::-;57470:57;;57549:12;57542:19;;;;;;;;56569:1011;;;;:::o;41812:98::-;41870:7;41901:1;41897;:5;;;;:::i;:::-;41890:12;;41812:98;;;;:::o;25522:191::-;25596:16;25615:6;;;;;;;;;;;25596:25;;25641:8;25632:6;;:17;;;;;;;;;;;;;;;;;;25696:8;25665:40;;25686:8;25665:40;;;;;;;;;;;;25585:128;25522:191;:::o;22829:98::-;22882:7;22909:10;22902:17;;22829:98;:::o;18523:716::-;18947:23;18973:69;19001:4;18973:69;;;;;;;;;;;;;;;;;18981:5;18973:27;;;;:69;;;;;:::i;:::-;18947:95;;19077:1;19057:10;:17;:21;19053:179;;;19154:10;19143:30;;;;;;;;;;;;:::i;:::-;19135:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19053:179;18593:646;18523:716;;:::o;57588:141::-;57680:7;57706:15;57699:22;;57588:141;:::o;42568:98::-;42626:7;42657:1;42653;:5;;;;:::i;:::-;42646:12;;42568:98;;;;:::o;42169:::-;42227:7;42258:1;42254;:5;;;;:::i;:::-;42247:12;;42169:98;;;;:::o;9327:229::-;9464:12;9496:52;9518:6;9526:4;9532:1;9535:12;9496:21;:52::i;:::-;9489:59;;9327:229;;;;;:::o;10447:455::-;10617:12;10675:5;10650:21;:30;;10642:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10735:12;10749:23;10776:6;:11;;10795:5;10802:4;10776:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10734:73;;;;10825:69;10852:6;10860:7;10869:10;10881:12;10825:26;:69::i;:::-;10818:76;;;;10447:455;;;;;;:::o;13020:644::-;13205:12;13234:7;13230:427;;;13283:1;13262:10;:17;:22;13258:290;;;13480:18;13491:6;13480:10;:18::i;:::-;13472:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;13258:290;13569:10;13562:17;;;;13230:427;13612:33;13620:10;13632:12;13612:7;:33::i;:::-;13020:644;;;;;;;:::o;6570:326::-;6630:4;6887:1;6865:7;:19;;;:23;6858:30;;6570:326;;;:::o;14206:552::-;14387:1;14367:10;:17;:21;14363:388;;;14599:10;14593:17;14656:15;14643:10;14639:2;14635:19;14628:44;14363:388;14726:12;14719:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:122::-;1349:24;1367:5;1349:24;:::i;:::-;1342:5;1339:35;1329:63;;1388:1;1385;1378:12;1329:63;1276:122;:::o;1404:139::-;1450:5;1488:6;1475:20;1466:29;;1504:33;1531:5;1504:33;:::i;:::-;1404:139;;;;:::o;1549:90::-;1583:7;1626:5;1619:13;1612:21;1601:32;;1549:90;;;:::o;1645:116::-;1715:21;1730:5;1715:21;:::i;:::-;1708:5;1705:32;1695:60;;1751:1;1748;1741:12;1695:60;1645:116;:::o;1767:133::-;1810:5;1848:6;1835:20;1826:29;;1864:30;1888:5;1864:30;:::i;:::-;1767:133;;;;:::o;1906:1197::-;2016:6;2024;2032;2040;2048;2056;2064;2113:3;2101:9;2092:7;2088:23;2084:33;2081:120;;;2120:79;;:::i;:::-;2081:120;2240:1;2265:53;2310:7;2301:6;2290:9;2286:22;2265:53;:::i;:::-;2255:63;;2211:117;2367:2;2393:53;2438:7;2429:6;2418:9;2414:22;2393:53;:::i;:::-;2383:63;;2338:118;2495:2;2521:53;2566:7;2557:6;2546:9;2542:22;2521:53;:::i;:::-;2511:63;;2466:118;2623:2;2649:53;2694:7;2685:6;2674:9;2670:22;2649:53;:::i;:::-;2639:63;;2594:118;2751:3;2778:53;2823:7;2814:6;2803:9;2799:22;2778:53;:::i;:::-;2768:63;;2722:119;2880:3;2907:50;2949:7;2940:6;2929:9;2925:22;2907:50;:::i;:::-;2897:60;;2851:116;3006:3;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2977:119;1906:1197;;;;;;;;;;:::o;3109:118::-;3196:24;3214:5;3196:24;:::i;:::-;3191:3;3184:37;3109:118;;:::o;3233:222::-;3326:4;3364:2;3353:9;3349:18;3341:26;;3377:71;3445:1;3434:9;3430:17;3421:6;3377:71;:::i;:::-;3233:222;;;;:::o;3461:329::-;3520:6;3569:2;3557:9;3548:7;3544:23;3540:32;3537:119;;;3575:79;;:::i;:::-;3537:119;3695:1;3720:53;3765:7;3756:6;3745:9;3741:22;3720:53;:::i;:::-;3710:63;;3666:117;3461:329;;;;:::o;3796:::-;3855:6;3904:2;3892:9;3883:7;3879:23;3875:32;3872:119;;;3910:79;;:::i;:::-;3872:119;4030:1;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;:::i;:::-;4045:63;;4001:117;3796:329;;;;:::o;4131:77::-;4168:7;4197:5;4186:16;;4131:77;;;:::o;4214:122::-;4287:24;4305:5;4287:24;:::i;:::-;4280:5;4277:35;4267:63;;4326:1;4323;4316:12;4267:63;4214:122;:::o;4342:139::-;4388:5;4426:6;4413:20;4404:29;;4442:33;4469:5;4442:33;:::i;:::-;4342:139;;;;:::o;4487:474::-;4555:6;4563;4612:2;4600:9;4591:7;4587:23;4583:32;4580:119;;;4618:79;;:::i;:::-;4580:119;4738:1;4763:53;4808:7;4799:6;4788:9;4784:22;4763:53;:::i;:::-;4753:63;;4709:117;4865:2;4891:53;4936:7;4927:6;4916:9;4912:22;4891:53;:::i;:::-;4881:63;;4836:118;4487:474;;;;;:::o;4967:99::-;5038:21;5053:5;5038:21;:::i;:::-;5033:3;5026:34;4967:99;;:::o;5072:108::-;5149:24;5167:5;5149:24;:::i;:::-;5144:3;5137:37;5072:108;;:::o;5186:::-;5263:24;5281:5;5263:24;:::i;:::-;5258:3;5251:37;5186:108;;:::o;5382:1960::-;5545:6;5540:3;5536:16;5641:4;5634:5;5630:16;5624:23;5660:57;5711:4;5706:3;5702:14;5688:12;5660:57;:::i;:::-;5562:165;5816:4;5809:5;5805:16;5799:23;5835:63;5892:4;5887:3;5883:14;5869:12;5835:63;:::i;:::-;5737:171;5991:4;5984:5;5980:16;5974:23;6010:63;6067:4;6062:3;6058:14;6044:12;6010:63;:::i;:::-;5918:165;6166:4;6159:5;6155:16;6149:23;6185:63;6242:4;6237:3;6233:14;6219:12;6185:63;:::i;:::-;6093:165;6344:4;6337:5;6333:16;6327:23;6363:63;6420:4;6415:3;6411:14;6397:12;6363:63;:::i;:::-;6268:168;6532:4;6525:5;6521:16;6515:23;6551:63;6608:4;6603:3;6599:14;6585:12;6551:63;:::i;:::-;6446:178;6711:4;6704:5;6700:16;6694:23;6730:57;6781:4;6776:3;6772:14;6758:12;6730:57;:::i;:::-;6634:163;6886:4;6879:5;6875:16;6869:23;6905:63;6962:4;6957:3;6953:14;6939:12;6905:63;:::i;:::-;6807:171;7064:6;7057:5;7053:18;7047:25;7085:65;7142:6;7137:3;7133:16;7119:12;7085:65;:::i;:::-;6988:172;7245:6;7238:5;7234:18;7228:25;7266:59;7317:6;7312:3;7308:16;7294:12;7266:59;:::i;:::-;7170:165;5514:1828;5382:1960;;:::o;7348:355::-;7507:4;7545:3;7534:9;7530:19;7522:27;;7559:137;7693:1;7682:9;7678:17;7669:6;7559:137;:::i;:::-;7348:355;;;;:::o;7709:474::-;7777:6;7785;7834:2;7822:9;7813:7;7809:23;7805:32;7802:119;;;7840:79;;:::i;:::-;7802:119;7960:1;7985:53;8030:7;8021:6;8010:9;8006:22;7985:53;:::i;:::-;7975:63;;7931:117;8087:2;8113:53;8158:7;8149:6;8138:9;8134:22;8113:53;:::i;:::-;8103:63;;8058:118;7709:474;;;;;:::o;8189:118::-;8276:24;8294:5;8276:24;:::i;:::-;8271:3;8264:37;8189:118;;:::o;8313:222::-;8406:4;8444:2;8433:9;8429:18;8421:26;;8457:71;8525:1;8514:9;8510:17;8501:6;8457:71;:::i;:::-;8313:222;;;;:::o;8541:329::-;8600:6;8649:2;8637:9;8628:7;8624:23;8620:32;8617:119;;;8655:79;;:::i;:::-;8617:119;8775:1;8800:53;8845:7;8836:6;8825:9;8821:22;8800:53;:::i;:::-;8790:63;;8746:117;8541:329;;;;:::o;8876:143::-;8933:5;8964:6;8958:13;8949:22;;8980:33;9007:5;8980:33;:::i;:::-;8876:143;;;;:::o;9025:351::-;9095:6;9144:2;9132:9;9123:7;9119:23;9115:32;9112:119;;;9150:79;;:::i;:::-;9112:119;9270:1;9295:64;9351:7;9342:6;9331:9;9327:22;9295:64;:::i;:::-;9285:74;;9241:128;9025:351;;;;:::o;9382:169::-;9466:11;9500:6;9495:3;9488:19;9540:4;9535:3;9531:14;9516:29;;9382:169;;;;:::o;9557:298::-;9697:34;9693:1;9685:6;9681:14;9674:58;9766:34;9761:2;9753:6;9749:15;9742:59;9835:12;9830:2;9822:6;9818:15;9811:37;9557:298;:::o;9861:366::-;10003:3;10024:67;10088:2;10083:3;10024:67;:::i;:::-;10017:74;;10100:93;10189:3;10100:93;:::i;:::-;10218:2;10213:3;10209:12;10202:19;;9861:366;;;:::o;10233:419::-;10399:4;10437:2;10426:9;10422:18;10414:26;;10486:9;10480:4;10476:20;10472:1;10461:9;10457:17;10450:47;10514:131;10640:4;10514:131;:::i;:::-;10506:139;;10233:419;;;:::o;10658:221::-;10798:34;10794:1;10786:6;10782:14;10775:58;10867:4;10862:2;10854:6;10850:15;10843:29;10658:221;:::o;10885:366::-;11027:3;11048:67;11112:2;11107:3;11048:67;:::i;:::-;11041:74;;11124:93;11213:3;11124:93;:::i;:::-;11242:2;11237:3;11233:12;11226:19;;10885:366;;;:::o;11257:419::-;11423:4;11461:2;11450:9;11446:18;11438:26;;11510:9;11504:4;11500:20;11496:1;11485:9;11481:17;11474:47;11538:131;11664:4;11538:131;:::i;:::-;11530:139;;11257:419;;;:::o;11682:182::-;11822:34;11818:1;11810:6;11806:14;11799:58;11682:182;:::o;11870:366::-;12012:3;12033:67;12097:2;12092:3;12033:67;:::i;:::-;12026:74;;12109:93;12198:3;12109:93;:::i;:::-;12227:2;12222:3;12218:12;12211:19;;11870:366;;;:::o;12242:419::-;12408:4;12446:2;12435:9;12431:18;12423:26;;12495:9;12489:4;12485:20;12481:1;12470:9;12466:17;12459:47;12523:131;12649:4;12523:131;:::i;:::-;12515:139;;12242:419;;;:::o;12667:232::-;12807:34;12803:1;12795:6;12791:14;12784:58;12876:15;12871:2;12863:6;12859:15;12852:40;12667:232;:::o;12905:366::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:419::-;13443:4;13481:2;13470:9;13466:18;13458:26;;13530:9;13524:4;13520:20;13516:1;13505:9;13501:17;13494:47;13558:131;13684:4;13558:131;:::i;:::-;13550:139;;13277:419;;;:::o;13702:143::-;13759:5;13790:6;13784:13;13775:22;;13806:33;13833:5;13806:33;:::i;:::-;13702:143;;;;:::o;13851:351::-;13921:6;13970:2;13958:9;13949:7;13945:23;13941:32;13938:119;;;13976:79;;:::i;:::-;13938:119;14096:1;14121:64;14177:7;14168:6;14157:9;14153:22;14121:64;:::i;:::-;14111:74;;14067:128;13851:351;;;;:::o;14208:230::-;14348:34;14344:1;14336:6;14332:14;14325:58;14417:13;14412:2;14404:6;14400:15;14393:38;14208:230;:::o;14444:366::-;14586:3;14607:67;14671:2;14666:3;14607:67;:::i;:::-;14600:74;;14683:93;14772:3;14683:93;:::i;:::-;14801:2;14796:3;14792:12;14785:19;;14444:366;;;:::o;14816:419::-;14982:4;15020:2;15009:9;15005:18;14997:26;;15069:9;15063:4;15059:20;15055:1;15044:9;15040:17;15033:47;15097:131;15223:4;15097:131;:::i;:::-;15089:139;;14816:419;;;:::o;15241:290::-;15381:34;15377:1;15369:6;15365:14;15358:58;15450:34;15445:2;15437:6;15433:15;15426:59;15519:4;15514:2;15506:6;15502:15;15495:29;15241:290;:::o;15537:366::-;15679:3;15700:67;15764:2;15759:3;15700:67;:::i;:::-;15693:74;;15776:93;15865:3;15776:93;:::i;:::-;15894:2;15889:3;15885:12;15878:19;;15537:366;;;:::o;15909:419::-;16075:4;16113:2;16102:9;16098:18;16090:26;;16162:9;16156:4;16152:20;16148:1;16137:9;16133:17;16126:47;16190:131;16316:4;16190:131;:::i;:::-;16182:139;;15909:419;;;:::o;16334:248::-;16474:34;16470:1;16462:6;16458:14;16451:58;16543:31;16538:2;16530:6;16526:15;16519:56;16334:248;:::o;16588:366::-;16730:3;16751:67;16815:2;16810:3;16751:67;:::i;:::-;16744:74;;16827:93;16916:3;16827:93;:::i;:::-;16945:2;16940:3;16936:12;16929:19;;16588:366;;;:::o;16960:419::-;17126:4;17164:2;17153:9;17149:18;17141:26;;17213:9;17207:4;17203:20;17199:1;17188:9;17184:17;17177:47;17241:131;17367:4;17241:131;:::i;:::-;17233:139;;16960:419;;;:::o;17385:180::-;17433:77;17430:1;17423:88;17530:4;17527:1;17520:15;17554:4;17551:1;17544:15;17571:191;17611:4;17631:20;17649:1;17631:20;:::i;:::-;17626:25;;17665:20;17683:1;17665:20;:::i;:::-;17660:25;;17704:1;17701;17698:8;17695:34;;;17709:18;;:::i;:::-;17695:34;17754:1;17751;17747:9;17739:17;;17571:191;;;;:::o;17768:94::-;17801:8;17849:5;17845:2;17841:14;17820:35;;17768:94;;;:::o;17868:::-;17907:7;17936:20;17950:5;17936:20;:::i;:::-;17925:31;;17868:94;;;:::o;17968:100::-;18007:7;18036:26;18056:5;18036:26;:::i;:::-;18025:37;;17968:100;;;:::o;18074:157::-;18179:45;18199:24;18217:5;18199:24;:::i;:::-;18179:45;:::i;:::-;18174:3;18167:58;18074:157;;:::o;18237:79::-;18276:7;18305:5;18294:16;;18237:79;;;:::o;18322:157::-;18427:45;18447:24;18465:5;18447:24;:::i;:::-;18427:45;:::i;:::-;18422:3;18415:58;18322:157;;:::o;18485:397::-;18625:3;18640:75;18711:3;18702:6;18640:75;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18753:75;18824:3;18815:6;18753:75;:::i;:::-;18853:2;18848:3;18844:12;18837:19;;18873:3;18866:10;;18485:397;;;;;:::o;18888:225::-;19028:34;19024:1;19016:6;19012:14;19005:58;19097:8;19092:2;19084:6;19080:15;19073:33;18888:225;:::o;19119:366::-;19261:3;19282:67;19346:2;19341:3;19282:67;:::i;:::-;19275:74;;19358:93;19447:3;19358:93;:::i;:::-;19476:2;19471:3;19467:12;19460:19;;19119:366;;;:::o;19491:419::-;19657:4;19695:2;19684:9;19680:18;19672:26;;19744:9;19738:4;19734:20;19730:1;19719:9;19715:17;19708:47;19772:131;19898:4;19772:131;:::i;:::-;19764:139;;19491:419;;;:::o;19916:225::-;20056:34;20052:1;20044:6;20040:14;20033:58;20125:8;20120:2;20112:6;20108:15;20101:33;19916:225;:::o;20147:366::-;20289:3;20310:67;20374:2;20369:3;20310:67;:::i;:::-;20303:74;;20386:93;20475:3;20386:93;:::i;:::-;20504:2;20499:3;20495:12;20488:19;;20147:366;;;:::o;20519:419::-;20685:4;20723:2;20712:9;20708:18;20700:26;;20772:9;20766:4;20762:20;20758:1;20747:9;20743:17;20736:47;20800:131;20926:4;20800:131;:::i;:::-;20792:139;;20519:419;;;:::o;20944:220::-;21084:34;21080:1;21072:6;21068:14;21061:58;21153:3;21148:2;21140:6;21136:15;21129:28;20944:220;:::o;21170:366::-;21312:3;21333:67;21397:2;21392:3;21333:67;:::i;:::-;21326:74;;21409:93;21498:3;21409:93;:::i;:::-;21527:2;21522:3;21518:12;21511:19;;21170:366;;;:::o;21542:419::-;21708:4;21746:2;21735:9;21731:18;21723:26;;21795:9;21789:4;21785:20;21781:1;21770:9;21766:17;21759:47;21823:131;21949:4;21823:131;:::i;:::-;21815:139;;21542:419;;;:::o;21967:180::-;22015:77;22012:1;22005:88;22112:4;22109:1;22102:15;22136:4;22133:1;22126:15;22153:182;22293:34;22289:1;22281:6;22277:14;22270:58;22153:182;:::o;22341:366::-;22483:3;22504:67;22568:2;22563:3;22504:67;:::i;:::-;22497:74;;22580:93;22669:3;22580:93;:::i;:::-;22698:2;22693:3;22689:12;22682:19;;22341:366;;;:::o;22713:419::-;22879:4;22917:2;22906:9;22902:18;22894:26;;22966:9;22960:4;22956:20;22952:1;22941:9;22937:17;22930:47;22994:131;23120:4;22994:131;:::i;:::-;22986:139;;22713:419;;;:::o;23138:305::-;23178:3;23197:20;23215:1;23197:20;:::i;:::-;23192:25;;23231:20;23249:1;23231:20;:::i;:::-;23226:25;;23385:1;23317:66;23313:74;23310:1;23307:81;23304:107;;;23391:18;;:::i;:::-;23304:107;23435:1;23432;23428:9;23421:16;;23138:305;;;;:::o;23449:181::-;23589:33;23585:1;23577:6;23573:14;23566:57;23449:181;:::o;23636:366::-;23778:3;23799:67;23863:2;23858:3;23799:67;:::i;:::-;23792:74;;23875:93;23964:3;23875:93;:::i;:::-;23993:2;23988:3;23984:12;23977:19;;23636:366;;;:::o;24008:419::-;24174:4;24212:2;24201:9;24197:18;24189:26;;24261:9;24255:4;24251:20;24247:1;24236:9;24232:17;24225:47;24289:131;24415:4;24289:131;:::i;:::-;24281:139;;24008:419;;;:::o;24433:332::-;24554:4;24592:2;24581:9;24577:18;24569:26;;24605:71;24673:1;24662:9;24658:17;24649:6;24605:71;:::i;:::-;24686:72;24754:2;24743:9;24739:18;24730:6;24686:72;:::i;:::-;24433:332;;;;;:::o;24771:137::-;24825:5;24856:6;24850:13;24841:22;;24872:30;24896:5;24872:30;:::i;:::-;24771:137;;;;:::o;24914:345::-;24981:6;25030:2;25018:9;25009:7;25005:23;25001:32;24998:119;;;25036:79;;:::i;:::-;24998:119;25156:1;25181:61;25234:7;25225:6;25214:9;25210:22;25181:61;:::i;:::-;25171:71;;25127:125;24914:345;;;;:::o;25265:229::-;25405:34;25401:1;25393:6;25389:14;25382:58;25474:12;25469:2;25461:6;25457:15;25450:37;25265:229;:::o;25500:366::-;25642:3;25663:67;25727:2;25722:3;25663:67;:::i;:::-;25656:74;;25739:93;25828:3;25739:93;:::i;:::-;25857:2;25852:3;25848:12;25841:19;;25500:366;;;:::o;25872:419::-;26038:4;26076:2;26065:9;26061:18;26053:26;;26125:9;26119:4;26115:20;26111:1;26100:9;26096:17;26089:47;26153:131;26279:4;26153:131;:::i;:::-;26145:139;;25872:419;;;:::o;26297:180::-;26345:77;26342:1;26335:88;26442:4;26439:1;26432:15;26466:4;26463:1;26456:15;26483:185;26523:1;26540:20;26558:1;26540:20;:::i;:::-;26535:25;;26574:20;26592:1;26574:20;:::i;:::-;26569:25;;26613:1;26603:35;;26618:18;;:::i;:::-;26603:35;26660:1;26657;26653:9;26648:14;;26483:185;;;;:::o;26674:348::-;26714:7;26737:20;26755:1;26737:20;:::i;:::-;26732:25;;26771:20;26789:1;26771:20;:::i;:::-;26766:25;;26959:1;26891:66;26887:74;26884:1;26881:81;26876:1;26869:9;26862:17;26858:105;26855:131;;;26966:18;;:::i;:::-;26855:131;27014:1;27011;27007:9;26996:20;;26674:348;;;;:::o;27028:225::-;27168:34;27164:1;27156:6;27152:14;27145:58;27237:8;27232:2;27224:6;27220:15;27213:33;27028:225;:::o;27259:366::-;27401:3;27422:67;27486:2;27481:3;27422:67;:::i;:::-;27415:74;;27498:93;27587:3;27498:93;:::i;:::-;27616:2;27611:3;27607:12;27600:19;;27259:366;;;:::o;27631:419::-;27797:4;27835:2;27824:9;27820:18;27812:26;;27884:9;27878:4;27874:20;27870:1;27859:9;27855:17;27848:47;27912:131;28038:4;27912:131;:::i;:::-;27904:139;;27631:419;;;:::o;28056:98::-;28107:6;28141:5;28135:12;28125:22;;28056:98;;;:::o;28160:147::-;28261:11;28298:3;28283:18;;28160:147;;;;:::o;28313:307::-;28381:1;28391:113;28405:6;28402:1;28399:13;28391:113;;;28490:1;28485:3;28481:11;28475:18;28471:1;28466:3;28462:11;28455:39;28427:2;28424:1;28420:10;28415:15;;28391:113;;;28522:6;28519:1;28516:13;28513:101;;;28602:1;28593:6;28588:3;28584:16;28577:27;28513:101;28362:258;28313:307;;;:::o;28626:373::-;28730:3;28758:38;28790:5;28758:38;:::i;:::-;28812:88;28893:6;28888:3;28812:88;:::i;:::-;28805:95;;28909:52;28954:6;28949:3;28942:4;28935:5;28931:16;28909:52;:::i;:::-;28986:6;28981:3;28977:16;28970:23;;28734:265;28626:373;;;;:::o;29005:271::-;29135:3;29157:93;29246:3;29237:6;29157:93;:::i;:::-;29150:100;;29267:3;29260:10;;29005:271;;;;:::o;29282:179::-;29422:31;29418:1;29410:6;29406:14;29399:55;29282:179;:::o;29467:366::-;29609:3;29630:67;29694:2;29689:3;29630:67;:::i;:::-;29623:74;;29706:93;29795:3;29706:93;:::i;:::-;29824:2;29819:3;29815:12;29808:19;;29467:366;;;:::o;29839:419::-;30005:4;30043:2;30032:9;30028:18;30020:26;;30092:9;30086:4;30082:20;30078:1;30067:9;30063:17;30056:47;30120:131;30246:4;30120:131;:::i;:::-;30112:139;;29839:419;;;:::o;30264:99::-;30316:6;30350:5;30344:12;30334:22;;30264:99;;;:::o;30369:102::-;30410:6;30461:2;30457:7;30452:2;30445:5;30441:14;30437:28;30427:38;;30369:102;;;:::o;30477:364::-;30565:3;30593:39;30626:5;30593:39;:::i;:::-;30648:71;30712:6;30707:3;30648:71;:::i;:::-;30641:78;;30728:52;30773:6;30768:3;30761:4;30754:5;30750:16;30728:52;:::i;:::-;30805:29;30827:6;30805:29;:::i;:::-;30800:3;30796:39;30789:46;;30569:272;30477:364;;;;:::o;30847:313::-;30960:4;30998:2;30987:9;30983:18;30975:26;;31047:9;31041:4;31037:20;31033:1;31022:9;31018:17;31011:47;31075:78;31148:4;31139:6;31075:78;:::i;:::-;31067:86;;30847:313;;;;:::o
Swarm Source
ipfs://abdd70c422e2af32dfb194968ff149ce7420d601e3c6fdd04f232d13d36df0b3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.