Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 200 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 18695517 | 352 days ago | IN | 0 ETH | 0.00067959 | ||||
Claim | 18695248 | 352 days ago | IN | 0 ETH | 0.00073005 | ||||
Claim | 18695241 | 352 days ago | IN | 0 ETH | 0.00074174 | ||||
Claim | 18694378 | 352 days ago | IN | 0 ETH | 0.00083399 | ||||
Claim | 18694219 | 352 days ago | IN | 0 ETH | 0.00109912 | ||||
Purchase WL | 18641978 | 359 days ago | IN | 0.95 ETH | 0.00427091 | ||||
Purchase WL | 18641812 | 359 days ago | IN | 0.4 ETH | 0.00381367 | ||||
Purchase WL | 18641235 | 359 days ago | IN | 1 ETH | 0.00336348 | ||||
Purchase WL | 18640484 | 359 days ago | IN | 1 ETH | 0.00344368 | ||||
Purchase WL | 18639858 | 359 days ago | IN | 1 ETH | 0.00261914 | ||||
Purchase WL | 18639518 | 359 days ago | IN | 1 ETH | 0.00211834 | ||||
Purchase WL | 18639353 | 359 days ago | IN | 0.4 ETH | 0.00249497 | ||||
Purchase WL | 18638075 | 360 days ago | IN | 1 ETH | 0.00235592 | ||||
Purchase WL | 18637561 | 360 days ago | IN | 1 ETH | 0.00330542 | ||||
Purchase WL | 18637561 | 360 days ago | IN | 1 ETH | 0.00330602 | ||||
Purchase WL | 18637552 | 360 days ago | IN | 1 ETH | 0.00311542 | ||||
Purchase WL | 18637400 | 360 days ago | IN | 0.8 ETH | 0.0033496 | ||||
Purchase WL | 18637376 | 360 days ago | IN | 1 ETH | 0.00276874 | ||||
Purchase WL | 18637369 | 360 days ago | IN | 1 ETH | 0.00300795 | ||||
Purchase WL | 18637303 | 360 days ago | IN | 1 ETH | 0.00298454 | ||||
Purchase WL | 18637273 | 360 days ago | IN | 0.4 ETH | 0.00307412 | ||||
Purchase WL | 18637128 | 360 days ago | IN | 1 ETH | 0.00415364 | ||||
Purchase WL | 18637127 | 360 days ago | IN | 0.55 ETH | 0.0039638 | ||||
Purchase WL | 18637116 | 360 days ago | IN | 1 ETH | 0.00454769 | ||||
Purchase WL | 18637080 | 360 days ago | IN | 1 ETH | 0.00369329 |
Loading...
Loading
Contract Name:
Presale
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-09 */ // Sources flattened with hardhat v2.17.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @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); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * 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.isContract(address(token)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @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 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} * * _Available since v4.7._ */ 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. * * _Available since v4.4._ */ 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} * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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). * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); 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. * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } 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/Presale.sol pragma solidity ^0.8.0; contract Presale is Ownable { using SafeERC20 for IERC20; struct User { uint amountIn; uint amountOut; uint vesting_time; uint claimed; } IERC20 public immutable TOKEN; uint public immutable VESTING_TIME_WL; uint public immutable VESTING_TIME; mapping(address => User) public users; bytes32 public ROOT; uint public totalOut; uint public totalTokens; uint public state; uint public START_CLAIM_TIME; uint public MIN_AMOUNT_IN; uint public MAX_AMOUNT_IN; uint public MAX_TOTAL_OUT; uint public MAX_SALE; uint public actualSale; uint public price; constructor(IERC20 _token, uint _vestingTime, uint _vestingTimeWL,uint _minAmountIn, uint _maxAmountIn, uint _maxTotalOut, uint _price, address _multisig) { TOKEN = _token; VESTING_TIME = _vestingTime; VESTING_TIME_WL = _vestingTimeWL; price = _price; MIN_AMOUNT_IN = _minAmountIn; MAX_AMOUNT_IN = _maxAmountIn; MAX_TOTAL_OUT = _maxTotalOut; transferOwnership(_multisig); } function setOptions(uint _minAmountIn, uint _maxAmountIn, uint _price) external onlyOwner { MIN_AMOUNT_IN = _minAmountIn; MAX_AMOUNT_IN = _maxAmountIn; price = _price; } function setMaxAmounts(uint _minAmountIn, uint _maxAmountIn) external onlyOwner { MIN_AMOUNT_IN = _minAmountIn; MAX_AMOUNT_IN = _maxAmountIn; } function setMaxTotalOut(uint _maxTotalOut) external onlyOwner { MAX_TOTAL_OUT = _maxTotalOut; } function setPrice(uint _price) external onlyOwner { price = _price; } function setTotalTokens(uint amount) external onlyOwner { require(START_CLAIM_TIME == 0, "claim started"); TOKEN.safeTransferFrom(_msgSender(), address(this), amount); totalTokens += amount; } function startWL(bytes32 root, uint _max_sale) external onlyOwner { require(START_CLAIM_TIME == 0, "claim started"); MAX_SALE = _max_sale; ROOT = root; state = 1; } function pause() external onlyOwner { require(START_CLAIM_TIME == 0, "claim started"); Address.sendValue(payable(owner()), address(this).balance); actualSale = 0; state = 0; } function startPublic() external onlyOwner { require(START_CLAIM_TIME == 0, "claim started"); state = 2; } function startClaim(uint additionalTime) external onlyOwner { require(START_CLAIM_TIME == 0, "claim started"); require(additionalTime <= 1 days, "too long"); START_CLAIM_TIME = block.timestamp + additionalTime; Address.sendValue(payable(owner()), address(this).balance); delete state; } function purchaseWL(bytes32[] calldata proof) external payable { require(state == 1, "purchase WL is off"); require(msg.value >= MIN_AMOUNT_IN, "amount in too low"); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(proof, ROOT, leaf), "invalid proof"); User storage user = users[_msgSender()]; user.amountIn += msg.value; uint amountOut = msg.value * price; require(user.amountIn <= MAX_AMOUNT_IN, "max amount in reached"); require(MAX_TOTAL_OUT >= totalOut + amountOut, "total amount out reached"); require(MAX_SALE >= actualSale + user.amountIn, "Actual Sale completed"); actualSale += user.amountIn; user.vesting_time = VESTING_TIME_WL; user.amountOut += amountOut; totalOut += amountOut; } function purchasePublic() external payable { require(state == 2, "purchase public is off"); require(msg.value >= MIN_AMOUNT_IN, "amount in too low"); User storage user = users[_msgSender()]; user.amountIn += msg.value; uint amountOut = msg.value * price; require(user.amountIn <= MAX_AMOUNT_IN, "max amount in reached"); require(MAX_TOTAL_OUT >= totalOut + amountOut); if (user.vesting_time < VESTING_TIME) user.vesting_time = VESTING_TIME; user.amountOut += amountOut; totalOut += amountOut; } function claim() external { uint startClaimTimeCached = START_CLAIM_TIME; require(startClaimTimeCached > 0, "cannot claim yet"); uint claimable = pendingOf(_msgSender()); require(claimable > 0, "nothing to claim"); users[_msgSender()].claimed += claimable; TOKEN.safeTransfer(_msgSender(), claimable); } function pendingOf(address who) public view returns (uint) { uint startClaimTimeCached = START_CLAIM_TIME; if (startClaimTimeCached == 0 || startClaimTimeCached > block.timestamp) return 0; User storage user = users[who]; uint userFinal = user.amountOut; uint amount = userFinal * (block.timestamp - startClaimTimeCached) / user.vesting_time; if (amount > userFinal) amount = userFinal; return amount - user.claimed; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_vestingTime","type":"uint256"},{"internalType":"uint256","name":"_vestingTimeWL","type":"uint256"},{"internalType":"uint256","name":"_minAmountIn","type":"uint256"},{"internalType":"uint256","name":"_maxAmountIn","type":"uint256"},{"internalType":"uint256","name":"_maxTotalOut","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_multisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_AMOUNT_IN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_OUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_AMOUNT_IN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_CLAIM_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_TIME_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"actualSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"pendingOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchasePublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"purchaseWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountIn","type":"uint256"},{"internalType":"uint256","name":"_maxAmountIn","type":"uint256"}],"name":"setMaxAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTotalOut","type":"uint256"}],"name":"setMaxTotalOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountIn","type":"uint256"},{"internalType":"uint256","name":"_maxAmountIn","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTotalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"additionalTime","type":"uint256"}],"name":"startClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"_max_sale","type":"uint256"}],"name":"startWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"vesting_time","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162001925380380620019258339810160408190526200003491620001cf565b6200003f3362000088565b6001600160601b0319606089901b1660805260c087905260a0869052600c8290556007859055600884905560098390556200007a81620000d8565b505050505050505062000249565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000e26200015b565b6001600160a01b0381166200014d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001588162000088565b50565b6000546001600160a01b03163314620001b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000144565b565b6001600160a01b03811681146200015857600080fd5b600080600080600080600080610100898b031215620001ed57600080fd5b8851620001fa81620001b9565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e08901516200023881620001b9565b809150509295985092959890939650565b60805160601c60a05160c0516116866200029f60003960008181610222015281816106e401526107100152600081816105050152610c500152600081816103640152818161086d0152610cdd01526116866000f3fe6080604052600436106101d85760003560e01c80638456cb5911610102578063b0b9226311610095578063c19d93fb11610064578063c19d93fb1461053c578063f2fde38b14610552578063f44136a114610572578063fe9187f71461059257600080fd5b8063b0b92263146104b3578063b36d8a9f146104d3578063ba906af6146104f3578063c11442f81461052757600080fd5b80639a7f5f1c116100d15780639a7f5f1c14610407578063a035b1fe14610427578063a54362271461043d578063a87430ba1461045057600080fd5b80638456cb591461039e578063868eb92c146103b35780638da5cb5b146103c957806391b7f5ed146103e757600080fd5b80634e71d92d1161017a578063715018a611610149578063715018a6146103115780637d16dc6b146103265780637e1c0c091461033c57806382bfefc81461035257600080fd5b80634e71d92d146102b0578063546fb3c6146102c55780635909c12f146102db5780635e35233a146102f157600080fd5b8063136f3cfc116101b6578063136f3cfc1461024457806315d5195c1461025a5780631a6830fe1461027a5780633c0d84de1461029a57600080fd5b806302a5e71d146101dd5780630d76229f146102065780630dea38b614610210575b600080fd5b3480156101e957600080fd5b506101f3600b5481565b6040519081526020015b60405180910390f35b61020e6105a8565b005b34801561021c57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561025057600080fd5b506101f3600a5481565b34801561026657600080fd5b5061020e6102753660046113d0565b61076b565b34801561028657600080fd5b5061020e6102953660046113e9565b610778565b3480156102a657600080fd5b506101f360035481565b3480156102bc57600080fd5b5061020e6107ad565b3480156102d157600080fd5b506101f360065481565b3480156102e757600080fd5b506101f360025481565b3480156102fd57600080fd5b5061020e61030c3660046113e9565b6108a0565b34801561031d57600080fd5b5061020e6108b3565b34801561033257600080fd5b506101f360095481565b34801561034857600080fd5b506101f360045481565b34801561035e57600080fd5b506103867f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fd565b3480156103aa57600080fd5b5061020e6108c7565b3480156103bf57600080fd5b506101f360085481565b3480156103d557600080fd5b506000546001600160a01b0316610386565b3480156103f357600080fd5b5061020e6104023660046113d0565b610916565b34801561041357600080fd5b5061020e6104223660046113d0565b610923565b34801561043357600080fd5b506101f3600c5481565b61020e61044b36600461140b565b6109b3565b34801561045c57600080fd5b5061049361046b366004611480565b6001602081905260009182526040909120805491810154600282015460039092015490919084565b6040805194855260208501939093529183015260608201526080016101fd565b3480156104bf57600080fd5b5061020e6104ce3660046113d0565b610cb0565b3480156104df57600080fd5b5061020e6104ee3660046114a9565b610d27565b3480156104ff57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561053357600080fd5b5061020e610d3d565b34801561054857600080fd5b506101f360055481565b34801561055e57600080fd5b5061020e61056d366004611480565b610d6c565b34801561057e57600080fd5b506101f361058d366004611480565b610de5565b34801561059e57600080fd5b506101f360075481565b6005546002146105f85760405162461bcd60e51b8152602060048201526016602482015275383ab931b430b9b290383ab13634b19034b99037b33360511b60448201526064015b60405180910390fd5b60075434101561063e5760405162461bcd60e51b8152602060048201526011602482015270616d6f756e7420696e20746f6f206c6f7760781b60448201526064016105ef565b3360009081526001602052604081208054909134918391906106619084906114eb565b9091555050600c546000906106769034611503565b9050600854826000015411156106c65760405162461bcd60e51b81526020600482015260156024820152741b585e08185b5bdd5b9d081a5b881c995858da1959605a1b60448201526064016105ef565b806003546106d491906114eb565b60095410156106e257600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082600201541015610735577f000000000000000000000000000000000000000000000000000000000000000060028301555b8082600101600082825461074991906114eb565b92505081905550806003600082825461076291906114eb565b90915550505050565b610773610e70565b600955565b610780610e70565b600654156107a05760405162461bcd60e51b81526004016105ef90611522565b600a556002556001600555565b600654806107f05760405162461bcd60e51b815260206004820152601060248201526f18d85b9b9bdd0818db185a5b481e595d60821b60448201526064016105ef565b60006107fb33610de5565b9050600081116108405760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b60448201526064016105ef565b33600090815260016020526040812060030180548392906108629084906114eb565b9091555061089c90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163383610eca565b5050565b6108a8610e70565b600791909155600855565b6108bb610e70565b6108c56000610f32565b565b6108cf610e70565b600654156108ef5760405162461bcd60e51b81526004016105ef90611522565b61090a6109046000546001600160a01b031690565b47610f82565b6000600b819055600555565b61091e610e70565b600c55565b61092b610e70565b6006541561094b5760405162461bcd60e51b81526004016105ef90611522565b620151808111156109895760405162461bcd60e51b8152602060048201526008602482015267746f6f206c6f6e6760c01b60448201526064016105ef565b61099381426114eb565b6006556109ab6109046000546001600160a01b031690565b506000600555565b6005546001146109fa5760405162461bcd60e51b8152602060048201526012602482015271383ab931b430b9b2902ba61034b99037b33360711b60448201526064016105ef565b600754341015610a405760405162461bcd60e51b8152602060048201526011602482015270616d6f756e7420696e20746f6f206c6f7760781b60448201526064016105ef565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610aba83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600254915084905061109b565b610af65760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016105ef565b336000908152600160205260408120805490913491839190610b199084906114eb565b9091555050600c54600090610b2e9034611503565b905060085482600001541115610b7e5760405162461bcd60e51b81526020600482015260156024820152741b585e08185b5bdd5b9d081a5b881c995858da1959605a1b60448201526064016105ef565b80600354610b8c91906114eb565b6009541015610bdd5760405162461bcd60e51b815260206004820152601860248201527f746f74616c20616d6f756e74206f75742072656163686564000000000000000060448201526064016105ef565b8154600b54610bec91906114eb565b600a541015610c355760405162461bcd60e51b81526020600482015260156024820152741058dd1d585b0814d85b194818dbdb5c1b195d1959605a1b60448201526064016105ef565b8154600b8054600090610c499084906114eb565b90915550507f00000000000000000000000000000000000000000000000000000000000000006002830155600182018054829190600090610c8b9084906114eb565b925050819055508060036000828254610ca491906114eb565b90915550505050505050565b610cb8610e70565b60065415610cd85760405162461bcd60e51b81526004016105ef90611522565b610d0d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330846110b1565b8060046000828254610d1f91906114eb565b909155505050565b610d2f610e70565b600792909255600855600c55565b610d45610e70565b60065415610d655760405162461bcd60e51b81526004016105ef90611522565b6002600555565b610d74610e70565b6001600160a01b038116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ef565b610de281610f32565b50565b600654600090801580610df757504281115b15610e055750600092915050565b6001600160a01b0383166000908152600160208190526040822090810154600282015491929091610e368542611549565b610e409084611503565b610e4a9190611560565b905081811115610e575750805b6003830154610e669082611549565b9695505050505050565b6000546001600160a01b031633146108c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105ef565b6040516001600160a01b038316602482015260448101829052610f2d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526110ef565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015610fd25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105ef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461101f576040519150601f19603f3d011682016040523d82523d6000602084013e611024565b606091505b5050905080610f2d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105ef565b6000826110a885846111c4565b14949350505050565b6040516001600160a01b03808516602483015283166044820152606481018290526110e99085906323b872dd60e01b90608401610ef6565b50505050565b6000611144826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112119092919063ffffffff16565b90508051600014806111655750808060200190518101906111659190611582565b610f2d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105ef565b600081815b8451811015611209576111f5828683815181106111e8576111e86115a4565b6020026020010151611228565b915080611201816115ba565b9150506111c9565b509392505050565b6060611220848460008561125a565b949350505050565b6000818310611244576000828152602084905260409020611253565b60008381526020839052604090205b9392505050565b6060824710156112bb5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105ef565b600080866001600160a01b031685876040516112d79190611601565b60006040518083038185875af1925050503d8060008114611314576040519150601f19603f3d011682016040523d82523d6000602084013e611319565b606091505b509150915061132a87838387611335565b979650505050505050565b606083156113a157825161139a576001600160a01b0385163b61139a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ef565b5081611220565b61122083838151156113b65781518083602001fd5b8060405162461bcd60e51b81526004016105ef919061161d565b6000602082840312156113e257600080fd5b5035919050565b600080604083850312156113fc57600080fd5b50508035926020909101359150565b6000806020838503121561141e57600080fd5b823567ffffffffffffffff8082111561143657600080fd5b818501915085601f83011261144a57600080fd5b81358181111561145957600080fd5b8660208260051b850101111561146e57600080fd5b60209290920196919550909350505050565b60006020828403121561149257600080fd5b81356001600160a01b038116811461125357600080fd5b6000806000606084860312156114be57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114fe576114fe6114d5565b500190565b600081600019048311821515161561151d5761151d6114d5565b500290565b6020808252600d908201526c18db185a5b481cdd185c9d1959609a1b604082015260600190565b60008282101561155b5761155b6114d5565b500390565b60008261157d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561159457600080fd5b8151801515811461125357600080fd5b634e487b7160e01b600052603260045260246000fd5b60006000198214156115ce576115ce6114d5565b5060010190565b60005b838110156115f05781810151838201526020016115d8565b838111156110e95750506000910152565b600082516116138184602087016115d5565b9190910192915050565b602081526000825180602084015261163c8160408501602087016115d5565b601f01601f1916919091016040019291505056fea2646970667358221220f0ac8593ab4d38e3b992e795a6bd30f95b8e5f85b1a7de3737f2c4e4f51fe67d64736f6c63430008080033000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d7000000000000000000000000000000000000000000000000000000000076a7000000000000000000000000000000000000000000000000000000000000c5c1000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000001581b6d300d0225a0000000000000000000000000000000000000000000000000000000000000000020fdf000000000000000000000000925f911afe4512a5eee55266d1e658cac2d39313
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80638456cb5911610102578063b0b9226311610095578063c19d93fb11610064578063c19d93fb1461053c578063f2fde38b14610552578063f44136a114610572578063fe9187f71461059257600080fd5b8063b0b92263146104b3578063b36d8a9f146104d3578063ba906af6146104f3578063c11442f81461052757600080fd5b80639a7f5f1c116100d15780639a7f5f1c14610407578063a035b1fe14610427578063a54362271461043d578063a87430ba1461045057600080fd5b80638456cb591461039e578063868eb92c146103b35780638da5cb5b146103c957806391b7f5ed146103e757600080fd5b80634e71d92d1161017a578063715018a611610149578063715018a6146103115780637d16dc6b146103265780637e1c0c091461033c57806382bfefc81461035257600080fd5b80634e71d92d146102b0578063546fb3c6146102c55780635909c12f146102db5780635e35233a146102f157600080fd5b8063136f3cfc116101b6578063136f3cfc1461024457806315d5195c1461025a5780631a6830fe1461027a5780633c0d84de1461029a57600080fd5b806302a5e71d146101dd5780630d76229f146102065780630dea38b614610210575b600080fd5b3480156101e957600080fd5b506101f3600b5481565b6040519081526020015b60405180910390f35b61020e6105a8565b005b34801561021c57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000076a70081565b34801561025057600080fd5b506101f3600a5481565b34801561026657600080fd5b5061020e6102753660046113d0565b61076b565b34801561028657600080fd5b5061020e6102953660046113e9565b610778565b3480156102a657600080fd5b506101f360035481565b3480156102bc57600080fd5b5061020e6107ad565b3480156102d157600080fd5b506101f360065481565b3480156102e757600080fd5b506101f360025481565b3480156102fd57600080fd5b5061020e61030c3660046113e9565b6108a0565b34801561031d57600080fd5b5061020e6108b3565b34801561033257600080fd5b506101f360095481565b34801561034857600080fd5b506101f360045481565b34801561035e57600080fd5b506103867f000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d781565b6040516001600160a01b0390911681526020016101fd565b3480156103aa57600080fd5b5061020e6108c7565b3480156103bf57600080fd5b506101f360085481565b3480156103d557600080fd5b506000546001600160a01b0316610386565b3480156103f357600080fd5b5061020e6104023660046113d0565b610916565b34801561041357600080fd5b5061020e6104223660046113d0565b610923565b34801561043357600080fd5b506101f3600c5481565b61020e61044b36600461140b565b6109b3565b34801561045c57600080fd5b5061049361046b366004611480565b6001602081905260009182526040909120805491810154600282015460039092015490919084565b6040805194855260208501939093529183015260608201526080016101fd565b3480156104bf57600080fd5b5061020e6104ce3660046113d0565b610cb0565b3480156104df57600080fd5b5061020e6104ee3660046114a9565b610d27565b3480156104ff57600080fd5b506101f37f0000000000000000000000000000000000000000000000000000000000c5c10081565b34801561053357600080fd5b5061020e610d3d565b34801561054857600080fd5b506101f360055481565b34801561055e57600080fd5b5061020e61056d366004611480565b610d6c565b34801561057e57600080fd5b506101f361058d366004611480565b610de5565b34801561059e57600080fd5b506101f360075481565b6005546002146105f85760405162461bcd60e51b8152602060048201526016602482015275383ab931b430b9b290383ab13634b19034b99037b33360511b60448201526064015b60405180910390fd5b60075434101561063e5760405162461bcd60e51b8152602060048201526011602482015270616d6f756e7420696e20746f6f206c6f7760781b60448201526064016105ef565b3360009081526001602052604081208054909134918391906106619084906114eb565b9091555050600c546000906106769034611503565b9050600854826000015411156106c65760405162461bcd60e51b81526020600482015260156024820152741b585e08185b5bdd5b9d081a5b881c995858da1959605a1b60448201526064016105ef565b806003546106d491906114eb565b60095410156106e257600080fd5b7f000000000000000000000000000000000000000000000000000000000076a70082600201541015610735577f000000000000000000000000000000000000000000000000000000000076a70060028301555b8082600101600082825461074991906114eb565b92505081905550806003600082825461076291906114eb565b90915550505050565b610773610e70565b600955565b610780610e70565b600654156107a05760405162461bcd60e51b81526004016105ef90611522565b600a556002556001600555565b600654806107f05760405162461bcd60e51b815260206004820152601060248201526f18d85b9b9bdd0818db185a5b481e595d60821b60448201526064016105ef565b60006107fb33610de5565b9050600081116108405760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b60448201526064016105ef565b33600090815260016020526040812060030180548392906108629084906114eb565b9091555061089c90507f000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d76001600160a01b03163383610eca565b5050565b6108a8610e70565b600791909155600855565b6108bb610e70565b6108c56000610f32565b565b6108cf610e70565b600654156108ef5760405162461bcd60e51b81526004016105ef90611522565b61090a6109046000546001600160a01b031690565b47610f82565b6000600b819055600555565b61091e610e70565b600c55565b61092b610e70565b6006541561094b5760405162461bcd60e51b81526004016105ef90611522565b620151808111156109895760405162461bcd60e51b8152602060048201526008602482015267746f6f206c6f6e6760c01b60448201526064016105ef565b61099381426114eb565b6006556109ab6109046000546001600160a01b031690565b506000600555565b6005546001146109fa5760405162461bcd60e51b8152602060048201526012602482015271383ab931b430b9b2902ba61034b99037b33360711b60448201526064016105ef565b600754341015610a405760405162461bcd60e51b8152602060048201526011602482015270616d6f756e7420696e20746f6f206c6f7760781b60448201526064016105ef565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610aba83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600254915084905061109b565b610af65760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016105ef565b336000908152600160205260408120805490913491839190610b199084906114eb565b9091555050600c54600090610b2e9034611503565b905060085482600001541115610b7e5760405162461bcd60e51b81526020600482015260156024820152741b585e08185b5bdd5b9d081a5b881c995858da1959605a1b60448201526064016105ef565b80600354610b8c91906114eb565b6009541015610bdd5760405162461bcd60e51b815260206004820152601860248201527f746f74616c20616d6f756e74206f75742072656163686564000000000000000060448201526064016105ef565b8154600b54610bec91906114eb565b600a541015610c355760405162461bcd60e51b81526020600482015260156024820152741058dd1d585b0814d85b194818dbdb5c1b195d1959605a1b60448201526064016105ef565b8154600b8054600090610c499084906114eb565b90915550507f0000000000000000000000000000000000000000000000000000000000c5c1006002830155600182018054829190600090610c8b9084906114eb565b925050819055508060036000828254610ca491906114eb565b90915550505050505050565b610cb8610e70565b60065415610cd85760405162461bcd60e51b81526004016105ef90611522565b610d0d7f000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d76001600160a01b03163330846110b1565b8060046000828254610d1f91906114eb565b909155505050565b610d2f610e70565b600792909255600855600c55565b610d45610e70565b60065415610d655760405162461bcd60e51b81526004016105ef90611522565b6002600555565b610d74610e70565b6001600160a01b038116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ef565b610de281610f32565b50565b600654600090801580610df757504281115b15610e055750600092915050565b6001600160a01b0383166000908152600160208190526040822090810154600282015491929091610e368542611549565b610e409084611503565b610e4a9190611560565b905081811115610e575750805b6003830154610e669082611549565b9695505050505050565b6000546001600160a01b031633146108c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105ef565b6040516001600160a01b038316602482015260448101829052610f2d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526110ef565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015610fd25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105ef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461101f576040519150601f19603f3d011682016040523d82523d6000602084013e611024565b606091505b5050905080610f2d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105ef565b6000826110a885846111c4565b14949350505050565b6040516001600160a01b03808516602483015283166044820152606481018290526110e99085906323b872dd60e01b90608401610ef6565b50505050565b6000611144826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112119092919063ffffffff16565b90508051600014806111655750808060200190518101906111659190611582565b610f2d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105ef565b600081815b8451811015611209576111f5828683815181106111e8576111e86115a4565b6020026020010151611228565b915080611201816115ba565b9150506111c9565b509392505050565b6060611220848460008561125a565b949350505050565b6000818310611244576000828152602084905260409020611253565b60008381526020839052604090205b9392505050565b6060824710156112bb5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105ef565b600080866001600160a01b031685876040516112d79190611601565b60006040518083038185875af1925050503d8060008114611314576040519150601f19603f3d011682016040523d82523d6000602084013e611319565b606091505b509150915061132a87838387611335565b979650505050505050565b606083156113a157825161139a576001600160a01b0385163b61139a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ef565b5081611220565b61122083838151156113b65781518083602001fd5b8060405162461bcd60e51b81526004016105ef919061161d565b6000602082840312156113e257600080fd5b5035919050565b600080604083850312156113fc57600080fd5b50508035926020909101359150565b6000806020838503121561141e57600080fd5b823567ffffffffffffffff8082111561143657600080fd5b818501915085601f83011261144a57600080fd5b81358181111561145957600080fd5b8660208260051b850101111561146e57600080fd5b60209290920196919550909350505050565b60006020828403121561149257600080fd5b81356001600160a01b038116811461125357600080fd5b6000806000606084860312156114be57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114fe576114fe6114d5565b500190565b600081600019048311821515161561151d5761151d6114d5565b500290565b6020808252600d908201526c18db185a5b481cdd185c9d1959609a1b604082015260600190565b60008282101561155b5761155b6114d5565b500390565b60008261157d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561159457600080fd5b8151801515811461125357600080fd5b634e487b7160e01b600052603260045260246000fd5b60006000198214156115ce576115ce6114d5565b5060010190565b60005b838110156115f05781810151838201526020016115d8565b838111156110e95750506000910152565b600082516116138184602087016115d5565b9190910192915050565b602081526000825180602084015261163c8160408501602087016115d5565b601f01601f1916919091016040019291505056fea2646970667358221220f0ac8593ab4d38e3b992e795a6bd30f95b8e5f85b1a7de3737f2c4e4f51fe67d64736f6c63430008080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d7000000000000000000000000000000000000000000000000000000000076a7000000000000000000000000000000000000000000000000000000000000c5c1000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000001581b6d300d0225a0000000000000000000000000000000000000000000000000000000000000000020fdf000000000000000000000000925f911afe4512a5eee55266d1e658cac2d39313
-----Decoded View---------------
Arg [0] : _token (address): 0xc565035232f9d6c10453Bd73b84D6A46989663D7
Arg [1] : _vestingTime (uint256): 7776000
Arg [2] : _vestingTimeWL (uint256): 12960000
Arg [3] : _minAmountIn (uint256): 1000000000000000000
Arg [4] : _maxAmountIn (uint256): 3000000000000000000
Arg [5] : _maxTotalOut (uint256): 26000000000000000000000000
Arg [6] : _price (uint256): 135135
Arg [7] : _multisig (address): 0x925f911afE4512A5EeE55266d1e658cac2D39313
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000c565035232f9d6c10453bd73b84d6a46989663d7
Arg [1] : 000000000000000000000000000000000000000000000000000000000076a700
Arg [2] : 0000000000000000000000000000000000000000000000000000000000c5c100
Arg [3] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [4] : 00000000000000000000000000000000000000000000000029a2241af62c0000
Arg [5] : 0000000000000000000000000000000000000000001581b6d300d0225a000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000020fdf
Arg [7] : 000000000000000000000000925f911afe4512a5eee55266d1e658cac2d39313
Deployed Bytecode Sourcemap
35611:4650:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36168:22;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;36168:22:0;;;;;;;;38942:534;;;:::i;:::-;;35847:34;;;;;;;;;;;;;;;36144:20;;;;;;;;;;;;;;;;36962:100;;;;;;;;;;-1:-1:-1;36962:100:0;;;;;:::i;:::-;;:::i;37354:178::-;;;;;;;;;;-1:-1:-1;37354:178:0;;;;;:::i;:::-;;:::i;35953:20::-;;;;;;;;;;;;;;;;39481:323;;;;;;;;;;;;;:::i;36025:28::-;;;;;;;;;;;;;;;;35930:19;;;;;;;;;;;;;;;;36806:151;;;;;;;;;;-1:-1:-1;36806:151:0;;;;;:::i;:::-;;:::i;2930:103::-;;;;;;;;;;;;;:::i;36115:25::-;;;;;;;;;;;;;;;;35977:23;;;;;;;;;;;;;;;;35773:29;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1247:32:1;;;1229:51;;1217:2;1202:18;35773:29:0;1069:217:1;37537:189:0;;;;;;;;;;;;;:::i;36086:25::-;;;;;;;;;;;;;;;;2289:87;;;;;;;;;;-1:-1:-1;2335:7:0;2362:6;-1:-1:-1;;;;;2362:6:0;2289:87;;37067:74;;;;;;;;;;-1:-1:-1;37067:74:0;;;;;:::i;:::-;;:::i;37849:305::-;;;;;;;;;;-1:-1:-1;37849:305:0;;;;;:::i;:::-;;:::i;36194:17::-;;;;;;;;;;;;;;;;38159:777;;;;;;:::i;:::-;;:::i;35887:37::-;;;;;;;;;;-1:-1:-1;35887:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2641:25:1;;;2697:2;2682:18;;2675:34;;;;2725:18;;;2718:34;2783:2;2768:18;;2761:34;2628:3;2613:19;35887:37:0;2410:391:1;37146:203:0;;;;;;;;;;-1:-1:-1;37146:203:0;;;;;:::i;:::-;;:::i;36621:180::-;;;;;;;;;;-1:-1:-1;36621:180:0;;;;;:::i;:::-;;:::i;35806:37::-;;;;;;;;;;;;;;;37731:113;;;;;;;;;;;;;:::i;36004:17::-;;;;;;;;;;;;;;;;3188:201;;;;;;;;;;-1:-1:-1;3188:201:0;;;;;:::i;:::-;;:::i;39809:449::-;;;;;;;;;;-1:-1:-1;39809:449:0;;;;;:::i;:::-;;:::i;36057:25::-;;;;;;;;;;;;;;;;38942:534;38998:5;;39007:1;38998:10;38990:45;;;;-1:-1:-1;;;38990:45:0;;3329:2:1;38990:45:0;;;3311:21:1;3368:2;3348:18;;;3341:30;-1:-1:-1;;;3387:18:1;;;3380:52;3449:18;;38990:45:0;;;;;;;;;39061:13;;39048:9;:26;;39040:56;;;;-1:-1:-1;;;39040:56:0;;3680:2:1;39040:56:0;;;3662:21:1;3719:2;3699:18;;;3692:30;-1:-1:-1;;;3738:18:1;;;3731:47;3795:18;;39040:56:0;3478:341:1;39040:56:0;914:10;39105:17;39125:19;;;:5;:19;;;;;39149:26;;39125:19;;39166:9;;39125:19;;39105:17;39149:26;;39166:9;;39149:26;:::i;:::-;;;;-1:-1:-1;;39209:5:0;;39180:14;;39197:17;;:9;:17;:::i;:::-;39180:34;;39244:13;;39227:4;:13;;;:30;;39219:64;;;;-1:-1:-1;;;39219:64:0;;4464:2:1;39219:64:0;;;4446:21:1;4503:2;4483:18;;;4476:30;-1:-1:-1;;;4522:18:1;;;4515:51;4583:18;;39219:64:0;4262:345:1;39219:64:0;39324:9;39313:8;;:20;;;;:::i;:::-;39296:13;;:37;;39288:46;;;;;;39363:12;39343:4;:17;;;:32;39339:74;;;39401:12;39381:17;;;:32;39339:74;39436:9;39418:4;:14;;;:27;;;;;;;:::i;:::-;;;;;;;;39462:9;39450:8;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;38942:534:0:o;36962:100::-;2175:13;:11;:13::i;:::-;37029::::1;:28:::0;36962:100::o;37354:178::-;2175:13;:11;:13::i;:::-;37433:16:::1;::::0;:21;37425:47:::1;;;;-1:-1:-1::0;;;37425:47:0::1;;;;;;;:::i;:::-;37477:8;:20:::0;37502:4:::1;:11:::0;37526:1:::1;37518:5;:9:::0;37354:178::o;39481:323::-;39540:16;;39569:24;39561:53;;;;-1:-1:-1;;;39561:53:0;;5156:2:1;39561:53:0;;;5138:21:1;5195:2;5175:18;;;5168:30;-1:-1:-1;;;5214:18:1;;;5207:46;5270:18;;39561:53:0;4954:340:1;39561:53:0;39619:14;39636:23;914:10;39809:449;:::i;39636:23::-;39619:40;;39684:1;39672:9;:13;39664:42;;;;-1:-1:-1;;;39664:42:0;;5501:2:1;39664:42:0;;;5483:21:1;5540:2;5520:18;;;5513:30;-1:-1:-1;;;5559:18:1;;;5552:46;5615:18;;39664:42:0;5299:340:1;39664:42:0;914:10;39711:19;;;;:5;:19;;;;;:27;;:40;;39742:9;;39711:19;:40;;39742:9;;39711:40;:::i;:::-;;;;-1:-1:-1;39756:43:0;;-1:-1:-1;39756:5:0;-1:-1:-1;;;;;39756:18:0;914:10;39789:9;39756:18;:43::i;:::-;39507:297;;39481:323::o;36806:151::-;2175:13;:11;:13::i;:::-;36891::::1;:28:::0;;;;36924:13:::1;:28:::0;36806:151::o;2930:103::-;2175:13;:11;:13::i;:::-;2995:30:::1;3022:1;2995:18;:30::i;:::-;2930:103::o:0;37537:189::-;2175:13;:11;:13::i;:::-;37586:16:::1;::::0;:21;37578:47:::1;;;;-1:-1:-1::0;;;37578:47:0::1;;;;;;;:::i;:::-;37630:58;37656:7;2335::::0;2362:6;-1:-1:-1;;;;;2362:6:0;;2289:87;37656:7:::1;37666:21;37630:17;:58::i;:::-;37706:1;37693:10;:14:::0;;;37712:5:::1;:9:::0;37537:189::o;37067:74::-;2175:13;:11;:13::i;:::-;37122:5:::1;:14:::0;37067:74::o;37849:305::-;2175:13;:11;:13::i;:::-;37922:16:::1;::::0;:21;37914:47:::1;;;;-1:-1:-1::0;;;37914:47:0::1;;;;;;;:::i;:::-;37992:6;37974:14;:24;;37966:45;;;::::0;-1:-1:-1;;;37966:45:0;;5846:2:1;37966:45:0::1;::::0;::::1;5828:21:1::0;5885:1;5865:18;;;5858:29;-1:-1:-1;;;5903:18:1;;;5896:38;5951:18;;37966:45:0::1;5644:331:1::0;37966:45:0::1;38037:32;38055:14:::0;38037:15:::1;:32;:::i;:::-;38018:16;:51:::0;38074:58:::1;38100:7;2335::::0;2362:6;-1:-1:-1;;;;;2362:6:0;;2289:87;38074:58:::1;-1:-1:-1::0;38137:12:0::1;38144:5;38137:12:::0;37849:305::o;38159:777::-;38235:5;;38244:1;38235:10;38227:41;;;;-1:-1:-1;;;38227:41:0;;6182:2:1;38227:41:0;;;6164:21:1;6221:2;6201:18;;;6194:30;-1:-1:-1;;;6240:18:1;;;6233:48;6298:18;;38227:41:0;5980:342:1;38227:41:0;38294:13;;38281:9;:26;;38273:56;;;;-1:-1:-1;;;38273:56:0;;3680:2:1;38273:56:0;;;3662:21:1;3719:2;3699:18;;;3692:30;-1:-1:-1;;;3738:18:1;;;3731:47;3795:18;;38273:56:0;3478:341:1;38273:56:0;38359:30;;-1:-1:-1;;914:10:0;6476:2:1;6472:15;6468:53;38359:30:0;;;6456:66:1;38334:12:0;;6538::1;;38359:30:0;;;;;;;;;;;;38349:41;;;;;;38334:56;;38403:37;38422:5;;38403:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38429:4:0;;;-1:-1:-1;38435:4:0;;-1:-1:-1;38403:18:0;:37::i;:::-;38395:63;;;;-1:-1:-1;;;38395:63:0;;6763:2:1;38395:63:0;;;6745:21:1;6802:2;6782:18;;;6775:30;-1:-1:-1;;;6821:18:1;;;6814:43;6874:18;;38395:63:0;6561:337:1;38395:63:0;914:10;38465:17;38485:19;;;:5;:19;;;;;38511:26;;38485:19;;38528:9;;38485:19;;38465:17;38511:26;;38528:9;;38511:26;:::i;:::-;;;;-1:-1:-1;;38571:5:0;;38542:14;;38559:17;;:9;:17;:::i;:::-;38542:34;;38606:13;;38589:4;:13;;;:30;;38581:64;;;;-1:-1:-1;;;38581:64:0;;4464:2:1;38581:64:0;;;4446:21:1;4503:2;4483:18;;;4476:30;-1:-1:-1;;;4522:18:1;;;4515:51;4583:18;;38581:64:0;4262:345:1;38581:64:0;38686:9;38675:8;;:20;;;;:::i;:::-;38658:13;;:37;;38650:74;;;;-1:-1:-1;;;38650:74:0;;7105:2:1;38650:74:0;;;7087:21:1;7144:2;7124:18;;;7117:30;7183:26;7163:18;;;7156:54;7227:18;;38650:74:0;6903:348:1;38650:74:0;38762:13;;38749:10;;:26;;38762:13;38749:26;:::i;:::-;38737:8;;:38;;38729:72;;;;-1:-1:-1;;;38729:72:0;;7458:2:1;38729:72:0;;;7440:21:1;7497:2;7477:18;;;7470:30;-1:-1:-1;;;7516:18:1;;;7509:51;7577:18;;38729:72:0;7256:345:1;38729:72:0;38820:13;;38806:10;:27;;38820:13;;38806:27;;38820:13;;38806:27;:::i;:::-;;;;-1:-1:-1;;38858:15:0;38838:17;;;:35;38878:14;;;:27;;38896:9;;38878:14;;;:27;;38896:9;;38878:27;:::i;:::-;;;;;;;;38922:9;38910:8;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;38159:777:0:o;37146:203::-;2175:13;:11;:13::i;:::-;37215:16:::1;::::0;:21;37207:47:::1;;;;-1:-1:-1::0;;;37207:47:0::1;;;;;;;:::i;:::-;37259:59;:5;-1:-1:-1::0;;;;;37259:22:0::1;914:10:::0;37304:4:::1;37311:6:::0;37259:22:::1;:59::i;:::-;37338:6;37323:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;37146:203:0:o;36621:180::-;2175:13;:11;:13::i;:::-;36716::::1;:28:::0;;;;36749:13:::1;:28:::0;36782:5:::1;:14:::0;36621:180::o;37731:113::-;2175:13;:11;:13::i;:::-;37786:16:::1;::::0;:21;37778:47:::1;;;;-1:-1:-1::0;;;37778:47:0::1;;;;;;;:::i;:::-;37838:1;37830:5;:9:::0;37731:113::o;3188:201::-;2175:13;:11;:13::i;:::-;-1:-1:-1;;;;;3277:22:0;::::1;3269:73;;;::::0;-1:-1:-1;;;3269:73:0;;7808:2:1;3269:73:0::1;::::0;::::1;7790:21:1::0;7847:2;7827:18;;;7820:30;7886:34;7866:18;;;7859:62;-1:-1:-1;;;7937:18:1;;;7930:36;7983:19;;3269:73:0::1;7606:402:1::0;3269:73:0::1;3353:28;3372:8;3353:18;:28::i;:::-;3188:201:::0;:::o;39809:449::-;39901:16;;39862:4;;39926:25;;;:67;;;39978:15;39955:20;:38;39926:67;39922:81;;;-1:-1:-1;40002:1:0;;39809:449;-1:-1:-1;;39809:449:0:o;39922:81::-;-1:-1:-1;;;;;40032:10:0;;40012:17;40032:10;;;:5;:10;;;;;;;40066:14;;;;40154:17;;;;40032:10;;40066:14;;40112:38;40130:20;40112:15;:38;:::i;:::-;40099:52;;:9;:52;:::i;:::-;:72;;;;:::i;:::-;40085:86;;40189:9;40180:6;:18;40176:42;;;-1:-1:-1;40209:9:0;40176:42;40241:12;;;;40232:21;;:6;:21;:::i;:::-;40225:28;39809:449;-1:-1:-1;;;;;;39809:449:0:o;2454:132::-;2335:7;2362:6;-1:-1:-1;;;;;2362:6:0;914:10;2518:23;2510:68;;;;-1:-1:-1;;;2510:68:0;;8567:2:1;2510:68:0;;;8549:21:1;;;8586:18;;;8579:30;8645:34;8625:18;;;8618:62;8697:18;;2510:68:0;8365:356:1;19525:177:0;19635:58;;-1:-1:-1;;;;;8918:32:1;;19635:58:0;;;8900:51:1;8967:18;;;8960:34;;;19608:86:0;;19628:5;;-1:-1:-1;;;19658:23:0;8873:18:1;;19635:58:0;;;;-1:-1:-1;;19635:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;19635:58:0;-1:-1:-1;;;;;;19635:58:0;;;;;;;;;;19608:19;:86::i;:::-;19525:177;;;:::o;3549:191::-;3623:16;3642:6;;-1:-1:-1;;;;;3659:17:0;;;-1:-1:-1;;;;;;3659:17:0;;;;;;3692:40;;3642:6;;;;;;;3692:40;;3623:16;3692:40;3612:128;3549:191;:::o;11717:317::-;11832:6;11807:21;:31;;11799:73;;;;-1:-1:-1;;;11799:73:0;;9207:2:1;11799:73:0;;;9189:21:1;9246:2;9226:18;;;9219:30;9285:31;9265:18;;;9258:59;9334:18;;11799:73:0;9005:353:1;11799:73:0;11886:12;11904:9;-1:-1:-1;;;;;11904:14:0;11926:6;11904:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11885:52;;;11956:7;11948:78;;;;-1:-1:-1;;;11948:78:0;;9775:2:1;11948:78:0;;;9757:21:1;9814:2;9794:18;;;9787:30;9853:34;9833:18;;;9826:62;9924:28;9904:18;;;9897:56;9970:19;;11948:78:0;9573:422:1;26870:156:0;26961:4;27014;26985:25;26998:5;27005:4;26985:12;:25::i;:::-;:33;;26870:156;-1:-1:-1;;;;26870:156:0:o;19947:205::-;20075:68;;-1:-1:-1;;;;;10258:15:1;;;20075:68:0;;;10240:34:1;10310:15;;10290:18;;;10283:43;10342:18;;;10335:34;;;20048:96:0;;20068:5;;-1:-1:-1;;;20098:27:0;10175:18:1;;20075:68:0;10000:375:1;20048:96:0;19947:205;;;;:::o;23871:649::-;24295:23;24321:69;24349:4;24321:69;;;;;;;;;;;;;;;;;24329:5;-1:-1:-1;;;;;24321:27:0;;;:69;;;;;:::i;:::-;24295:95;;24409:10;:17;24430:1;24409:22;:56;;;;24446:10;24435:30;;;;;;;;;;;;:::i;:::-;24401:111;;;;-1:-1:-1;;;24401:111:0;;10864:2:1;24401:111:0;;;10846:21:1;10903:2;10883:18;;;10876:30;10942:34;10922:18;;;10915:62;-1:-1:-1;;;10993:18:1;;;10986:40;11043:19;;24401:111:0;10662:406:1;27669:296:0;27752:7;27795:4;27752:7;27810:118;27834:5;:12;27830:1;:16;27810:118;;;27883:33;27893:12;27907:5;27913:1;27907:8;;;;;;;;:::i;:::-;;;;;;;27883:9;:33::i;:::-;27868:48;-1:-1:-1;27848:3:0;;;;:::i;:::-;;;;27810:118;;;-1:-1:-1;27945:12:0;27669:296;-1:-1:-1;;;27669:296:0:o;13213:229::-;13350:12;13382:52;13404:6;13412:4;13418:1;13421:12;13382:21;:52::i;:::-;13375:59;13213:229;-1:-1:-1;;;;13213:229:0:o;35107:149::-;35170:7;35201:1;35197;:5;:51;;35332:13;35426:15;;;35462:4;35455:15;;;35509:4;35493:21;;35197:51;;;35332:13;35426:15;;;35462:4;35455:15;;;35509:4;35493:21;;35205:20;35190:58;35107:149;-1:-1:-1;;;35107:149:0:o;14299:455::-;14469:12;14527:5;14502:21;:30;;14494:81;;;;-1:-1:-1;;;14494:81:0;;11547:2:1;14494:81:0;;;11529:21:1;11586:2;11566:18;;;11559:30;11625:34;11605:18;;;11598:62;-1:-1:-1;;;11676:18:1;;;11669:36;11722:19;;14494:81:0;11345:402:1;14494:81:0;14587:12;14601:23;14628:6;-1:-1:-1;;;;;14628:11:0;14647:5;14654:4;14628:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14586:73;;;;14677:69;14704:6;14712:7;14721:10;14733:12;14677:26;:69::i;:::-;14670:76;14299:455;-1:-1:-1;;;;;;;14299:455:0:o;16872:644::-;17057:12;17086:7;17082:427;;;17114:17;;17110:290;;-1:-1:-1;;;;;10753:19:0;;;17324:60;;;;-1:-1:-1;;;17324:60:0;;12496:2:1;17324:60:0;;;12478:21:1;12535:2;12515:18;;;12508:30;12574:31;12554:18;;;12547:59;12623:18;;17324:60:0;12294:353:1;17324:60:0;-1:-1:-1;17421:10:0;17414:17;;17082:427;17464:33;17472:10;17484:12;18219:17;;:21;18215:388;;18451:10;18445:17;18508:15;18495:10;18491:2;18487:19;18480:44;18215:388;18578:12;18571:20;;-1:-1:-1;;;18571:20:0;;;;;;;;:::i;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;381:248::-;449:6;457;510:2;498:9;489:7;485:23;481:32;478:52;;;526:1;523;516:12;478:52;-1:-1:-1;;549:23:1;;;619:2;604:18;;;591:32;;-1:-1:-1;381:248:1:o;1499:615::-;1585:6;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1702:9;1689:23;1731:18;1772:2;1764:6;1761:14;1758:34;;;1788:1;1785;1778:12;1758:34;1826:6;1815:9;1811:22;1801:32;;1871:7;1864:4;1860:2;1856:13;1852:27;1842:55;;1893:1;1890;1883:12;1842:55;1933:2;1920:16;1959:2;1951:6;1948:14;1945:34;;;1975:1;1972;1965:12;1945:34;2028:7;2023:2;2013:6;2010:1;2006:14;2002:2;1998:23;1994:32;1991:45;1988:65;;;2049:1;2046;2039:12;1988:65;2080:2;2072:11;;;;;2102:6;;-1:-1:-1;1499:615:1;;-1:-1:-1;;;;1499:615:1:o;2119:286::-;2178:6;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2273:23;;-1:-1:-1;;;;;2325:31:1;;2315:42;;2305:70;;2371:1;2368;2361:12;2806:316;2883:6;2891;2899;2952:2;2940:9;2931:7;2927:23;2923:32;2920:52;;;2968:1;2965;2958:12;2920:52;-1:-1:-1;;2991:23:1;;;3061:2;3046:18;;3033:32;;-1:-1:-1;3112:2:1;3097:18;;;3084:32;;2806:316;-1:-1:-1;2806:316:1:o;3824:127::-;3885:10;3880:3;3876:20;3873:1;3866:31;3916:4;3913:1;3906:15;3940:4;3937:1;3930:15;3956:128;3996:3;4027:1;4023:6;4020:1;4017:13;4014:39;;;4033:18;;:::i;:::-;-1:-1:-1;4069:9:1;;3956:128::o;4089:168::-;4129:7;4195:1;4191;4187:6;4183:14;4180:1;4177:21;4172:1;4165:9;4158:17;4154:45;4151:71;;;4202:18;;:::i;:::-;-1:-1:-1;4242:9:1;;4089:168::o;4612:337::-;4814:2;4796:21;;;4853:2;4833:18;;;4826:30;-1:-1:-1;;;4887:2:1;4872:18;;4865:43;4940:2;4925:18;;4612:337::o;8013:125::-;8053:4;8081:1;8078;8075:8;8072:34;;;8086:18;;:::i;:::-;-1:-1:-1;8123:9:1;;8013:125::o;8143:217::-;8183:1;8209;8199:132;;8253:10;8248:3;8244:20;8241:1;8234:31;8288:4;8285:1;8278:15;8316:4;8313:1;8306:15;8199:132;-1:-1:-1;8345:9:1;;8143:217::o;10380:277::-;10447:6;10500:2;10488:9;10479:7;10475:23;10471:32;10468:52;;;10516:1;10513;10506:12;10468:52;10548:9;10542:16;10601:5;10594:13;10587:21;10580:5;10577:32;10567:60;;10623:1;10620;10613:12;11073:127;11134:10;11129:3;11125:20;11122:1;11115:31;11165:4;11162:1;11155:15;11189:4;11186:1;11179:15;11205:135;11244:3;-1:-1:-1;;11265:17:1;;11262:43;;;11285:18;;:::i;:::-;-1:-1:-1;11332:1:1;11321:13;;11205:135::o;11752:258::-;11824:1;11834:113;11848:6;11845:1;11842:13;11834:113;;;11924:11;;;11918:18;11905:11;;;11898:39;11870:2;11863:10;11834:113;;;11965:6;11962:1;11959:13;11956:48;;;-1:-1:-1;;12000:1:1;11982:16;;11975:27;11752:258::o;12015:274::-;12144:3;12182:6;12176:13;12198:53;12244:6;12239:3;12232:4;12224:6;12220:17;12198:53;:::i;:::-;12267:16;;;;;12015:274;-1:-1:-1;;12015:274:1:o;12652:383::-;12801:2;12790:9;12783:21;12764:4;12833:6;12827:13;12876:6;12871:2;12860:9;12856:18;12849:34;12892:66;12951:6;12946:2;12935:9;12931:18;12926:2;12918:6;12914:15;12892:66;:::i;:::-;13019:2;12998:15;-1:-1:-1;;12994:29:1;12979:45;;;;13026:2;12975:54;;12652:383;-1:-1:-1;;12652:383:1:o
Swarm Source
ipfs://f0ac8593ab4d38e3b992e795a6bd30f95b8e5f85b1a7de3737f2c4e4f51fe67d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.