More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 968 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 21248285 | 7 hrs ago | IN | 0 ETH | 0.00092432 | ||||
Release | 21242160 | 27 hrs ago | IN | 0 ETH | 0.00095539 | ||||
Release | 21235974 | 2 days ago | IN | 0 ETH | 0.00124069 | ||||
Release | 21235645 | 2 days ago | IN | 0 ETH | 0.00113682 | ||||
Release | 21231852 | 2 days ago | IN | 0 ETH | 0.00096636 | ||||
Release | 21230023 | 2 days ago | IN | 0 ETH | 0.00182512 | ||||
Release | 21229903 | 2 days ago | IN | 0 ETH | 0.00126647 | ||||
Release | 21221859 | 3 days ago | IN | 0 ETH | 0.00092378 | ||||
Release | 21215254 | 4 days ago | IN | 0 ETH | 0.00175035 | ||||
Release | 21210256 | 5 days ago | IN | 0 ETH | 0.00102645 | ||||
Release | 21208337 | 5 days ago | IN | 0 ETH | 0.00078963 | ||||
Release | 21204309 | 6 days ago | IN | 0 ETH | 0.00119253 | ||||
Release | 21202075 | 6 days ago | IN | 0 ETH | 0.00125283 | ||||
Release | 21199100 | 7 days ago | IN | 0 ETH | 0.00103003 | ||||
Release | 21198822 | 7 days ago | IN | 0 ETH | 0.00090625 | ||||
Release | 21198794 | 7 days ago | IN | 0 ETH | 0.00109602 | ||||
Release | 21195550 | 7 days ago | IN | 0 ETH | 0.00183252 | ||||
Release | 21195056 | 7 days ago | IN | 0 ETH | 0.00158611 | ||||
Release | 21190313 | 8 days ago | IN | 0 ETH | 0.00143051 | ||||
Release | 21188522 | 8 days ago | IN | 0 ETH | 0.00239547 | ||||
Release | 21177694 | 10 days ago | IN | 0 ETH | 0.00129944 | ||||
Release | 21177267 | 10 days ago | IN | 0 ETH | 0.00141418 | ||||
Release | 21173459 | 10 days ago | IN | 0 ETH | 0.00410702 | ||||
Release | 21168733 | 11 days ago | IN | 0 ETH | 0.00281919 | ||||
Release | 21168051 | 11 days ago | IN | 0 ETH | 0.00311584 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenVesting
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-23 */ // File: contracts/interfaces/IDefispotToken.sol pragma solidity ^0.8.20; interface IDefispotToken { function mint(uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @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. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ 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]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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 if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: contracts/TokenVesting.sol pragma solidity 0.8.20; /** * @title TokenVesting */ contract TokenVesting is Ownable, ReentrancyGuard { uint256 public constant ONE_DAY = 1 days; bytes32 public constant MERKLE_ROOT = 0x50e8bd37dc6c99354eecff2b7fd5af65fcac7225b07949d31d1dced469092401; mapping(address => bool) public whitelistClaimed; struct VestingSchedule { // 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 --> constant value uint256 slicePeriodSeconds; // total amount of tokens to be released at the end of the vesting uint256 amountTotal; // amount of tokens released uint256 released; // wheter or not the vesting schedule has been created bool initialized; // whether or not the vesting is revocable bool revocable; // Should be always be revocable. // whether or not the vesting has been revoked bool revoked; } // address of the ERC20 token IERC20 private immutable _token; uint256 private vestingSchedulesTotalAmount; mapping(bytes32 => VestingSchedule) private vestingSchedules; mapping(address => uint256) private holdersVestingCount; bytes32[] private vestingSchedulesIds; using SafeERC20 for IERC20; event LogNewVestingSchedule( address _sender, address _beneficiary, bytes32 _vestingScheduleId, uint256 _vestingCount ); event Released(uint256 amount); event Revoked(); /** * @dev Reverts if no vesting schedule matches the passed identifier. */ modifier onlyIfVestingScheduleExists(bytes32 vestingScheduleId) { require( vestingSchedules[vestingScheduleId].initialized, "Schedule should exist!" ); _; } /** * @dev Reverts if the vesting schedule does not exist or has been revoked. */ modifier onlyIfVestingScheduleNotRevoked(bytes32 vestingScheduleId) { require( vestingSchedules[vestingScheduleId].initialized, "is not initialized!" ); require( !vestingSchedules[vestingScheduleId].revoked, "vesting schedule revoked!" ); _; } /** * @dev Creates a vesting contract. * @param token_ address of the ERC20 token contract */ constructor(address token_) Ownable(msg.sender) { require(token_ != address(0x0), "zero address not allowed!"); _token = IERC20(token_); } function whitelistClaim( bytes32[] calldata _merkleProof, uint256 _vestedAmount, uint256 _initialAmount, uint256 _cliff, uint256 _duration, bool _revocable ) external nonReentrant returns (bool status) { require(!whitelistClaimed[msg.sender], "Address already claimed!"); whitelistClaimed[msg.sender] = true; bytes32 leaf = keccak256( abi.encode( msg.sender, _vestedAmount, _initialAmount, _cliff, _duration, block.chainid, _revocable ) ); require( MerkleProof.verify(_merkleProof, MERKLE_ROOT, leaf), "invalid proof" ); if (_initialAmount > 0) { require( IDefispotToken(address(_token)).mint(_initialAmount), "mint failed!" ); _token.safeTransfer(msg.sender, _initialAmount); } status = _createVestingSchedule( msg.sender, // Beneficiary getCurrentTime(), // Vesting schedule start _cliff, // Cliff period _duration, // Total duration ONE_DAY, // Slice period in secodns: 1 day _revocable, // Vesting schedule can be revocable _vestedAmount // Total amount to distribute ); require(status, "Scheduled failed!"); } /** * @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(), "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); } function createVestingSchedule( address _beneficiary, uint256 _cliff, uint256 _duration, uint256 _slicePeriodSeconds, bool _revocable, uint256 _amount ) external onlyOwner returns (bool status) { status = _createVestingSchedule( _beneficiary, // Beneficiary getCurrentTime(), // Vesting schedule start _cliff, // Cliff period _duration, // Total duration _slicePeriodSeconds, // Slice period in secodns: 1 day _revocable, // Vesting schedule can be revocable _amount // Total amount to distribute ); require(status, "Scheduled failed!"); } /** * @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 ) private returns (bool) { require(_beneficiary != address(0), "beneficiary equals zero!"); require(_duration > _cliff, "duration is not valid!"); require(_amount > 0, "amount must be > 0"); require(_slicePeriodSeconds >= 1, "slicePeriodSeconds must be >= 1"); bytes32 vestingScheduleId = computeNextVestingScheduleIdForHolder( _beneficiary ); uint256 cliff = _start + _cliff; vestingSchedules[vestingScheduleId] = VestingSchedule( _beneficiary, cliff, _start, _duration, _slicePeriodSeconds, _amount, 0, true, _revocable, false ); vestingSchedulesTotalAmount = vestingSchedulesTotalAmount + _amount; vestingSchedulesIds.push(vestingScheduleId); holdersVestingCount[_beneficiary]++; emit LogNewVestingSchedule( msg.sender, _beneficiary, vestingScheduleId, holdersVestingCount[_beneficiary] ); require(IDefispotToken(address(_token)).mint(_amount), "mint failed!"); return true; } /** * @notice Revokes the vesting schedule for given identifier. * @param vestingScheduleId the vesting schedule identifier */ function revoke( bytes32 vestingScheduleId ) external onlyOwner onlyIfVestingScheduleNotRevoked(vestingScheduleId) { VestingSchedule storage vestingSchedule = vestingSchedules[ vestingScheduleId ]; require(vestingSchedule.revocable, "vesting is not revocable!"); uint256 vestedAmount = _computeReleasableAmount(vestingSchedule); if (vestedAmount > 0) { require(release(vestingScheduleId), "release failed!"); } uint256 unreleased = vestingSchedule.amountTotal - vestingSchedule.released; vestingSchedulesTotalAmount = vestingSchedulesTotalAmount - unreleased; vestingSchedule.revoked = true; } /* * @notice Withdraw the specified amount if possible. * @param amount the amount to withdraw */ function withdraw(uint256 amount) external nonReentrant onlyOwner { require( getWithdrawableAmount() >= amount, "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 ) public nonReentrant onlyIfVestingScheduleNotRevoked(vestingScheduleId) returns (bool) { VestingSchedule storage vestingSchedule = vestingSchedules[ vestingScheduleId ]; bool isBeneficiary = msg.sender == vestingSchedule.beneficiary; bool isOwner = msg.sender == owner(); require(isBeneficiary || isOwner, "only beneficiary and owner!"); uint256 amount = _computeReleasableAmount(vestingSchedule); require(amount > 0, "zero releasable amount!"); vestingSchedule.released = vestingSchedule.released + amount; address beneficiaryPayable = vestingSchedule.beneficiary; vestingSchedulesTotalAmount = vestingSchedulesTotalAmount - amount; _token.safeTransfer(beneficiaryPayable, amount); return true; } /** * @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 ) external view onlyIfVestingScheduleNotRevoked(vestingScheduleId) 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)) - 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 ) external 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) { return 0; } else if ( currentTime >= vestingSchedule.start + vestingSchedule.duration ) { return vestingSchedule.amountTotal - vestingSchedule.released; } else { uint256 vestedSeconds = currentTime - vestingSchedule.start; uint256 vestedAmount = (vestingSchedule.amountTotal * vestedSeconds) / vestingSchedule.duration; vestedAmount = vestedAmount - vestingSchedule.released; return vestedAmount; } } function getCurrentTime() internal view virtual 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"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_vestingScheduleId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_vestingCount","type":"uint256"}],"name":"LogNewVestingSchedule","type":"event"},{"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"},{"inputs":[],"name":"MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"_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":[{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getLastVestingScheduleForHolder","outputs":[{"components":[{"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":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"revocable","type":"bool"},{"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":"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":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"revocable","type":"bool"},{"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":"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":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"revocable","type":"bool"},{"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"}],"name":"release","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_vestedAmount","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"},{"internalType":"uint256","name":"_cliff","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"}],"name":"whitelistClaim","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801562000010575f80fd5b506040516200358138038062003581833981810160405281019062000036919062000295565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000aa575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a19190620002d6565b60405180910390fd5b620000bb816200016f60201b60201c565b50600180819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012b906200034f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200036f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200025f8262000234565b9050919050565b620002718162000253565b81146200027c575f80fd5b50565b5f815190506200028f8162000266565b92915050565b5f60208284031215620002ad57620002ac62000230565b5b5f620002bc848285016200027f565b91505092915050565b620002d08162000253565b82525050565b5f602082019050620002eb5f830184620002c5565b92915050565b5f82825260208201905092915050565b7f7a65726f2061646472657373206e6f7420616c6c6f77656421000000000000005f82015250565b5f62000337601983620002f1565b9150620003448262000301565b602082019050919050565b5f6020820190508181035f830152620003688162000329565b9050919050565b6080516131cf620003b25f395f81816104ce015281816105c5015281816109d101528181610c03015281816114c7015281816115a40152611b7701526131cf5ff3fe608060405234801561000f575f80fd5b506004361061014b575f3560e01c80638af104da116100c1578063ea1bb3d51161007a578063ea1bb3d5146103b3578063f2fde38b146103e3578063f44a708e146103ff578063f51321d71461042f578063f7c469f01461045f578063f9079b371461048f5761014b565b80638af104da146102cb5780638da5cb5b146102fb57806390be10cc146103195780639ef346b414610337578063b75c7dc614610367578063db4bec44146103835761014b565b806351e75e8b1161011357806351e75e8b146101f55780635a7bb69a1461021357806367d42a8b14610243578063715018a6146102735780637e913dc61461027d578063863e76db146102ad5761014b565b8063130836171461014f57806321df0da71461016d57806327a1567f1461018b5780632e1a7d4d146101bb57806348deb471146101d7575b5f80fd5b6101576104bf565b6040516101649190612214565b60405180910390f35b6101756104cb565b604051610182919061226c565b60405180910390f35b6101a560048036038101906101a09190612316565b6104f2565b6040516101b291906123ae565b60405180910390f35b6101d560048036038101906101d091906123c7565b61055d565b005b6101df610614565b6040516101ec9190612214565b60405180910390f35b6101fd61061d565b60405161020a919061240a565b60405180910390f35b61022d60048036038101906102289190612423565b610643565b60405161023a9190612214565b60405180910390f35b61025d60048036038101906102589190612478565b610689565b60405161026a91906123ae565b60405180910390f35b61027b610a2c565b005b61029760048036038101906102929190612423565b610a3f565b6040516102a4919061259a565b60405180910390f35b6102b5610b9d565b6040516102c29190612214565b60405180910390f35b6102e560048036038101906102e091906125b4565b610ba4565b6040516102f2919061240a565b60405180910390f35b610303610bd6565b604051610310919061226c565b60405180910390f35b610321610bfd565b60405161032e9190612214565b60405180910390f35b610351600480360381019061034c9190612478565b610ca8565b60405161035e919061259a565b60405180910390f35b610381600480360381019061037c9190612478565b610db4565b005b61039d60048036038101906103989190612423565b61107c565b6040516103aa91906123ae565b60405180910390f35b6103cd60048036038101906103c89190612478565b611099565b6040516103da9190612214565b60405180910390f35b6103fd60048036038101906103f89190612423565b61126f565b005b61041960048036038101906104149190612653565b6112f3565b60405161042691906123ae565b60405180910390f35b610449600480360381019061044491906125b4565b611658565b604051610456919061259a565b60405180910390f35b61047960048036038101906104749190612423565b61167a565b604051610486919061240a565b60405180910390f35b6104a960048036038101906104a491906123c7565b6116c9565b6040516104b6919061240a565b60405180910390f35b5f600680549050905090565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f6104fb611737565b610511876105076117be565b88888888886117c5565b905080610553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054a90612757565b60405180910390fd5b9695505050505050565b610565611c5e565b61056d611737565b80610576610bfd565b10156105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ae906127bf565b60405180910390fd5b6106096105c2610bd6565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b610611611d23565b50565b5f600354905090565b7f50e8bd37dc6c99354eecff2b7fd5af65fcac7225b07949d31d1dced4690924015f1b81565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f610692611c5e565b8160045f8281526020019081526020015f206007015f9054906101000a900460ff166106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff1615610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074c9061288f565b60405180910390fd5b5f60045f8581526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490505f6107c6610bd6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905081806107ff5750805b61083e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610835906128f7565b60405180910390fd5b5f61093484604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b90505f8111610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061295f565b60405180910390fd5b80846006015461098891906129aa565b84600601819055505f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816003546109c491906129dd565b600381905550610a1581837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b60019650505050505050610a27611d23565b919050565b610a34611737565b610a3d5f611de3565b565b610a47612197565b60045f610a9d84600160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a9891906129dd565b610ba4565b81526020019081526020015f20604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff1615151515815250509050919050565b6201518081565b5f8282604051602001610bb8929190612a75565b60405160208183030381529060405280519060200120905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c5a919061226c565b602060405180830381865afa158015610c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c999190612ab4565b610ca391906129dd565b905090565b610cb0612197565b60045f8381526020019081526020015f20604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff1615151515815250509050919050565b610dbc611737565b8060045f8281526020019081526020015f206007015f9054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff1615610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e769061288f565b60405180910390fd5b5f60045f8481526020019081526020015f2090508060070160019054906101000a900460ff16610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90612b29565b60405180910390fd5b5f610fda82604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b90505f81111561102d57610fed84610689565b61102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390612b91565b60405180910390fd5b5b5f8260060154836005015461104291906129dd565b90508060035461105291906129dd565b60038190555060018360070160026101000a81548160ff0219169083151502179055505050505050565b6002602052805f5260405f205f915054906101000a900460ff1681565b5f8160045f8281526020019081526020015f206007015f9054906101000a900460ff166110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff161561115d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111549061288f565b60405180910390fd5b5f60045f8581526020019081526020015f20905061126681604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b92505050919050565b611277611737565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e7575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112de919061226c565b60405180910390fd5b6112f081611de3565b50565b5f6112fc611c5e565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90612bf9565b60405180910390fd5b600160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f338787878746886040516020016113f99796959493929190612c17565b60405160208183030381529060405280519060200120905061147e8989808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050507f50e8bd37dc6c99354eecff2b7fd5af65fcac7225b07949d31d1dced4690924015f1b83611ea4565b6114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490612cce565b60405180910390fd5b5f8611156115e9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a0712d68876040518263ffffffff1660e01b815260040161151e9190612214565b6020604051808303815f875af115801561153a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155e9190612d00565b61159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490612d75565b60405180910390fd5b6115e833877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b5b611602336115f56117be565b878762015180888d6117c5565b915081611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90612757565b60405180910390fd5b5061164d611d23565b979650505050505050565b611660612197565b61167261166d8484610ba4565b610ca8565b905092915050565b5f6116c28260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ba4565b9050919050565b5f6116d26104bf565b8210611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90612ddd565b60405180910390fd5b6006828154811061172757611726612dfb565b5b905f5260205f2001549050919050565b61173f611eba565b73ffffffffffffffffffffffffffffffffffffffff1661175d610bd6565b73ffffffffffffffffffffffffffffffffffffffff16146117bc57611780611eba565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016117b3919061226c565b60405180910390fd5b565b5f42905090565b5f8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90612e72565b60405180910390fd5b858511611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90612eda565b60405180910390fd5b5f82116118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90612f42565b60405180910390fd5b60018410156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390612faa565b60405180910390fd5b5f6119068961167a565b90505f878961191591906129aa565b90506040518061014001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018281526020018a81526020018881526020018781526020018581526020015f815260200160011515815260200186151581526020015f151581525060045f8481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015f6101000a81548160ff0219169083151502179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff02191690831515021790555090505083600354611a7d91906129aa565b600381905550600682908060018154018082558091505060019003905f5260205f20015f909190919091505560055f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611af690612fc8565b91905055507f889e0d102d6ab78c383a83d07c826f07277df368eb1de4130966594e892deccf338b8460055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051611b6d949392919061300f565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff1660e01b8152600401611bce9190612214565b6020604051808303815f875af1158015611bea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0e9190612d00565b611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490612d75565b60405180910390fd5b600192505050979650505050505050565b600260015403611c9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b611d1e838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611cd7929190613052565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ec1565b505050565b60018081905550565b5f80611d366117be565b90508260200151811080611d4c57508261012001515b15611d5a575f915050611dde565b82606001518360400151611d6e91906129aa565b8110611d90578260c001518360a00151611d8891906129dd565b915050611dde565b5f836040015182611da191906129dd565b90505f8460600151828660a00151611db99190613079565b611dc391906130e7565b90508460c0015181611dd591906129dd565b90508093505050505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f82611eb08584611f56565b1490509392505050565b5f33905090565b5f611eeb828473ffffffffffffffffffffffffffffffffffffffff16611faa90919063ffffffff16565b90505f815114158015611f0f575080806020019051810190611f0d9190612d00565b155b15611f5157826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611f48919061226c565b60405180910390fd5b505050565b5f808290505f5b8451811015611f9f57611f8a82868381518110611f7d57611f7c612dfb565b5b6020026020010151611fbf565b91508080611f9790612fc8565b915050611f5d565b508091505092915050565b6060611fb783835f611fe9565b905092915050565b5f818310611fd657611fd182846120b2565b611fe1565b611fe083836120b2565b5b905092915050565b60608147101561203057306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401612027919061226c565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516120589190613183565b5f6040518083038185875af1925050503d805f8114612092576040519150601f19603f3d011682016040523d82523d5f602084013e612097565b606091505b50915091506120a78683836120c6565b925050509392505050565b5f825f528160205260405f20905092915050565b6060826120db576120d682612153565b61214b565b5f825114801561210157505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561214357836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161213a919061226c565b60405180910390fd5b81905061214c565b5b9392505050565b5f815111156121655780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518061014001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581526020015f151581525090565b5f819050919050565b61220e816121fc565b82525050565b5f6020820190506122275f830184612205565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122568261222d565b9050919050565b6122668161224c565b82525050565b5f60208201905061227f5f83018461225d565b92915050565b5f80fd5b5f80fd5b6122968161224c565b81146122a0575f80fd5b50565b5f813590506122b18161228d565b92915050565b6122c0816121fc565b81146122ca575f80fd5b50565b5f813590506122db816122b7565b92915050565b5f8115159050919050565b6122f5816122e1565b81146122ff575f80fd5b50565b5f81359050612310816122ec565b92915050565b5f805f805f8060c087890312156123305761232f612285565b5b5f61233d89828a016122a3565b965050602061234e89828a016122cd565b955050604061235f89828a016122cd565b945050606061237089828a016122cd565b935050608061238189828a01612302565b92505060a061239289828a016122cd565b9150509295509295509295565b6123a8816122e1565b82525050565b5f6020820190506123c15f83018461239f565b92915050565b5f602082840312156123dc576123db612285565b5b5f6123e9848285016122cd565b91505092915050565b5f819050919050565b612404816123f2565b82525050565b5f60208201905061241d5f8301846123fb565b92915050565b5f6020828403121561243857612437612285565b5b5f612445848285016122a3565b91505092915050565b612457816123f2565b8114612461575f80fd5b50565b5f813590506124728161244e565b92915050565b5f6020828403121561248d5761248c612285565b5b5f61249a84828501612464565b91505092915050565b6124ac8161224c565b82525050565b6124bb816121fc565b82525050565b6124ca816122e1565b82525050565b61014082015f8201516124e55f8501826124a3565b5060208201516124f860208501826124b2565b50604082015161250b60408501826124b2565b50606082015161251e60608501826124b2565b50608082015161253160808501826124b2565b5060a082015161254460a08501826124b2565b5060c082015161255760c08501826124b2565b5060e082015161256a60e08501826124c1565b5061010082015161257f6101008501826124c1565b506101208201516125946101208501826124c1565b50505050565b5f610140820190506125ae5f8301846124d0565b92915050565b5f80604083850312156125ca576125c9612285565b5b5f6125d7858286016122a3565b92505060206125e8858286016122cd565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612613576126126125f2565b5b8235905067ffffffffffffffff8111156126305761262f6125f6565b5b60208301915083602082028301111561264c5761264b6125fa565b5b9250929050565b5f805f805f805f60c0888a03121561266e5761266d612285565b5b5f88013567ffffffffffffffff81111561268b5761268a612289565b5b6126978a828b016125fe565b975097505060206126aa8a828b016122cd565b95505060406126bb8a828b016122cd565b94505060606126cc8a828b016122cd565b93505060806126dd8a828b016122cd565b92505060a06126ee8a828b01612302565b91505092959891949750929550565b5f82825260208201905092915050565b7f5363686564756c6564206661696c6564210000000000000000000000000000005f82015250565b5f6127416011836126fd565b915061274c8261270d565b602082019050919050565b5f6020820190508181035f83015261276e81612735565b9050919050565b7f6e6f7420656e6f75676820776974686472617761626c652066756e64732100005f82015250565b5f6127a9601e836126fd565b91506127b482612775565b602082019050919050565b5f6020820190508181035f8301526127d68161279d565b9050919050565b7f6973206e6f7420696e697469616c697a656421000000000000000000000000005f82015250565b5f6128116013836126fd565b915061281c826127dd565b602082019050919050565b5f6020820190508181035f83015261283e81612805565b9050919050565b7f76657374696e67207363686564756c65207265766f6b656421000000000000005f82015250565b5f6128796019836126fd565b915061288482612845565b602082019050919050565b5f6020820190508181035f8301526128a68161286d565b9050919050565b7f6f6e6c792062656e656669636961727920616e64206f776e65722100000000005f82015250565b5f6128e1601b836126fd565b91506128ec826128ad565b602082019050919050565b5f6020820190508181035f83015261290e816128d5565b9050919050565b7f7a65726f2072656c65617361626c6520616d6f756e74210000000000000000005f82015250565b5f6129496017836126fd565b915061295482612915565b602082019050919050565b5f6020820190508181035f8301526129768161293d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6129b4826121fc565b91506129bf836121fc565b92508282019050808211156129d7576129d661297d565b5b92915050565b5f6129e7826121fc565b91506129f2836121fc565b9250828203905081811115612a0a57612a0961297d565b5b92915050565b5f8160601b9050919050565b5f612a2682612a10565b9050919050565b5f612a3782612a1c565b9050919050565b612a4f612a4a8261224c565b612a2d565b82525050565b5f819050919050565b612a6f612a6a826121fc565b612a55565b82525050565b5f612a808285612a3e565b601482019150612a908284612a5e565b6020820191508190509392505050565b5f81519050612aae816122b7565b92915050565b5f60208284031215612ac957612ac8612285565b5b5f612ad684828501612aa0565b91505092915050565b7f76657374696e67206973206e6f74207265766f6361626c6521000000000000005f82015250565b5f612b136019836126fd565b9150612b1e82612adf565b602082019050919050565b5f6020820190508181035f830152612b4081612b07565b9050919050565b7f72656c65617365206661696c65642100000000000000000000000000000000005f82015250565b5f612b7b600f836126fd565b9150612b8682612b47565b602082019050919050565b5f6020820190508181035f830152612ba881612b6f565b9050919050565b7f4164647265737320616c726561647920636c61696d65642100000000000000005f82015250565b5f612be36018836126fd565b9150612bee82612baf565b602082019050919050565b5f6020820190508181035f830152612c1081612bd7565b9050919050565b5f60e082019050612c2a5f83018a61225d565b612c376020830189612205565b612c446040830188612205565b612c516060830187612205565b612c5e6080830186612205565b612c6b60a0830185612205565b612c7860c083018461239f565b98975050505050505050565b7f696e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f612cb8600d836126fd565b9150612cc382612c84565b602082019050919050565b5f6020820190508181035f830152612ce581612cac565b9050919050565b5f81519050612cfa816122ec565b92915050565b5f60208284031215612d1557612d14612285565b5b5f612d2284828501612cec565b91505092915050565b7f6d696e74206661696c65642100000000000000000000000000000000000000005f82015250565b5f612d5f600c836126fd565b9150612d6a82612d2b565b602082019050919050565b5f6020820190508181035f830152612d8c81612d53565b9050919050565b7f696e646578206f7574206f6620626f756e6473210000000000000000000000005f82015250565b5f612dc76014836126fd565b9150612dd282612d93565b602082019050919050565b5f6020820190508181035f830152612df481612dbb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f62656e656669636961727920657175616c73207a65726f2100000000000000005f82015250565b5f612e5c6018836126fd565b9150612e6782612e28565b602082019050919050565b5f6020820190508181035f830152612e8981612e50565b9050919050565b7f6475726174696f6e206973206e6f742076616c696421000000000000000000005f82015250565b5f612ec46016836126fd565b9150612ecf82612e90565b602082019050919050565b5f6020820190508181035f830152612ef181612eb8565b9050919050565b7f616d6f756e74206d757374206265203e203000000000000000000000000000005f82015250565b5f612f2c6012836126fd565b9150612f3782612ef8565b602082019050919050565b5f6020820190508181035f830152612f5981612f20565b9050919050565b7f736c696365506572696f645365636f6e6473206d757374206265203e3d2031005f82015250565b5f612f94601f836126fd565b9150612f9f82612f60565b602082019050919050565b5f6020820190508181035f830152612fc181612f88565b9050919050565b5f612fd2826121fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130045761300361297d565b5b600182019050919050565b5f6080820190506130225f83018761225d565b61302f602083018661225d565b61303c60408301856123fb565b6130496060830184612205565b95945050505050565b5f6040820190506130655f83018561225d565b6130726020830184612205565b9392505050565b5f613083826121fc565b915061308e836121fc565b925082820261309c816121fc565b915082820484148315176130b3576130b261297d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6130f1826121fc565b91506130fc836121fc565b92508261310c5761310b6130ba565b5b828204905092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101561314857808201518184015260208101905061312d565b5f8484015250505050565b5f61315d82613117565b6131678185613121565b935061317781856020860161312b565b80840191505092915050565b5f61318e8284613153565b91508190509291505056fea2646970667358221220e648d21634ba7028b10f9027197ec74919c97341a913b179b8e0d9f01523466d64736f6c63430008140033000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061014b575f3560e01c80638af104da116100c1578063ea1bb3d51161007a578063ea1bb3d5146103b3578063f2fde38b146103e3578063f44a708e146103ff578063f51321d71461042f578063f7c469f01461045f578063f9079b371461048f5761014b565b80638af104da146102cb5780638da5cb5b146102fb57806390be10cc146103195780639ef346b414610337578063b75c7dc614610367578063db4bec44146103835761014b565b806351e75e8b1161011357806351e75e8b146101f55780635a7bb69a1461021357806367d42a8b14610243578063715018a6146102735780637e913dc61461027d578063863e76db146102ad5761014b565b8063130836171461014f57806321df0da71461016d57806327a1567f1461018b5780632e1a7d4d146101bb57806348deb471146101d7575b5f80fd5b6101576104bf565b6040516101649190612214565b60405180910390f35b6101756104cb565b604051610182919061226c565b60405180910390f35b6101a560048036038101906101a09190612316565b6104f2565b6040516101b291906123ae565b60405180910390f35b6101d560048036038101906101d091906123c7565b61055d565b005b6101df610614565b6040516101ec9190612214565b60405180910390f35b6101fd61061d565b60405161020a919061240a565b60405180910390f35b61022d60048036038101906102289190612423565b610643565b60405161023a9190612214565b60405180910390f35b61025d60048036038101906102589190612478565b610689565b60405161026a91906123ae565b60405180910390f35b61027b610a2c565b005b61029760048036038101906102929190612423565b610a3f565b6040516102a4919061259a565b60405180910390f35b6102b5610b9d565b6040516102c29190612214565b60405180910390f35b6102e560048036038101906102e091906125b4565b610ba4565b6040516102f2919061240a565b60405180910390f35b610303610bd6565b604051610310919061226c565b60405180910390f35b610321610bfd565b60405161032e9190612214565b60405180910390f35b610351600480360381019061034c9190612478565b610ca8565b60405161035e919061259a565b60405180910390f35b610381600480360381019061037c9190612478565b610db4565b005b61039d60048036038101906103989190612423565b61107c565b6040516103aa91906123ae565b60405180910390f35b6103cd60048036038101906103c89190612478565b611099565b6040516103da9190612214565b60405180910390f35b6103fd60048036038101906103f89190612423565b61126f565b005b61041960048036038101906104149190612653565b6112f3565b60405161042691906123ae565b60405180910390f35b610449600480360381019061044491906125b4565b611658565b604051610456919061259a565b60405180910390f35b61047960048036038101906104749190612423565b61167a565b604051610486919061240a565b60405180910390f35b6104a960048036038101906104a491906123c7565b6116c9565b6040516104b6919061240a565b60405180910390f35b5f600680549050905090565b5f7f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd905090565b5f6104fb611737565b610511876105076117be565b88888888886117c5565b905080610553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054a90612757565b60405180910390fd5b9695505050505050565b610565611c5e565b61056d611737565b80610576610bfd565b10156105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ae906127bf565b60405180910390fd5b6106096105c2610bd6565b827f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b610611611d23565b50565b5f600354905090565b7f50e8bd37dc6c99354eecff2b7fd5af65fcac7225b07949d31d1dced4690924015f1b81565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f610692611c5e565b8160045f8281526020019081526020015f206007015f9054906101000a900460ff166106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff1615610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074c9061288f565b60405180910390fd5b5f60045f8581526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490505f6107c6610bd6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905081806107ff5750805b61083e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610835906128f7565b60405180910390fd5b5f61093484604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b90505f8111610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061295f565b60405180910390fd5b80846006015461098891906129aa565b84600601819055505f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816003546109c491906129dd565b600381905550610a1581837f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b60019650505050505050610a27611d23565b919050565b610a34611737565b610a3d5f611de3565b565b610a47612197565b60045f610a9d84600160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a9891906129dd565b610ba4565b81526020019081526020015f20604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff1615151515815250509050919050565b6201518081565b5f8282604051602001610bb8929190612a75565b60405160208183030381529060405280519060200120905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003547f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c5a919061226c565b602060405180830381865afa158015610c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c999190612ab4565b610ca391906129dd565b905090565b610cb0612197565b60045f8381526020019081526020015f20604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff1615151515815250509050919050565b610dbc611737565b8060045f8281526020019081526020015f206007015f9054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff1615610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e769061288f565b60405180910390fd5b5f60045f8481526020019081526020015f2090508060070160019054906101000a900460ff16610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90612b29565b60405180910390fd5b5f610fda82604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b90505f81111561102d57610fed84610689565b61102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390612b91565b60405180910390fd5b5b5f8260060154836005015461104291906129dd565b90508060035461105291906129dd565b60038190555060018360070160026101000a81548160ff0219169083151502179055505050505050565b6002602052805f5260405f205f915054906101000a900460ff1681565b5f8160045f8281526020019081526020015f206007015f9054906101000a900460ff166110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290612827565b60405180910390fd5b60045f8281526020019081526020015f2060070160029054906101000a900460ff161561115d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111549061288f565b60405180910390fd5b5f60045f8581526020019081526020015f20905061126681604051806101400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015f9054906101000a900460ff161515151581526020016007820160019054906101000a900460ff161515151581526020016007820160029054906101000a900460ff161515151581525050611d2c565b92505050919050565b611277611737565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e7575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112de919061226c565b60405180910390fd5b6112f081611de3565b50565b5f6112fc611c5e565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90612bf9565b60405180910390fd5b600160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f338787878746886040516020016113f99796959493929190612c17565b60405160208183030381529060405280519060200120905061147e8989808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050507f50e8bd37dc6c99354eecff2b7fd5af65fcac7225b07949d31d1dced4690924015f1b83611ea4565b6114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490612cce565b60405180910390fd5b5f8611156115e9577f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff1663a0712d68876040518263ffffffff1660e01b815260040161151e9190612214565b6020604051808303815f875af115801561153a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155e9190612d00565b61159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490612d75565b60405180910390fd5b6115e833877f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff16611ca49092919063ffffffff16565b5b611602336115f56117be565b878762015180888d6117c5565b915081611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90612757565b60405180910390fd5b5061164d611d23565b979650505050505050565b611660612197565b61167261166d8484610ba4565b610ca8565b905092915050565b5f6116c28260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ba4565b9050919050565b5f6116d26104bf565b8210611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90612ddd565b60405180910390fd5b6006828154811061172757611726612dfb565b5b905f5260205f2001549050919050565b61173f611eba565b73ffffffffffffffffffffffffffffffffffffffff1661175d610bd6565b73ffffffffffffffffffffffffffffffffffffffff16146117bc57611780611eba565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016117b3919061226c565b60405180910390fd5b565b5f42905090565b5f8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90612e72565b60405180910390fd5b858511611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90612eda565b60405180910390fd5b5f82116118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90612f42565b60405180910390fd5b60018410156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390612faa565b60405180910390fd5b5f6119068961167a565b90505f878961191591906129aa565b90506040518061014001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018281526020018a81526020018881526020018781526020018581526020015f815260200160011515815260200186151581526020015f151581525060045f8481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015f6101000a81548160ff0219169083151502179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff02191690831515021790555090505083600354611a7d91906129aa565b600381905550600682908060018154018082558091505060019003905f5260205f20015f909190919091505560055f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611af690612fc8565b91905055507f889e0d102d6ab78c383a83d07c826f07277df368eb1de4130966594e892deccf338b8460055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051611b6d949392919061300f565b60405180910390a17f000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd73ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff1660e01b8152600401611bce9190612214565b6020604051808303815f875af1158015611bea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0e9190612d00565b611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490612d75565b60405180910390fd5b600192505050979650505050505050565b600260015403611c9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b611d1e838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611cd7929190613052565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ec1565b505050565b60018081905550565b5f80611d366117be565b90508260200151811080611d4c57508261012001515b15611d5a575f915050611dde565b82606001518360400151611d6e91906129aa565b8110611d90578260c001518360a00151611d8891906129dd565b915050611dde565b5f836040015182611da191906129dd565b90505f8460600151828660a00151611db99190613079565b611dc391906130e7565b90508460c0015181611dd591906129dd565b90508093505050505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f82611eb08584611f56565b1490509392505050565b5f33905090565b5f611eeb828473ffffffffffffffffffffffffffffffffffffffff16611faa90919063ffffffff16565b90505f815114158015611f0f575080806020019051810190611f0d9190612d00565b155b15611f5157826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611f48919061226c565b60405180910390fd5b505050565b5f808290505f5b8451811015611f9f57611f8a82868381518110611f7d57611f7c612dfb565b5b6020026020010151611fbf565b91508080611f9790612fc8565b915050611f5d565b508091505092915050565b6060611fb783835f611fe9565b905092915050565b5f818310611fd657611fd182846120b2565b611fe1565b611fe083836120b2565b5b905092915050565b60608147101561203057306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401612027919061226c565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516120589190613183565b5f6040518083038185875af1925050503d805f8114612092576040519150601f19603f3d011682016040523d82523d5f602084013e612097565b606091505b50915091506120a78683836120c6565b925050509392505050565b5f825f528160205260405f20905092915050565b6060826120db576120d682612153565b61214b565b5f825114801561210157505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561214357836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161213a919061226c565b60405180910390fd5b81905061214c565b5b9392505050565b5f815111156121655780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518061014001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581526020015f151581525090565b5f819050919050565b61220e816121fc565b82525050565b5f6020820190506122275f830184612205565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122568261222d565b9050919050565b6122668161224c565b82525050565b5f60208201905061227f5f83018461225d565b92915050565b5f80fd5b5f80fd5b6122968161224c565b81146122a0575f80fd5b50565b5f813590506122b18161228d565b92915050565b6122c0816121fc565b81146122ca575f80fd5b50565b5f813590506122db816122b7565b92915050565b5f8115159050919050565b6122f5816122e1565b81146122ff575f80fd5b50565b5f81359050612310816122ec565b92915050565b5f805f805f8060c087890312156123305761232f612285565b5b5f61233d89828a016122a3565b965050602061234e89828a016122cd565b955050604061235f89828a016122cd565b945050606061237089828a016122cd565b935050608061238189828a01612302565b92505060a061239289828a016122cd565b9150509295509295509295565b6123a8816122e1565b82525050565b5f6020820190506123c15f83018461239f565b92915050565b5f602082840312156123dc576123db612285565b5b5f6123e9848285016122cd565b91505092915050565b5f819050919050565b612404816123f2565b82525050565b5f60208201905061241d5f8301846123fb565b92915050565b5f6020828403121561243857612437612285565b5b5f612445848285016122a3565b91505092915050565b612457816123f2565b8114612461575f80fd5b50565b5f813590506124728161244e565b92915050565b5f6020828403121561248d5761248c612285565b5b5f61249a84828501612464565b91505092915050565b6124ac8161224c565b82525050565b6124bb816121fc565b82525050565b6124ca816122e1565b82525050565b61014082015f8201516124e55f8501826124a3565b5060208201516124f860208501826124b2565b50604082015161250b60408501826124b2565b50606082015161251e60608501826124b2565b50608082015161253160808501826124b2565b5060a082015161254460a08501826124b2565b5060c082015161255760c08501826124b2565b5060e082015161256a60e08501826124c1565b5061010082015161257f6101008501826124c1565b506101208201516125946101208501826124c1565b50505050565b5f610140820190506125ae5f8301846124d0565b92915050565b5f80604083850312156125ca576125c9612285565b5b5f6125d7858286016122a3565b92505060206125e8858286016122cd565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612613576126126125f2565b5b8235905067ffffffffffffffff8111156126305761262f6125f6565b5b60208301915083602082028301111561264c5761264b6125fa565b5b9250929050565b5f805f805f805f60c0888a03121561266e5761266d612285565b5b5f88013567ffffffffffffffff81111561268b5761268a612289565b5b6126978a828b016125fe565b975097505060206126aa8a828b016122cd565b95505060406126bb8a828b016122cd565b94505060606126cc8a828b016122cd565b93505060806126dd8a828b016122cd565b92505060a06126ee8a828b01612302565b91505092959891949750929550565b5f82825260208201905092915050565b7f5363686564756c6564206661696c6564210000000000000000000000000000005f82015250565b5f6127416011836126fd565b915061274c8261270d565b602082019050919050565b5f6020820190508181035f83015261276e81612735565b9050919050565b7f6e6f7420656e6f75676820776974686472617761626c652066756e64732100005f82015250565b5f6127a9601e836126fd565b91506127b482612775565b602082019050919050565b5f6020820190508181035f8301526127d68161279d565b9050919050565b7f6973206e6f7420696e697469616c697a656421000000000000000000000000005f82015250565b5f6128116013836126fd565b915061281c826127dd565b602082019050919050565b5f6020820190508181035f83015261283e81612805565b9050919050565b7f76657374696e67207363686564756c65207265766f6b656421000000000000005f82015250565b5f6128796019836126fd565b915061288482612845565b602082019050919050565b5f6020820190508181035f8301526128a68161286d565b9050919050565b7f6f6e6c792062656e656669636961727920616e64206f776e65722100000000005f82015250565b5f6128e1601b836126fd565b91506128ec826128ad565b602082019050919050565b5f6020820190508181035f83015261290e816128d5565b9050919050565b7f7a65726f2072656c65617361626c6520616d6f756e74210000000000000000005f82015250565b5f6129496017836126fd565b915061295482612915565b602082019050919050565b5f6020820190508181035f8301526129768161293d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6129b4826121fc565b91506129bf836121fc565b92508282019050808211156129d7576129d661297d565b5b92915050565b5f6129e7826121fc565b91506129f2836121fc565b9250828203905081811115612a0a57612a0961297d565b5b92915050565b5f8160601b9050919050565b5f612a2682612a10565b9050919050565b5f612a3782612a1c565b9050919050565b612a4f612a4a8261224c565b612a2d565b82525050565b5f819050919050565b612a6f612a6a826121fc565b612a55565b82525050565b5f612a808285612a3e565b601482019150612a908284612a5e565b6020820191508190509392505050565b5f81519050612aae816122b7565b92915050565b5f60208284031215612ac957612ac8612285565b5b5f612ad684828501612aa0565b91505092915050565b7f76657374696e67206973206e6f74207265766f6361626c6521000000000000005f82015250565b5f612b136019836126fd565b9150612b1e82612adf565b602082019050919050565b5f6020820190508181035f830152612b4081612b07565b9050919050565b7f72656c65617365206661696c65642100000000000000000000000000000000005f82015250565b5f612b7b600f836126fd565b9150612b8682612b47565b602082019050919050565b5f6020820190508181035f830152612ba881612b6f565b9050919050565b7f4164647265737320616c726561647920636c61696d65642100000000000000005f82015250565b5f612be36018836126fd565b9150612bee82612baf565b602082019050919050565b5f6020820190508181035f830152612c1081612bd7565b9050919050565b5f60e082019050612c2a5f83018a61225d565b612c376020830189612205565b612c446040830188612205565b612c516060830187612205565b612c5e6080830186612205565b612c6b60a0830185612205565b612c7860c083018461239f565b98975050505050505050565b7f696e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f612cb8600d836126fd565b9150612cc382612c84565b602082019050919050565b5f6020820190508181035f830152612ce581612cac565b9050919050565b5f81519050612cfa816122ec565b92915050565b5f60208284031215612d1557612d14612285565b5b5f612d2284828501612cec565b91505092915050565b7f6d696e74206661696c65642100000000000000000000000000000000000000005f82015250565b5f612d5f600c836126fd565b9150612d6a82612d2b565b602082019050919050565b5f6020820190508181035f830152612d8c81612d53565b9050919050565b7f696e646578206f7574206f6620626f756e6473210000000000000000000000005f82015250565b5f612dc76014836126fd565b9150612dd282612d93565b602082019050919050565b5f6020820190508181035f830152612df481612dbb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f62656e656669636961727920657175616c73207a65726f2100000000000000005f82015250565b5f612e5c6018836126fd565b9150612e6782612e28565b602082019050919050565b5f6020820190508181035f830152612e8981612e50565b9050919050565b7f6475726174696f6e206973206e6f742076616c696421000000000000000000005f82015250565b5f612ec46016836126fd565b9150612ecf82612e90565b602082019050919050565b5f6020820190508181035f830152612ef181612eb8565b9050919050565b7f616d6f756e74206d757374206265203e203000000000000000000000000000005f82015250565b5f612f2c6012836126fd565b9150612f3782612ef8565b602082019050919050565b5f6020820190508181035f830152612f5981612f20565b9050919050565b7f736c696365506572696f645365636f6e6473206d757374206265203e3d2031005f82015250565b5f612f94601f836126fd565b9150612f9f82612f60565b602082019050919050565b5f6020820190508181035f830152612fc181612f88565b9050919050565b5f612fd2826121fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130045761300361297d565b5b600182019050919050565b5f6080820190506130225f83018761225d565b61302f602083018661225d565b61303c60408301856123fb565b6130496060830184612205565b95945050505050565b5f6040820190506130655f83018561225d565b6130726020830184612205565b9392505050565b5f613083826121fc565b915061308e836121fc565b925082820261309c816121fc565b915082820484148315176130b3576130b261297d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6130f1826121fc565b91506130fc836121fc565b92508261310c5761310b6130ba565b5b828204905092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101561314857808201518184015260208101905061312d565b5f8484015250505050565b5f61315d82613117565b6131678185613121565b935061317781856020860161312b565b80840191505092915050565b5f61318e8284613153565b91508190509291505056fea2646970667358221220e648d21634ba7028b10f9027197ec74919c97341a913b179b8e0d9f01523466d64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd
-----Decoded View---------------
Arg [0] : token_ (address): 0xe635EFcfAc44C5f44508f4d17c3a96CB4Ce421dD
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e635efcfac44c5f44508f4d17c3a96cb4ce421dd
Deployed Bytecode Sourcemap
36928:14866:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48272:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42787:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42888:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46762:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42549:127;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37034:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41418:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47190:929;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3536:103;;;:::i;:::-;;50049:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36985:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50511:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2861:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49409:150;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49091:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45897:736;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37154:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48546:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3794:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39742:1520;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42110:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49672:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41716:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48272:118;48329:7;48356:19;:26;;;;48349:33;;48272:118;:::o;42787:93::-;42830:7;42865:6;42850:22;;42787:93;:::o;42888:721::-;43128:11;2747:13;:11;:13::i;:::-;43161:393:::1;43198:12;43240:16;:14;:16::i;:::-;43297:6;43334:9;43376:19;43444:10;43506:7;43161:22;:393::i;:::-;43152:402;;43573:6;43565:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;42888:721:::0;;;;;;;;:::o;46762:245::-;25865:21;:19;:21::i;:::-;2747:13:::1;:11;:13::i;:::-;46888:6:::2;46861:23;:21;:23::i;:::-;:33;;46839:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46963:36;46983:7;:5;:7::i;:::-;46992:6;46963;:19;;;;:36;;;;;:::i;:::-;25909:20:::0;:18;:20::i;:::-;46762:245;:::o;42549:127::-;42614:7;42641:27;;42634:34;;42549:127;:::o;37034:113::-;37081:66;37034:113;;;:::o;41418:176::-;41526:7;41553:19;:33;41573:12;41553:33;;;;;;;;;;;;;;;;41546:40;;41418:176;;;:::o;47190:929::-;47366:4;25865:21;:19;:21::i;:::-;47329:17:::1;39204:16;:35;39221:17;39204:35;;;;;;;;;;;:47;;;;;;;;;;;;39182:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;39332:16;:35;39349:17;39332:35;;;;;;;;;;;:43;;;;;;;;;;;;39331:44;39309:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;47388:39:::2;47430:16;:59;47461:17;47430:59;;;;;;;;;;;47388:101;;47500:18;47535:15;:27;;;;;;;;;;;;47521:41;;:10;:41;;;47500:62;;47573:12;47602:7;:5;:7::i;:::-;47588:21;;:10;:21;;;47573:36;;47628:13;:24;;;;47645:7;47628:24;47620:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;47697:14;47714:41;47739:15;47714:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;47697:58;;47783:1;47774:6;:10;47766:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;47877:6;47850:15;:24;;;:33;;;;:::i;:::-;47823:15;:24;;:60;;;;47894:26;47923:15;:27;;;;;;;;;;;;47894:56;;48021:6;47991:27;;:36;;;;:::i;:::-;47961:27;:66;;;;48040:47;48060:18;48080:6;48040;:19;;;;:47;;;;;:::i;:::-;48107:4;48100:11;;;;;;;25897:1:::1;25909:20:::0;:18;:20::i;:::-;47190:929;;;:::o;3536:103::-;2747:13;:11;:13::i;:::-;3601:30:::1;3628:1;3601:18;:30::i;:::-;3536:103::o:0;50049:353::-;50145:22;;:::i;:::-;50200:16;:194;50235:144;50300:6;50359:1;50329:19;:27;50349:6;50329:27;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;50235:42;:144::i;:::-;50200:194;;;;;;;;;;;50180:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50049:353;;;:::o;36985:40::-;37019:6;36985:40;:::o;50511:206::-;50640:7;50694:6;50702:5;50677:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50667:42;;;;;;50660:49;;50511:206;;;;:::o;2861:87::-;2907:7;2934:6;;;;;;;;;;;2927:13;;2861:87;:::o;49409:150::-;49463:7;49524:27;;49490:6;:16;;;49515:4;49490:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;;;:::i;:::-;49483:68;;49409:150;:::o;49091:177::-;49183:22;;:::i;:::-;49225:16;:35;49242:17;49225:35;;;;;;;;;;;49218:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49091:177;;;:::o;45897:736::-;2747:13;:11;:13::i;:::-;46007:17:::1;39204:16;:35;39221:17;39204:35;;;;;;;;;;;:47;;;;;;;;;;;;39182:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;39332:16;:35;39349:17;39332:35;;;;;;;;;;;:43;;;;;;;;;;;;39331:44;39309:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;46037:39:::2;46079:16;:59;46110:17;46079:59;;;;;;;;;;;46037:101;;46159:15;:25;;;;;;;;;;;;46151:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46227:20;46250:41;46275:15;46250:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:24;:41::i;:::-;46227:64;;46321:1;46306:12;:16;46302:103;;;46347:26;46355:17;46347:7;:26::i;:::-;46339:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;46302:103;46415:18;46479:15;:24;;;46436:15;:27;;;:67;;;;:::i;:::-;46415:88;;46574:10;46544:27;;:40;;;;:::i;:::-;46514:27;:70;;;;46621:4;46595:15;:23;;;:30;;;;;;;;;;;;;;;;;;46026:607;;;2771:1:::1;45897:736:::0;:::o;37154:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;48546:379::-;48732:7;48695:17;39204:16;:35;39221:17;39204:35;;;;;;;;;;;:47;;;;;;;;;;;;39182:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;39332:16;:35;39349:17;39332:35;;;;;;;;;;;:43;;;;;;;;;;;;39331:44;39309:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;48757:39:::1;48799:16;:59;48830:17;48799:59;;;;;;;;;;;48757:101;;48876:41;48901:15;48876:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:24;:41::i;:::-;48869:48;;;48546:379:::0;;;;:::o;3794:220::-;2747:13;:11;:13::i;:::-;3899:1:::1;3879:22;;:8;:22;;::::0;3875:93:::1;;3953:1;3925:31;;;;;;;;;;;:::i;:::-;;;;;;;;3875:93;3978:28;3997:8;3978:18;:28::i;:::-;3794:220:::0;:::o;39742:1520::-;39990:11;25865:21;:19;:21::i;:::-;40023:16:::1;:28;40040:10;40023:28;;;;;;;;;;;;;;;;;;;;;;;;;40022:29;40014:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40122:4;40091:16;:28;40108:10;40091:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;40137:12;40205:10;40234:13;40266:14;40299:6;40324:9;40352:13;40384:10;40176:233;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40152:268;;;;;;40137:283;;40455:51;40474:12;;40455:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37081:66;40488:11;;40501:4;40455:18;:51::i;:::-;40433:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;40581:1;40564:14;:18;40560:239;;;40648:6;40625:36;;;40662:14;40625:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40599:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:47;40760:10;40772:14;40740:6;:19;;;;:47;;;;;:::i;:::-;40560:239;40820:385;40857:10;40897:16;:14;:16::i;:::-;40954:6;40991:9;37019:6;41089:10;41151:13;40820:22;:385::i;:::-;40811:394;;41226:6;41218:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40003:1259;25909:20:::0;:18;:20::i;:::-;39742:1520;;;;;;;;;:::o;42110:296::-;42234:22;;:::i;:::-;42289:109;42326:57;42369:6;42377:5;42326:42;:57::i;:::-;42289:18;:109::i;:::-;42269:129;;42110:296;;;;:::o;49672:276::-;49772:7;49812:128;49873:6;49898:19;:27;49918:6;49898:27;;;;;;;;;;;;;;;;49812:42;:128::i;:::-;49792:148;;49672:276;;;:::o;41716:222::-;41799:7;41835:26;:24;:26::i;:::-;41827:5;:34;41819:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41904:19;41924:5;41904:26;;;;;;;;:::i;:::-;;;;;;;;;;41897:33;;41716:222;;;:::o;3026:166::-;3097:12;:10;:12::i;:::-;3086:23;;:7;:5;:7::i;:::-;:23;;;3082:103;;3160:12;:10;:12::i;:::-;3133:40;;;;;;;;;;;:::i;:::-;;;;;;;;3082:103;3026:166::o;51684:107::-;51741:7;51768:15;51761:22;;51684:107;:::o;44270:1469::-;44525:4;44574:1;44550:26;;:12;:26;;;44542:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44636:6;44624:9;:18;44616:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44698:1;44688:7;:11;44680:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;44764:1;44741:19;:24;;44733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44812:25;44840:75;44892:12;44840:37;:75::i;:::-;44812:103;;44926:13;44951:6;44942;:15;;;;:::i;:::-;44926:31;;45008:254;;;;;;;;45038:12;45008:254;;;;;;45065:5;45008:254;;;;45085:6;45008:254;;;;45106:9;45008:254;;;;45130:19;45008:254;;;;45164:7;45008:254;;;;45186:1;45008:254;;;;45202:4;45008:254;;;;;;45221:10;45008:254;;;;;;45246:5;45008:254;;;;;44970:16;:35;44987:17;44970:35;;;;;;;;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45335:7;45305:27;;:37;;;;:::i;:::-;45275:27;:67;;;;45353:19;45378:17;45353:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45407:19;:33;45427:12;45407:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;45460:164;45496:10;45521:12;45548:17;45580:19;:33;45600:12;45580:33;;;;;;;;;;;;;;;;45460:164;;;;;;;;;:::i;:::-;;;;;;;;45668:6;45645:36;;;45682:7;45645:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45637:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;45727:4;45720:11;;;;44270:1469;;;;;;;;;:::o;25945:315::-;25243:1;26074:7;;:18;26070:88;;26116:30;;;;;;;;;;;;;;26070:88;25243:1;26235:7;:17;;;;25945:315::o;18871:162::-;18954:71;18974:5;18996;:14;;;19013:2;19017:5;18981:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18954:19;:71::i;:::-;18871:162;;;:::o;26268:212::-;25200:1;26451:7;:21;;;;26268:212::o;50869:807::-;50982:7;51002:19;51024:16;:14;:16::i;:::-;51002:38;;51072:15;:21;;;51058:11;:35;51057:64;;;;51098:15;:23;;;51057:64;51053:616;;;51145:1;51138:8;;;;;51053:616;51221:15;:24;;;51197:15;:21;;;:48;;;;:::i;:::-;51182:11;:63;51164:505;;51309:15;:24;;;51279:15;:27;;;:54;;;;:::i;:::-;51272:61;;;;;51164:505;51366:21;51404:15;:21;;;51390:11;:35;;;;:::i;:::-;51366:59;;51440:20;51528:15;:24;;;51511:13;51464:15;:27;;;:60;;;;:::i;:::-;51463:89;;;;:::i;:::-;51440:112;;51597:15;:24;;;51582:12;:39;;;;:::i;:::-;51567:54;;51645:12;51638:19;;;;;50869:807;;;;:::o;4174:191::-;4248:16;4267:6;;;;;;;;;;;4248:25;;4293:8;4284:6;;:17;;;;;;;;;;;;;;;;;;4348:8;4317:40;;4338:8;4317:40;;;;;;;;;;;;4237:128;4174:191;:::o;28116:156::-;28207:4;28260;28231:25;28244:5;28251:4;28231:12;:25::i;:::-;:33;28224:40;;28116:156;;;;;:::o;870:98::-;923:7;950:10;943:17;;870:98;:::o;21682:638::-;22106:23;22132:33;22160:4;22140:5;22132:27;;;;:33;;;;:::i;:::-;22106:59;;22201:1;22180:10;:17;:22;;:57;;;;;22218:10;22207:30;;;;;;;;;;;;:::i;:::-;22206:31;22180:57;22176:137;;;22294:5;22261:40;;;;;;;;;;;:::i;:::-;;;;;;;;22176:137;21752:568;21682:638;;:::o;28835:296::-;28918:7;28938:20;28961:4;28938:27;;28981:9;28976:118;29000:5;:12;28996:1;:16;28976:118;;;29049:33;29059:12;29073:5;29079:1;29073:8;;;;;;;;:::i;:::-;;;;;;;;29049:9;:33::i;:::-;29034:48;;29014:3;;;;;:::i;:::-;;;;28976:118;;;;29111:12;29104:19;;;28835:296;;;;:::o;7169:153::-;7244:12;7276:38;7298:6;7306:4;7312:1;7276:21;:38::i;:::-;7269:45;;7169:153;;;;:::o;36265:149::-;36328:7;36359:1;36355;:5;:51;;36386:20;36401:1;36404;36386:14;:20::i;:::-;36355:51;;;36363:20;36378:1;36381;36363:14;:20::i;:::-;36355:51;36348:58;;36265:149;;;;:::o;7657:398::-;7756:12;7809:5;7785:21;:29;7781:110;;;7873:4;7838:41;;;;;;;;;;;:::i;:::-;;;;;;;;7781:110;7902:12;7916:23;7943:6;:11;;7962:5;7969:4;7943:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7901:73;;;;7992:55;8019:6;8027:7;8036:10;7992:26;:55::i;:::-;7985:62;;;;7657:398;;;;;:::o;36539:268::-;36607:13;36714:1;36708:4;36701:15;36743:1;36737:4;36730:15;36784:4;36778;36768:21;36759:30;;36539:268;;;;:::o;9133:597::-;9281:12;9311:7;9306:417;;9335:19;9343:10;9335:7;:19::i;:::-;9306:417;;;9584:1;9563:10;:17;:22;:49;;;;;9611:1;9589:6;:18;;;:23;9563:49;9559:121;;;9657:6;9640:24;;;;;;;;;;;:::i;:::-;;;;;;;;9559:121;9701:10;9694:17;;;;9306:417;9133:597;;;;;;:::o;10283:528::-;10436:1;10416:10;:17;:21;10412:392;;;10648:10;10642:17;10705:15;10692:10;10688:2;10684:19;10677:44;10412:392;10775:17;;;;;;;;;;;;;;-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;442:126::-;479:7;519:42;512:5;508:54;497:65;;442:126;;;:::o;574:96::-;611:7;640:24;658:5;640:24;:::i;:::-;629:35;;574:96;;;:::o;676:118::-;763:24;781:5;763:24;:::i;:::-;758:3;751:37;676:118;;:::o;800:222::-;893:4;931:2;920:9;916:18;908:26;;944:71;1012:1;1001:9;997:17;988:6;944:71;:::i;:::-;800:222;;;;:::o;1109:117::-;1218:1;1215;1208:12;1232:117;1341:1;1338;1331:12;1355:122;1428:24;1446:5;1428:24;:::i;:::-;1421:5;1418:35;1408:63;;1467:1;1464;1457:12;1408:63;1355:122;:::o;1483:139::-;1529:5;1567:6;1554:20;1545:29;;1583:33;1610:5;1583:33;:::i;:::-;1483:139;;;;:::o;1628:122::-;1701:24;1719:5;1701:24;:::i;:::-;1694:5;1691:35;1681:63;;1740:1;1737;1730:12;1681:63;1628:122;:::o;1756:139::-;1802:5;1840:6;1827:20;1818:29;;1856:33;1883:5;1856:33;:::i;:::-;1756:139;;;;:::o;1901:90::-;1935:7;1978:5;1971:13;1964:21;1953:32;;1901:90;;;:::o;1997:116::-;2067:21;2082:5;2067:21;:::i;:::-;2060:5;2057:32;2047:60;;2103:1;2100;2093:12;2047:60;1997:116;:::o;2119:133::-;2162:5;2200:6;2187:20;2178:29;;2216:30;2240:5;2216:30;:::i;:::-;2119:133;;;;:::o;2258:1051::-;2359:6;2367;2375;2383;2391;2399;2448:3;2436:9;2427:7;2423:23;2419:33;2416:120;;;2455:79;;:::i;:::-;2416:120;2575:1;2600:53;2645:7;2636:6;2625:9;2621:22;2600:53;:::i;:::-;2590:63;;2546:117;2702:2;2728:53;2773:7;2764:6;2753:9;2749:22;2728:53;:::i;:::-;2718:63;;2673:118;2830:2;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2801:118;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:3;3113:50;3155:7;3146:6;3135:9;3131:22;3113:50;:::i;:::-;3103:60;;3057:116;3212:3;3239:53;3284:7;3275:6;3264:9;3260:22;3239:53;:::i;:::-;3229:63;;3183:119;2258:1051;;;;;;;;:::o;3315:109::-;3396:21;3411:5;3396:21;:::i;:::-;3391:3;3384:34;3315:109;;:::o;3430:210::-;3517:4;3555:2;3544:9;3540:18;3532:26;;3568:65;3630:1;3619:9;3615:17;3606:6;3568:65;:::i;:::-;3430:210;;;;:::o;3646:329::-;3705:6;3754:2;3742:9;3733:7;3729:23;3725:32;3722:119;;;3760:79;;:::i;:::-;3722:119;3880:1;3905:53;3950:7;3941:6;3930:9;3926:22;3905:53;:::i;:::-;3895:63;;3851:117;3646:329;;;;:::o;3981:77::-;4018:7;4047:5;4036:16;;3981:77;;;:::o;4064:118::-;4151:24;4169:5;4151:24;:::i;:::-;4146:3;4139:37;4064:118;;:::o;4188:222::-;4281:4;4319:2;4308:9;4304:18;4296:26;;4332:71;4400:1;4389:9;4385:17;4376:6;4332:71;:::i;:::-;4188:222;;;;:::o;4416:329::-;4475:6;4524:2;4512:9;4503:7;4499:23;4495:32;4492:119;;;4530:79;;:::i;:::-;4492:119;4650:1;4675:53;4720:7;4711:6;4700:9;4696:22;4675:53;:::i;:::-;4665:63;;4621:117;4416:329;;;;:::o;4751:122::-;4824:24;4842:5;4824:24;:::i;:::-;4817:5;4814:35;4804:63;;4863:1;4860;4853:12;4804:63;4751:122;:::o;4879:139::-;4925:5;4963:6;4950:20;4941:29;;4979:33;5006:5;4979:33;:::i;:::-;4879:139;;;;:::o;5024:329::-;5083:6;5132:2;5120:9;5111:7;5107:23;5103:32;5100:119;;;5138:79;;:::i;:::-;5100:119;5258:1;5283:53;5328:7;5319:6;5308:9;5304:22;5283:53;:::i;:::-;5273:63;;5229:117;5024:329;;;;:::o;5359:108::-;5436:24;5454:5;5436:24;:::i;:::-;5431:3;5424:37;5359:108;;:::o;5473:::-;5550:24;5568:5;5550:24;:::i;:::-;5545:3;5538:37;5473:108;;:::o;5587:99::-;5658:21;5673:5;5658:21;:::i;:::-;5653:3;5646:34;5587:99;;:::o;5774:1960::-;5937:6;5932:3;5928:16;6033:4;6026:5;6022:16;6016:23;6052:63;6109:4;6104:3;6100:14;6086:12;6052:63;:::i;:::-;5954:171;6208:4;6201:5;6197:16;6191:23;6227:63;6284:4;6279:3;6275:14;6261:12;6227:63;:::i;:::-;6135:165;6383:4;6376:5;6372:16;6366:23;6402:63;6459:4;6454:3;6450:14;6436:12;6402:63;:::i;:::-;6310:165;6561:4;6554:5;6550:16;6544:23;6580:63;6637:4;6632:3;6628:14;6614:12;6580:63;:::i;:::-;6485:168;6749:4;6742:5;6738:16;6732:23;6768:63;6825:4;6820:3;6816:14;6802:12;6768:63;:::i;:::-;6663:178;6930:4;6923:5;6919:16;6913:23;6949:63;7006:4;7001:3;6997:14;6983:12;6949:63;:::i;:::-;6851:171;7108:4;7101:5;7097:16;7091:23;7127:63;7184:4;7179:3;7175:14;7161:12;7127:63;:::i;:::-;7032:168;7289:4;7282:5;7278:16;7272:23;7308:57;7359:4;7354:3;7350:14;7336:12;7308:57;:::i;:::-;7210:165;7462:6;7455:5;7451:18;7445:25;7483:59;7534:6;7529:3;7525:16;7511:12;7483:59;:::i;:::-;7385:167;7637:6;7630:5;7626:18;7620:25;7658:59;7709:6;7704:3;7700:16;7686:12;7658:59;:::i;:::-;7562:165;5906:1828;5774:1960;;:::o;7740:355::-;7899:4;7937:3;7926:9;7922:19;7914:27;;7951:137;8085:1;8074:9;8070:17;8061:6;7951:137;:::i;:::-;7740:355;;;;:::o;8101:474::-;8169:6;8177;8226:2;8214:9;8205:7;8201:23;8197:32;8194:119;;;8232:79;;:::i;:::-;8194:119;8352:1;8377:53;8422:7;8413:6;8402:9;8398:22;8377:53;:::i;:::-;8367:63;;8323:117;8479:2;8505:53;8550:7;8541:6;8530:9;8526:22;8505:53;:::i;:::-;8495:63;;8450:118;8101:474;;;;;:::o;8581:117::-;8690:1;8687;8680:12;8704:117;8813:1;8810;8803:12;8827:117;8936:1;8933;8926:12;8967:568;9040:8;9050:6;9100:3;9093:4;9085:6;9081:17;9077:27;9067:122;;9108:79;;:::i;:::-;9067:122;9221:6;9208:20;9198:30;;9251:18;9243:6;9240:30;9237:117;;;9273:79;;:::i;:::-;9237:117;9387:4;9379:6;9375:17;9363:29;;9441:3;9433:4;9425:6;9421:17;9411:8;9407:32;9404:41;9401:128;;;9448:79;;:::i;:::-;9401:128;8967:568;;;;;:::o;9541:1281::-;9669:6;9677;9685;9693;9701;9709;9717;9766:3;9754:9;9745:7;9741:23;9737:33;9734:120;;;9773:79;;:::i;:::-;9734:120;9921:1;9910:9;9906:17;9893:31;9951:18;9943:6;9940:30;9937:117;;;9973:79;;:::i;:::-;9937:117;10086:80;10158:7;10149:6;10138:9;10134:22;10086:80;:::i;:::-;10068:98;;;;9864:312;10215:2;10241:53;10286:7;10277:6;10266:9;10262:22;10241:53;:::i;:::-;10231:63;;10186:118;10343:2;10369:53;10414:7;10405:6;10394:9;10390:22;10369:53;:::i;:::-;10359:63;;10314:118;10471:2;10497:53;10542:7;10533:6;10522:9;10518:22;10497:53;:::i;:::-;10487:63;;10442:118;10599:3;10626:53;10671:7;10662:6;10651:9;10647:22;10626:53;:::i;:::-;10616:63;;10570:119;10728:3;10755:50;10797:7;10788:6;10777:9;10773:22;10755:50;:::i;:::-;10745:60;;10699:116;9541:1281;;;;;;;;;;:::o;10828:169::-;10912:11;10946:6;10941:3;10934:19;10986:4;10981:3;10977:14;10962:29;;10828:169;;;;:::o;11003:167::-;11143:19;11139:1;11131:6;11127:14;11120:43;11003:167;:::o;11176:366::-;11318:3;11339:67;11403:2;11398:3;11339:67;:::i;:::-;11332:74;;11415:93;11504:3;11415:93;:::i;:::-;11533:2;11528:3;11524:12;11517:19;;11176:366;;;:::o;11548:419::-;11714:4;11752:2;11741:9;11737:18;11729:26;;11801:9;11795:4;11791:20;11787:1;11776:9;11772:17;11765:47;11829:131;11955:4;11829:131;:::i;:::-;11821:139;;11548:419;;;:::o;11973:180::-;12113:32;12109:1;12101:6;12097:14;12090:56;11973:180;:::o;12159:366::-;12301:3;12322:67;12386:2;12381:3;12322:67;:::i;:::-;12315:74;;12398:93;12487:3;12398:93;:::i;:::-;12516:2;12511:3;12507:12;12500:19;;12159:366;;;:::o;12531:419::-;12697:4;12735:2;12724:9;12720:18;12712:26;;12784:9;12778:4;12774:20;12770:1;12759:9;12755:17;12748:47;12812:131;12938:4;12812:131;:::i;:::-;12804:139;;12531:419;;;:::o;12956:169::-;13096:21;13092:1;13084:6;13080:14;13073:45;12956:169;:::o;13131:366::-;13273:3;13294:67;13358:2;13353:3;13294:67;:::i;:::-;13287:74;;13370:93;13459:3;13370:93;:::i;:::-;13488:2;13483:3;13479:12;13472:19;;13131:366;;;:::o;13503:419::-;13669:4;13707:2;13696:9;13692:18;13684:26;;13756:9;13750:4;13746:20;13742:1;13731:9;13727:17;13720:47;13784:131;13910:4;13784:131;:::i;:::-;13776:139;;13503:419;;;:::o;13928:175::-;14068:27;14064:1;14056:6;14052:14;14045:51;13928:175;:::o;14109:366::-;14251:3;14272:67;14336:2;14331:3;14272:67;:::i;:::-;14265:74;;14348:93;14437:3;14348:93;:::i;:::-;14466:2;14461:3;14457:12;14450:19;;14109:366;;;:::o;14481:419::-;14647:4;14685:2;14674:9;14670:18;14662:26;;14734:9;14728:4;14724:20;14720:1;14709:9;14705:17;14698:47;14762:131;14888:4;14762:131;:::i;:::-;14754:139;;14481:419;;;:::o;14906:177::-;15046:29;15042:1;15034:6;15030:14;15023:53;14906:177;:::o;15089:366::-;15231:3;15252:67;15316:2;15311:3;15252:67;:::i;:::-;15245:74;;15328:93;15417:3;15328:93;:::i;:::-;15446:2;15441:3;15437:12;15430:19;;15089:366;;;:::o;15461:419::-;15627:4;15665:2;15654:9;15650:18;15642:26;;15714:9;15708:4;15704:20;15700:1;15689:9;15685:17;15678:47;15742:131;15868:4;15742:131;:::i;:::-;15734:139;;15461:419;;;:::o;15886:173::-;16026:25;16022:1;16014:6;16010:14;16003:49;15886:173;:::o;16065:366::-;16207:3;16228:67;16292:2;16287:3;16228:67;:::i;:::-;16221:74;;16304:93;16393:3;16304:93;:::i;:::-;16422:2;16417:3;16413:12;16406:19;;16065:366;;;:::o;16437:419::-;16603:4;16641:2;16630:9;16626:18;16618:26;;16690:9;16684:4;16680:20;16676:1;16665:9;16661:17;16654:47;16718:131;16844:4;16718:131;:::i;:::-;16710:139;;16437:419;;;:::o;16862:180::-;16910:77;16907:1;16900:88;17007:4;17004:1;16997:15;17031:4;17028:1;17021:15;17048:191;17088:3;17107:20;17125:1;17107:20;:::i;:::-;17102:25;;17141:20;17159:1;17141:20;:::i;:::-;17136:25;;17184:1;17181;17177:9;17170:16;;17205:3;17202:1;17199:10;17196:36;;;17212:18;;:::i;:::-;17196:36;17048:191;;;;:::o;17245:194::-;17285:4;17305:20;17323:1;17305:20;:::i;:::-;17300:25;;17339:20;17357:1;17339:20;:::i;:::-;17334:25;;17383:1;17380;17376:9;17368:17;;17407:1;17401:4;17398:11;17395:37;;;17412:18;;:::i;:::-;17395:37;17245:194;;;;:::o;17445:94::-;17478:8;17526:5;17522:2;17518:14;17497:35;;17445:94;;;:::o;17545:::-;17584:7;17613:20;17627:5;17613:20;:::i;:::-;17602:31;;17545:94;;;:::o;17645:100::-;17684:7;17713:26;17733:5;17713:26;:::i;:::-;17702:37;;17645:100;;;:::o;17751:157::-;17856:45;17876:24;17894:5;17876:24;:::i;:::-;17856:45;:::i;:::-;17851:3;17844:58;17751:157;;:::o;17914:79::-;17953:7;17982:5;17971:16;;17914:79;;;:::o;17999:157::-;18104:45;18124:24;18142:5;18124:24;:::i;:::-;18104:45;:::i;:::-;18099:3;18092:58;17999:157;;:::o;18162:397::-;18302:3;18317:75;18388:3;18379:6;18317:75;:::i;:::-;18417:2;18412:3;18408:12;18401:19;;18430:75;18501:3;18492:6;18430:75;:::i;:::-;18530:2;18525:3;18521:12;18514:19;;18550:3;18543:10;;18162:397;;;;;:::o;18565:143::-;18622:5;18653:6;18647:13;18638:22;;18669:33;18696:5;18669:33;:::i;:::-;18565:143;;;;:::o;18714:351::-;18784:6;18833:2;18821:9;18812:7;18808:23;18804:32;18801:119;;;18839:79;;:::i;:::-;18801:119;18959:1;18984:64;19040:7;19031:6;19020:9;19016:22;18984:64;:::i;:::-;18974:74;;18930:128;18714:351;;;;:::o;19071:175::-;19211:27;19207:1;19199:6;19195:14;19188:51;19071:175;:::o;19252:366::-;19394:3;19415:67;19479:2;19474:3;19415:67;:::i;:::-;19408:74;;19491:93;19580:3;19491:93;:::i;:::-;19609:2;19604:3;19600:12;19593:19;;19252:366;;;:::o;19624:419::-;19790:4;19828:2;19817:9;19813:18;19805:26;;19877:9;19871:4;19867:20;19863:1;19852:9;19848:17;19841:47;19905:131;20031:4;19905:131;:::i;:::-;19897:139;;19624:419;;;:::o;20049:165::-;20189:17;20185:1;20177:6;20173:14;20166:41;20049:165;:::o;20220:366::-;20362:3;20383:67;20447:2;20442:3;20383:67;:::i;:::-;20376:74;;20459:93;20548:3;20459:93;:::i;:::-;20577:2;20572:3;20568:12;20561:19;;20220:366;;;:::o;20592:419::-;20758:4;20796:2;20785:9;20781:18;20773:26;;20845:9;20839:4;20835:20;20831:1;20820:9;20816:17;20809:47;20873:131;20999:4;20873:131;:::i;:::-;20865:139;;20592:419;;;:::o;21017:174::-;21157:26;21153:1;21145:6;21141:14;21134:50;21017:174;:::o;21197:366::-;21339:3;21360:67;21424:2;21419:3;21360:67;:::i;:::-;21353:74;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21197:366;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:874::-;22249:4;22287:3;22276:9;22272:19;22264:27;;22301:71;22369:1;22358:9;22354:17;22345:6;22301:71;:::i;:::-;22382:72;22450:2;22439:9;22435:18;22426:6;22382:72;:::i;:::-;22464;22532:2;22521:9;22517:18;22508:6;22464:72;:::i;:::-;22546;22614:2;22603:9;22599:18;22590:6;22546:72;:::i;:::-;22628:73;22696:3;22685:9;22681:19;22672:6;22628:73;:::i;:::-;22711;22779:3;22768:9;22764:19;22755:6;22711:73;:::i;:::-;22794:67;22856:3;22845:9;22841:19;22832:6;22794:67;:::i;:::-;21994:874;;;;;;;;;;:::o;22874:163::-;23014:15;23010:1;23002:6;22998:14;22991:39;22874:163;:::o;23043:366::-;23185:3;23206:67;23270:2;23265:3;23206:67;:::i;:::-;23199:74;;23282:93;23371:3;23282:93;:::i;:::-;23400:2;23395:3;23391:12;23384:19;;23043:366;;;:::o;23415:419::-;23581:4;23619:2;23608:9;23604:18;23596:26;;23668:9;23662:4;23658:20;23654:1;23643:9;23639:17;23632:47;23696:131;23822:4;23696:131;:::i;:::-;23688:139;;23415:419;;;:::o;23840:137::-;23894:5;23925:6;23919:13;23910:22;;23941:30;23965:5;23941:30;:::i;:::-;23840:137;;;;:::o;23983:345::-;24050:6;24099:2;24087:9;24078:7;24074:23;24070:32;24067:119;;;24105:79;;:::i;:::-;24067:119;24225:1;24250:61;24303:7;24294:6;24283:9;24279:22;24250:61;:::i;:::-;24240:71;;24196:125;23983:345;;;;:::o;24334:162::-;24474:14;24470:1;24462:6;24458:14;24451:38;24334:162;:::o;24502:366::-;24644:3;24665:67;24729:2;24724:3;24665:67;:::i;:::-;24658:74;;24741:93;24830:3;24741:93;:::i;:::-;24859:2;24854:3;24850:12;24843:19;;24502:366;;;:::o;24874:419::-;25040:4;25078:2;25067:9;25063:18;25055:26;;25127:9;25121:4;25117:20;25113:1;25102:9;25098:17;25091:47;25155:131;25281:4;25155:131;:::i;:::-;25147:139;;24874:419;;;:::o;25299:170::-;25439:22;25435:1;25427:6;25423:14;25416:46;25299:170;:::o;25475:366::-;25617:3;25638:67;25702:2;25697:3;25638:67;:::i;:::-;25631:74;;25714:93;25803:3;25714:93;:::i;:::-;25832:2;25827:3;25823:12;25816:19;;25475:366;;;:::o;25847:419::-;26013:4;26051:2;26040:9;26036:18;26028:26;;26100:9;26094:4;26090:20;26086:1;26075:9;26071:17;26064:47;26128:131;26254:4;26128:131;:::i;:::-;26120:139;;25847:419;;;:::o;26272:180::-;26320:77;26317:1;26310:88;26417:4;26414:1;26407:15;26441:4;26438:1;26431:15;26458:174;26598:26;26594:1;26586:6;26582:14;26575:50;26458:174;:::o;26638:366::-;26780:3;26801:67;26865:2;26860:3;26801:67;:::i;:::-;26794:74;;26877:93;26966:3;26877:93;:::i;:::-;26995:2;26990:3;26986:12;26979:19;;26638:366;;;:::o;27010:419::-;27176:4;27214:2;27203:9;27199:18;27191:26;;27263:9;27257:4;27253:20;27249:1;27238:9;27234:17;27227:47;27291:131;27417:4;27291:131;:::i;:::-;27283:139;;27010:419;;;:::o;27435:172::-;27575:24;27571:1;27563:6;27559:14;27552:48;27435:172;:::o;27613:366::-;27755:3;27776:67;27840:2;27835:3;27776:67;:::i;:::-;27769:74;;27852:93;27941:3;27852:93;:::i;:::-;27970:2;27965:3;27961:12;27954:19;;27613:366;;;:::o;27985:419::-;28151:4;28189:2;28178:9;28174:18;28166:26;;28238:9;28232:4;28228:20;28224:1;28213:9;28209:17;28202:47;28266:131;28392:4;28266:131;:::i;:::-;28258:139;;27985:419;;;:::o;28410:168::-;28550:20;28546:1;28538:6;28534:14;28527:44;28410:168;:::o;28584:366::-;28726:3;28747:67;28811:2;28806:3;28747:67;:::i;:::-;28740:74;;28823:93;28912:3;28823:93;:::i;:::-;28941:2;28936:3;28932:12;28925:19;;28584:366;;;:::o;28956:419::-;29122:4;29160:2;29149:9;29145:18;29137:26;;29209:9;29203:4;29199:20;29195:1;29184:9;29180:17;29173:47;29237:131;29363:4;29237:131;:::i;:::-;29229:139;;28956:419;;;:::o;29381:181::-;29521:33;29517:1;29509:6;29505:14;29498:57;29381:181;:::o;29568:366::-;29710:3;29731:67;29795:2;29790:3;29731:67;:::i;:::-;29724:74;;29807:93;29896:3;29807:93;:::i;:::-;29925:2;29920:3;29916:12;29909:19;;29568:366;;;:::o;29940:419::-;30106:4;30144:2;30133:9;30129:18;30121:26;;30193:9;30187:4;30183:20;30179:1;30168:9;30164:17;30157:47;30221:131;30347:4;30221:131;:::i;:::-;30213:139;;29940:419;;;:::o;30365:233::-;30404:3;30427:24;30445:5;30427:24;:::i;:::-;30418:33;;30473:66;30466:5;30463:77;30460:103;;30543:18;;:::i;:::-;30460:103;30590:1;30583:5;30579:13;30572:20;;30365:233;;;:::o;30604:553::-;30781:4;30819:3;30808:9;30804:19;30796:27;;30833:71;30901:1;30890:9;30886:17;30877:6;30833:71;:::i;:::-;30914:72;30982:2;30971:9;30967:18;30958:6;30914:72;:::i;:::-;30996;31064:2;31053:9;31049:18;31040:6;30996:72;:::i;:::-;31078;31146:2;31135:9;31131:18;31122:6;31078:72;:::i;:::-;30604:553;;;;;;;:::o;31163:332::-;31284:4;31322:2;31311:9;31307:18;31299:26;;31335:71;31403:1;31392:9;31388:17;31379:6;31335:71;:::i;:::-;31416:72;31484:2;31473:9;31469:18;31460:6;31416:72;:::i;:::-;31163:332;;;;;:::o;31501:410::-;31541:7;31564:20;31582:1;31564:20;:::i;:::-;31559:25;;31598:20;31616:1;31598:20;:::i;:::-;31593:25;;31653:1;31650;31646:9;31675:30;31693:11;31675:30;:::i;:::-;31664:41;;31854:1;31845:7;31841:15;31838:1;31835:22;31815:1;31808:9;31788:83;31765:139;;31884:18;;:::i;:::-;31765:139;31549:362;31501:410;;;;:::o;31917:180::-;31965:77;31962:1;31955:88;32062:4;32059:1;32052:15;32086:4;32083:1;32076:15;32103:185;32143:1;32160:20;32178:1;32160:20;:::i;:::-;32155:25;;32194:20;32212:1;32194:20;:::i;:::-;32189:25;;32233:1;32223:35;;32238:18;;:::i;:::-;32223:35;32280:1;32277;32273:9;32268:14;;32103:185;;;;:::o;32294:98::-;32345:6;32379:5;32373:12;32363:22;;32294:98;;;:::o;32398:147::-;32499:11;32536:3;32521:18;;32398:147;;;;:::o;32551:246::-;32632:1;32642:113;32656:6;32653:1;32650:13;32642:113;;;32741:1;32736:3;32732:11;32726:18;32722:1;32717:3;32713:11;32706:39;32678:2;32675:1;32671:10;32666:15;;32642:113;;;32789:1;32780:6;32775:3;32771:16;32764:27;32613:184;32551:246;;;:::o;32803:386::-;32907:3;32935:38;32967:5;32935:38;:::i;:::-;32989:88;33070:6;33065:3;32989:88;:::i;:::-;32982:95;;33086:65;33144:6;33139:3;33132:4;33125:5;33121:16;33086:65;:::i;:::-;33176:6;33171:3;33167:16;33160:23;;32911:278;32803:386;;;;:::o;33195:271::-;33325:3;33347:93;33436:3;33427:6;33347:93;:::i;:::-;33340:100;;33457:3;33450:10;;33195:271;;;;:::o
Swarm Source
ipfs://e648d21634ba7028b10f9027197ec74919c97341a913b179b8e0d9f01523466d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.002038 | 214,921,678.9258 | $438,077.01 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.