More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,554 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 20590206 | 161 days ago | IN | 0 ETH | 0.00022893 | ||||
Claim | 20578768 | 163 days ago | IN | 0 ETH | 0.0002304 | ||||
Claim | 20576777 | 163 days ago | IN | 0 ETH | 0.00013572 | ||||
Claim | 20575405 | 164 days ago | IN | 0 ETH | 0.00013044 | ||||
Claim And Stake | 20571867 | 164 days ago | IN | 0 ETH | 0.00028164 | ||||
Claim And Stake | 20571238 | 164 days ago | IN | 0 ETH | 0.00054578 | ||||
Claim And Stake | 20568487 | 165 days ago | IN | 0 ETH | 0.00069422 | ||||
Claim | 20563190 | 165 days ago | IN | 0 ETH | 0.00040999 | ||||
Claim | 20562684 | 165 days ago | IN | 0 ETH | 0.00034745 | ||||
Claim | 20558531 | 166 days ago | IN | 0 ETH | 0.0001177 | ||||
Claim | 20558227 | 166 days ago | IN | 0 ETH | 0.00011551 | ||||
Claim | 20557537 | 166 days ago | IN | 0 ETH | 0.00021555 | ||||
Claim | 20556496 | 166 days ago | IN | 0 ETH | 0.00105352 | ||||
Claim | 20556171 | 166 days ago | IN | 0 ETH | 0.00015849 | ||||
Claim | 20555568 | 166 days ago | IN | 0 ETH | 0.00014707 | ||||
Claim | 20554340 | 166 days ago | IN | 0 ETH | 0.00020816 | ||||
Claim | 20554335 | 166 days ago | IN | 0 ETH | 0.00025176 | ||||
Claim | 20536729 | 169 days ago | IN | 0 ETH | 0.00055599 | ||||
Claim | 20534561 | 169 days ago | IN | 0 ETH | 0.00063914 | ||||
Claim | 20534429 | 169 days ago | IN | 0 ETH | 0.00058035 | ||||
Claim And Stake | 20534275 | 169 days ago | IN | 0 ETH | 0.0015617 | ||||
Claim | 20532425 | 170 days ago | IN | 0 ETH | 0.00016877 | ||||
Claim | 20532218 | 170 days ago | IN | 0 ETH | 0.00027302 | ||||
Claim | 20529554 | 170 days ago | IN | 0 ETH | 0.00035904 | ||||
Claim | 20529520 | 170 days ago | IN | 0 ETH | 0.00029236 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GfoxClaim
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-15 */ pragma solidity ^0.8.23; // // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the 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); } 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); } 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(); } } } // // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @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; } } 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) } } } 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; } } // // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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); } } // // import "hardhat/console.sol"; interface IStake { function stakeFor(address _user, uint256 _poolId, uint256 _amount) external; } uint256 constant TGE_PERCENT = 25; // 25% uint256 constant CLAIM_INTERVAL = 7 days; uint256 constant CLAIM_PERCENTAGE = 25; // 25% contract GfoxClaim is Ownable { using SafeERC20 for IERC20; uint256 public constant claimStart = 1713491400; // 2024-04-19T01:50:00.000Z IERC20 public immutable gfoxToken; IStake public immutable gfStaking; mapping(address => uint256) public claimedAmount; bytes32 public merkleRoot; constructor( address _owner, address _gfoxToken, address _stakeContract, bytes32 _merkleRoot ) Ownable(_owner) { gfoxToken = IERC20(_gfoxToken); merkleRoot = _merkleRoot; gfStaking = IStake(_stakeContract); // approve max uint256 for stake contract gfoxToken.approve(_stakeContract, type(uint256).max); } modifier claimStarted() { require(block.timestamp >= claimStart, "GfoxClaim: Not started"); _; } event Claimed(address indexed account, uint256 amount, uint256 totalAmount); function claim( address _account, uint256 _amount, bytes32[] calldata _proof ) external claimStarted { _verify(_account, _amount, _proof); uint256 amountToClaim = _getClaimableAmount(_amount); amountToClaim -= claimedAmount[_account]; claimedAmount[_account] += amountToClaim; emit Claimed(_account, amountToClaim, _amount); gfoxToken.safeTransfer(_account, amountToClaim); } function claimAndStake( address _account, uint256 _amount, bytes32[] calldata _proof, uint256 _poolId ) external claimStarted { _verify(_account, _amount, _proof); uint256 amountToClaim = _getClaimableAmount(_amount); amountToClaim -= claimedAmount[_account]; claimedAmount[_account] += amountToClaim; emit Claimed(_account, amountToClaim, _amount); gfStaking.stakeFor(_account, _poolId, amountToClaim); } function recoverTokens( address _token, address _to, uint256 _amount ) external onlyOwner { IERC20(_token).safeTransfer(_to, _amount); } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function _verify( address _account, uint256 _amount, bytes32[] calldata _proof ) internal view { require( claimedAmount[_account] < _amount, "GfoxClaim: Already claimed" ); require( MerkleProof.verify( _proof, merkleRoot, keccak256(abi.encodePacked(_account, _amount)) ), "GfoxClaim: Invalid proof" ); } function _getClaimableAmount( uint256 _amount ) internal view returns (uint256 amountToClaim) { amountToClaim += (_amount * TGE_PERCENT) / 100; uint256 weeksPassed = (block.timestamp - claimStart) / CLAIM_INTERVAL; // precision loss is wanted if (weeksPassed >= 3) { amountToClaim = _amount; } else { amountToClaim += (_amount * CLAIM_PERCENTAGE * weeksPassed) / 100; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_gfoxToken","type":"address"},{"internalType":"address","name":"_stakeContract","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"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":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"Claimed","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"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gfStaking","outputs":[{"internalType":"contract IStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gfoxToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162000ea738038062000ea7833981016040819052620000349162000171565b836001600160a01b0381166200006457604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200006f8162000104565b506001600160a01b038381166080819052600283905590831660a081905260405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af1158015620000d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000f99190620001c3565b5050505050620001ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200016c57600080fd5b919050565b600080600080608085870312156200018857600080fd5b620001938562000154565b9350620001a36020860162000154565b9250620001b36040860162000154565b6060959095015193969295505050565b600060208284031215620001d657600080fd5b81518015158114620001e757600080fd5b9392505050565b60805160a051610c85620002226000396000818161017c015261048f01526000818161012201526102f20152610c856000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80637cb64759116100715780637cb64759146101645780638b5730d9146101775780638da5cb5b1461019e578063aa5a6d81146101af578063f04d688f146101c2578063f2fde38b146101cd57600080fd5b806304e86903146100b95780632eb4a7ab146100ec5780633d13f874146100f55780635f3e849f1461010a5780636c9a74691461011d578063715018a61461015c575b600080fd5b6100d96100c73660046109fb565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100d960025481565b610108610103366004610a62565b6101e0565b005b610108610118366004610abc565b610320565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b610108610341565b610108610172366004610af8565b610355565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b0316610144565b6101086101bd366004610b11565b610362565b6100d9636621cdc881565b6101086101db3660046109fb565b6104f3565b636621cdc84210156102325760405162461bcd60e51b815260206004820152601660248201527511d99bde10db185a5b4e88139bdd081cdd185c9d195960521b60448201526064015b60405180910390fd5b61023e84848484610531565b600061024984610667565b6001600160a01b03861660009081526001602052604090205490915061026f9082610b89565b6001600160a01b03861660009081526001602052604081208054929350839290919061029c908490610b9c565b909155505060408051828152602081018690526001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a26103196001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686836106f1565b5050505050565b610328610743565b61033c6001600160a01b03841683836106f1565b505050565b610349610743565b6103536000610770565b565b61035d610743565b600255565b636621cdc84210156103af5760405162461bcd60e51b815260206004820152601660248201527511d99bde10db185a5b4e88139bdd081cdd185c9d195960521b6044820152606401610229565b6103bb85858585610531565b60006103c685610667565b6001600160a01b0387166000908152600160205260409020549091506103ec9082610b89565b6001600160a01b038716600090815260016020526040812080549293508392909190610419908490610b9c565b909155505060408051828152602081018790526001600160a01b038816917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a26040516358e9a81560e01b81526001600160a01b03878116600483015260248201849052604482018390527f000000000000000000000000000000000000000000000000000000000000000016906358e9a81590606401600060405180830381600087803b1580156104d357600080fd5b505af11580156104e7573d6000803e3d6000fd5b50505050505050505050565b6104fb610743565b6001600160a01b03811661052557604051631e4fbdf760e01b815260006004820152602401610229565b61052e81610770565b50565b6001600160a01b03841660009081526001602052604090205483116105985760405162461bcd60e51b815260206004820152601a60248201527f47666f78436c61696d3a20416c726561647920636c61696d65640000000000006044820152606401610229565b610615828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546040516bffffffffffffffffffffffff1960608b901b166020820152603481018990529092506054019050604051602081830303815290604052805190602001206107c0565b6106615760405162461bcd60e51b815260206004820152601860248201527f47666f78436c61696d3a20496e76616c69642070726f6f6600000000000000006044820152606401610229565b50505050565b60006064610676601984610baf565b6106809190610bc6565b61068a9082610b9c565b9050600062093a806106a0636621cdc842610b89565b6106aa9190610bc6565b9050600381106106bc578291506106eb565b6064816106ca601986610baf565b6106d49190610baf565b6106de9190610bc6565b6106e89083610b9c565b91505b50919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261033c9084906107d8565b6000546001600160a01b031633146103535760405163118cdaa760e01b8152336004820152602401610229565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826107cd858461083b565b1490505b9392505050565b60006107ed6001600160a01b03841683610880565b905080516000141580156108125750808060200190518101906108109190610be8565b155b1561033c57604051635274afe760e01b81526001600160a01b0384166004820152602401610229565b600081815b84518110156108765761086c8286838151811061085f5761085f610c0a565b602002602001015161088e565b9150600101610840565b5090505b92915050565b60606107d1838360006108bd565b60008183106108aa5760008281526020849052604090206107d1565b60008381526020839052604090206107d1565b6060814710156108e25760405163cd78605960e01b8152306004820152602401610229565b600080856001600160a01b031684866040516108fe9190610c20565b60006040518083038185875af1925050503d806000811461093b576040519150601f19603f3d011682016040523d82523d6000602084013e610940565b606091505b509150915061095086838361095a565b9695505050505050565b60608261096f5761096a826109b6565b6107d1565b815115801561098657506001600160a01b0384163b155b156109af57604051639996b31560e01b81526001600160a01b0385166004820152602401610229565b50806107d1565b8051156109c65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b03811681146109f657600080fd5b919050565b600060208284031215610a0d57600080fd5b6107d1826109df565b60008083601f840112610a2857600080fd5b50813567ffffffffffffffff811115610a4057600080fd5b6020830191508360208260051b8501011115610a5b57600080fd5b9250929050565b60008060008060608587031215610a7857600080fd5b610a81856109df565b935060208501359250604085013567ffffffffffffffff811115610aa457600080fd5b610ab087828801610a16565b95989497509550505050565b600080600060608486031215610ad157600080fd5b610ada846109df565b9250610ae8602085016109df565b9150604084013590509250925092565b600060208284031215610b0a57600080fd5b5035919050565b600080600080600060808688031215610b2957600080fd5b610b32866109df565b945060208601359350604086013567ffffffffffffffff811115610b5557600080fd5b610b6188828901610a16565b96999598509660600135949350505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561087a5761087a610b73565b8082018082111561087a5761087a610b73565b808202811582820484141761087a5761087a610b73565b600082610be357634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610bfa57600080fd5b815180151581146107d157600080fd5b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015610c415760208186018101518583015201610c27565b50600092019182525091905056fea2646970667358221220b76b92799274e5661fac1bf6a36c068b9166db478a1a6d93466946630415210464736f6c634300081700330000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000008f1cece048cade6b8a05dfa2f90ee4025f4f266200000000000000000000000080846b546baece682496caaf8b8aba62c65cb0e40000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80637cb64759116100715780637cb64759146101645780638b5730d9146101775780638da5cb5b1461019e578063aa5a6d81146101af578063f04d688f146101c2578063f2fde38b146101cd57600080fd5b806304e86903146100b95780632eb4a7ab146100ec5780633d13f874146100f55780635f3e849f1461010a5780636c9a74691461011d578063715018a61461015c575b600080fd5b6100d96100c73660046109fb565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100d960025481565b610108610103366004610a62565b6101e0565b005b610108610118366004610abc565b610320565b6101447f0000000000000000000000008f1cece048cade6b8a05dfa2f90ee4025f4f266281565b6040516001600160a01b0390911681526020016100e3565b610108610341565b610108610172366004610af8565b610355565b6101447f00000000000000000000000080846b546baece682496caaf8b8aba62c65cb0e481565b6000546001600160a01b0316610144565b6101086101bd366004610b11565b610362565b6100d9636621cdc881565b6101086101db3660046109fb565b6104f3565b636621cdc84210156102325760405162461bcd60e51b815260206004820152601660248201527511d99bde10db185a5b4e88139bdd081cdd185c9d195960521b60448201526064015b60405180910390fd5b61023e84848484610531565b600061024984610667565b6001600160a01b03861660009081526001602052604090205490915061026f9082610b89565b6001600160a01b03861660009081526001602052604081208054929350839290919061029c908490610b9c565b909155505060408051828152602081018690526001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a26103196001600160a01b037f0000000000000000000000008f1cece048cade6b8a05dfa2f90ee4025f4f26621686836106f1565b5050505050565b610328610743565b61033c6001600160a01b03841683836106f1565b505050565b610349610743565b6103536000610770565b565b61035d610743565b600255565b636621cdc84210156103af5760405162461bcd60e51b815260206004820152601660248201527511d99bde10db185a5b4e88139bdd081cdd185c9d195960521b6044820152606401610229565b6103bb85858585610531565b60006103c685610667565b6001600160a01b0387166000908152600160205260409020549091506103ec9082610b89565b6001600160a01b038716600090815260016020526040812080549293508392909190610419908490610b9c565b909155505060408051828152602081018790526001600160a01b038816917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a26040516358e9a81560e01b81526001600160a01b03878116600483015260248201849052604482018390527f00000000000000000000000080846b546baece682496caaf8b8aba62c65cb0e416906358e9a81590606401600060405180830381600087803b1580156104d357600080fd5b505af11580156104e7573d6000803e3d6000fd5b50505050505050505050565b6104fb610743565b6001600160a01b03811661052557604051631e4fbdf760e01b815260006004820152602401610229565b61052e81610770565b50565b6001600160a01b03841660009081526001602052604090205483116105985760405162461bcd60e51b815260206004820152601a60248201527f47666f78436c61696d3a20416c726561647920636c61696d65640000000000006044820152606401610229565b610615828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546040516bffffffffffffffffffffffff1960608b901b166020820152603481018990529092506054019050604051602081830303815290604052805190602001206107c0565b6106615760405162461bcd60e51b815260206004820152601860248201527f47666f78436c61696d3a20496e76616c69642070726f6f6600000000000000006044820152606401610229565b50505050565b60006064610676601984610baf565b6106809190610bc6565b61068a9082610b9c565b9050600062093a806106a0636621cdc842610b89565b6106aa9190610bc6565b9050600381106106bc578291506106eb565b6064816106ca601986610baf565b6106d49190610baf565b6106de9190610bc6565b6106e89083610b9c565b91505b50919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261033c9084906107d8565b6000546001600160a01b031633146103535760405163118cdaa760e01b8152336004820152602401610229565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826107cd858461083b565b1490505b9392505050565b60006107ed6001600160a01b03841683610880565b905080516000141580156108125750808060200190518101906108109190610be8565b155b1561033c57604051635274afe760e01b81526001600160a01b0384166004820152602401610229565b600081815b84518110156108765761086c8286838151811061085f5761085f610c0a565b602002602001015161088e565b9150600101610840565b5090505b92915050565b60606107d1838360006108bd565b60008183106108aa5760008281526020849052604090206107d1565b60008381526020839052604090206107d1565b6060814710156108e25760405163cd78605960e01b8152306004820152602401610229565b600080856001600160a01b031684866040516108fe9190610c20565b60006040518083038185875af1925050503d806000811461093b576040519150601f19603f3d011682016040523d82523d6000602084013e610940565b606091505b509150915061095086838361095a565b9695505050505050565b60608261096f5761096a826109b6565b6107d1565b815115801561098657506001600160a01b0384163b155b156109af57604051639996b31560e01b81526001600160a01b0385166004820152602401610229565b50806107d1565b8051156109c65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b03811681146109f657600080fd5b919050565b600060208284031215610a0d57600080fd5b6107d1826109df565b60008083601f840112610a2857600080fd5b50813567ffffffffffffffff811115610a4057600080fd5b6020830191508360208260051b8501011115610a5b57600080fd5b9250929050565b60008060008060608587031215610a7857600080fd5b610a81856109df565b935060208501359250604085013567ffffffffffffffff811115610aa457600080fd5b610ab087828801610a16565b95989497509550505050565b600080600060608486031215610ad157600080fd5b610ada846109df565b9250610ae8602085016109df565b9150604084013590509250925092565b600060208284031215610b0a57600080fd5b5035919050565b600080600080600060808688031215610b2957600080fd5b610b32866109df565b945060208601359350604086013567ffffffffffffffff811115610b5557600080fd5b610b6188828901610a16565b96999598509660600135949350505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561087a5761087a610b73565b8082018082111561087a5761087a610b73565b808202811582820484141761087a5761087a610b73565b600082610be357634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610bfa57600080fd5b815180151581146107d157600080fd5b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015610c415760208186018101518583015201610c27565b50600092019182525091905056fea2646970667358221220b76b92799274e5661fac1bf6a36c068b9166db478a1a6d93466946630415210464736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000008f1cece048cade6b8a05dfa2f90ee4025f4f266200000000000000000000000080846b546baece682496caaf8b8aba62c65cb0e40000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [1] : _gfoxToken (address): 0x8F1CecE048Cade6b8a05dFA2f90EE4025F4F2662
Arg [2] : _stakeContract (address): 0x80846B546BaecE682496cAAF8B8AbA62c65CB0E4
Arg [3] : _merkleRoot (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [1] : 0000000000000000000000008f1cece048cade6b8a05dfa2f90ee4025f4f2662
Arg [2] : 00000000000000000000000080846b546baece682496caaf8b8aba62c65cb0e4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
29380:3230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29620:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;29620:48:0;;;;;;;;29677:25;;;;;;30331:476;;;;;;:::i;:::-;;:::i;:::-;;31338:182;;;;;;:::i;:::-;;:::i;29536:33::-;;;;;;;;-1:-1:-1;;;;;2213:32:1;;;2195:51;;2183:2;2168:18;29536:33:0;2036:216:1;28256:103:0;;;:::i;31528:106::-;;;;;;:::i;:::-;;:::i;29578:33::-;;;;;27581:87;27627:7;27654:6;-1:-1:-1;;;;;27654:6:0;27581:87;;30815:515;;;;;;:::i;:::-;;:::i;29452:47::-;;29489:10;29452:47;;28514:220;;;;;;:::i;:::-;;:::i;30331:476::-;29489:10;30163:15;:29;;30155:64;;;;-1:-1:-1;;;30155:64:0;;3728:2:1;30155:64:0;;;3710:21:1;3767:2;3747:18;;;3740:30;-1:-1:-1;;;3786:18:1;;;3779:52;3848:18;;30155:64:0;;;;;;;;;30475:34:::1;30483:8;30493:7;30502:6;;30475:7;:34::i;:::-;30522:21;30546:28;30566:7;30546:19;:28::i;:::-;-1:-1:-1::0;;;;;30604:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;30522:52;;-1:-1:-1;30587:40:0::1;::::0;30522:52;30587:40:::1;:::i;:::-;-1:-1:-1::0;;;;;30640:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;:40;;30587;;-1:-1:-1;30587:40:0;;30640:23;;;:40:::1;::::0;30587;;30640::::1;:::i;:::-;::::0;;;-1:-1:-1;;30698:41:0::1;::::0;;4446:25:1;;;4502:2;4487:18;;4480:34;;;-1:-1:-1;;;;;30698:41:0;::::1;::::0;::::1;::::0;4419:18:1;30698:41:0::1;;;;;;;30752:47;-1:-1:-1::0;;;;;30752:9:0::1;:22;30775:8:::0;30785:13;30752:22:::1;:47::i;:::-;30464:343;30331:476:::0;;;;:::o;31338:182::-;27467:13;:11;:13::i;:::-;31471:41:::1;-1:-1:-1::0;;;;;31471:27:0;::::1;31499:3:::0;31504:7;31471:27:::1;:41::i;:::-;31338:182:::0;;;:::o;28256:103::-;27467:13;:11;:13::i;:::-;28321:30:::1;28348:1;28321:18;:30::i;:::-;28256:103::o:0;31528:106::-;27467:13;:11;:13::i;:::-;31602:10:::1;:24:::0;31528:106::o;30815:515::-;29489:10;30163:15;:29;;30155:64;;;;-1:-1:-1;;;30155:64:0;;3728:2:1;30155:64:0;;;3710:21:1;3767:2;3747:18;;;3740:30;-1:-1:-1;;;3786:18:1;;;3779:52;3848:18;;30155:64:0;3526:346:1;30155:64:0;30993:34:::1;31001:8;31011:7;31020:6;;30993:7;:34::i;:::-;31040:21;31064:28;31084:7;31064:19;:28::i;:::-;-1:-1:-1::0;;;;;31122:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;31040:52;;-1:-1:-1;31105:40:0::1;::::0;31040:52;31105:40:::1;:::i;:::-;-1:-1:-1::0;;;;;31158:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;:40;;31105;;-1:-1:-1;31105:40:0;;31158:23;;;:40:::1;::::0;31105;;31158::::1;:::i;:::-;::::0;;;-1:-1:-1;;31216:41:0::1;::::0;;4446:25:1;;;4502:2;4487:18;;4480:34;;;-1:-1:-1;;;;;31216:41:0;::::1;::::0;::::1;::::0;4419:18:1;31216:41:0::1;;;;;;;31270:52;::::0;-1:-1:-1;;;31270:52:0;;-1:-1:-1;;;;;4745:32:1;;;31270:52:0::1;::::0;::::1;4727:51:1::0;4794:18;;;4787:34;;;4837:18;;;4830:34;;;31270:9:0::1;:18;::::0;::::1;::::0;4700::1;;31270:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30982:348;30815:515:::0;;;;;:::o;28514:220::-;27467:13;:11;:13::i;:::-;-1:-1:-1;;;;;28599:22:0;::::1;28595:93;;28645:31;::::0;-1:-1:-1;;;28645:31:0;;28673:1:::1;28645:31;::::0;::::1;2195:51:1::0;2168:18;;28645:31:0::1;2036:216:1::0;28595:93:0::1;28698:28;28717:8;28698:18;:28::i;:::-;28514:220:::0;:::o;31642:492::-;-1:-1:-1;;;;;31802:23:0;;;;;;:13;:23;;;;;;:33;-1:-1:-1;31780:109:0;;;;-1:-1:-1;;;31780:109:0;;5077:2:1;31780:109:0;;;5059:21:1;5116:2;5096:18;;;5089:30;5155:28;5135:18;;;5128:56;5201:18;;31780:109:0;4875:350:1;31780:109:0;31922:152;31959:6;;31922:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31984:10:0;;32023:35;;-1:-1:-1;;5407:2:1;5403:15;;;5399:53;32023:35:0;;;5387:66:1;5469:12;;;5462:28;;;31984:10:0;;-1:-1:-1;5506:12:1;;;-1:-1:-1;32023:35:0;;;;;;;;;;;;32013:46;;;;;;31922:18;:152::i;:::-;31900:226;;;;-1:-1:-1;;;31900:226:0;;5731:2:1;31900:226:0;;;5713:21:1;5770:2;5750:18;;;5743:30;5809:26;5789:18;;;5782:54;5853:18;;31900:226:0;5529:348:1;31900:226:0;31642:492;;;;:::o;32142:465::-;32227:21;32304:3;32279:21;29269:2;32279:7;:21;:::i;:::-;32278:29;;;;:::i;:::-;32261:46;;;;:::i;:::-;;-1:-1:-1;32320:19:0;29318:6;32343:28;29489:10;32343:15;:28;:::i;:::-;32342:47;;;;:::i;:::-;32320:69;;32449:1;32434:11;:16;32430:170;;32483:7;32467:23;;32430:170;;;32585:3;32570:11;32541:26;29365:2;32541:7;:26;:::i;:::-;:40;;;;:::i;:::-;32540:48;;;;:::i;:::-;32523:65;;;;:::i;:::-;;;32430:170;32250:357;32142:465;;;:::o;11917:162::-;12027:43;;;-1:-1:-1;;;;;6469:32:1;;12027:43:0;;;6451:51:1;6518:18;;;;6511:34;;;12027:43:0;;;;;;;;;;6424:18:1;;;;12027:43:0;;;;;;;;-1:-1:-1;;;;;12027:43:0;-1:-1:-1;;;12027:43:0;;;12000:71;;12020:5;;12000:19;:71::i;27746:166::-;27627:7;27654:6;-1:-1:-1;;;;;27654:6:0;25754:10;27806:23;27802:103;;27853:40;;-1:-1:-1;;;27853:40:0;;25754:10;27853:40;;;2195:51:1;2168:18;;27853:40:0;2036:216:1;28894:191:0;28968:16;28987:6;;-1:-1:-1;;;;;29004:17:0;;;-1:-1:-1;;;;;;29004:17:0;;;;;;29037:40;;28987:6;;;;;;;29037:40;;28968:16;29037:40;28957:128;28894:191;:::o;16943:156::-;17034:4;17087;17058:25;17071:5;17078:4;17058:12;:25::i;:::-;:33;17051:40;;16943:156;;;;;;:::o;14728:638::-;15152:23;15178:33;-1:-1:-1;;;;;15178:27:0;;15206:4;15178:27;:33::i;:::-;15152:59;;15226:10;:17;15247:1;15226:22;;:57;;;;;15264:10;15253:30;;;;;;;;;;;;:::i;:::-;15252:31;15226:57;15222:137;;;15307:40;;-1:-1:-1;;;15307:40:0;;-1:-1:-1;;;;;2213:32:1;;15307:40:0;;;2195:51:1;2168:18;;15307:40:0;2036:216:1;17662:296:0;17745:7;17788:4;17745:7;17803:118;17827:5;:12;17823:1;:16;17803:118;;;17876:33;17886:12;17900:5;17906:1;17900:8;;;;;;;;:::i;:::-;;;;;;;17876:9;:33::i;:::-;17861:48;-1:-1:-1;17841:3:0;;17803:118;;;-1:-1:-1;17938:12:0;-1:-1:-1;17662:296:0;;;;;:::o;7144:153::-;7219:12;7251:38;7273:6;7281:4;7287:1;7251:21;:38::i;25092:149::-;25155:7;25186:1;25182;:5;:51;;25434:13;25528:15;;;25564:4;25557:15;;;25611:4;25595:21;;25182:51;;;25434:13;25528:15;;;25564:4;25557:15;;;25611:4;25595:21;;25190:20;25366:268;7632:398;7731:12;7784:5;7760:21;:29;7756:110;;;7813:41;;-1:-1:-1;;;7813:41:0;;7848:4;7813:41;;;2195:51:1;2168:18;;7813:41:0;2036:216:1;7756:110:0;7877:12;7891:23;7918:6;-1:-1:-1;;;;;7918:11:0;7937:5;7944:4;7918:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7876:73;;;;7967:55;7994:6;8002:7;8011:10;7967:26;:55::i;:::-;7960:62;7632:398;-1:-1:-1;;;;;;7632:398:0:o;9108:597::-;9256:12;9286:7;9281:417;;9310:19;9318:10;9310:7;:19::i;:::-;9281:417;;;9538:17;;:22;:49;;;;-1:-1:-1;;;;;;9564:18:0;;;:23;9538:49;9534:121;;;9615:24;;-1:-1:-1;;;9615:24:0;;-1:-1:-1;;;;;2213:32:1;;9615:24:0;;;2195:51:1;2168:18;;9615:24:0;2036:216:1;9534:121:0;-1:-1:-1;9676:10:0;9669:17;;10258:528;10391:17;;:21;10387:392;;10623:10;10617:17;10680:15;10667:10;10663:2;10659:19;10652:44;10387:392;10750:17;;-1:-1:-1;;;10750:17:0;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;747:367::-;810:8;820:6;874:3;867:4;859:6;855:17;851:27;841:55;;892:1;889;882:12;841:55;-1:-1:-1;915:20:1;;958:18;947:30;;944:50;;;990:1;987;980:12;944:50;1027:4;1019:6;1015:17;1003:29;;1087:3;1080:4;1070:6;1067:1;1063:14;1055:6;1051:27;1047:38;1044:47;1041:67;;;1104:1;1101;1094:12;1041:67;747:367;;;;;:::o;1119:579::-;1223:6;1231;1239;1247;1300:2;1288:9;1279:7;1275:23;1271:32;1268:52;;;1316:1;1313;1306:12;1268:52;1339:29;1358:9;1339:29;:::i;:::-;1329:39;;1415:2;1404:9;1400:18;1387:32;1377:42;;1470:2;1459:9;1455:18;1442:32;1497:18;1489:6;1486:30;1483:50;;;1529:1;1526;1519:12;1483:50;1568:70;1630:7;1621:6;1610:9;1606:22;1568:70;:::i;:::-;1119:579;;;;-1:-1:-1;1657:8:1;-1:-1:-1;;;;1119:579:1:o;1703:328::-;1780:6;1788;1796;1849:2;1837:9;1828:7;1824:23;1820:32;1817:52;;;1865:1;1862;1855:12;1817:52;1888:29;1907:9;1888:29;:::i;:::-;1878:39;;1936:38;1970:2;1959:9;1955:18;1936:38;:::i;:::-;1926:48;;2021:2;2010:9;2006:18;1993:32;1983:42;;1703:328;;;;;:::o;2257:180::-;2316:6;2369:2;2357:9;2348:7;2344:23;2340:32;2337:52;;;2385:1;2382;2375:12;2337:52;-1:-1:-1;2408:23:1;;2257:180;-1:-1:-1;2257:180:1:o;2873:648::-;2986:6;2994;3002;3010;3018;3071:3;3059:9;3050:7;3046:23;3042:33;3039:53;;;3088:1;3085;3078:12;3039:53;3111:29;3130:9;3111:29;:::i;:::-;3101:39;;3187:2;3176:9;3172:18;3159:32;3149:42;;3242:2;3231:9;3227:18;3214:32;3269:18;3261:6;3258:30;3255:50;;;3301:1;3298;3291:12;3255:50;3340:70;3402:7;3393:6;3382:9;3378:22;3340:70;:::i;:::-;2873:648;;;;-1:-1:-1;3429:8:1;3511:2;3496:18;3483:32;;2873:648;-1:-1:-1;;;;2873:648:1:o;3877:127::-;3938:10;3933:3;3929:20;3926:1;3919:31;3969:4;3966:1;3959:15;3993:4;3990:1;3983:15;4009:128;4076:9;;;4097:11;;;4094:37;;;4111:18;;:::i;4142:125::-;4207:9;;;4228:10;;;4225:36;;;4241:18;;:::i;5882:168::-;5955:9;;;5986;;6003:15;;;5997:22;;5983:37;5973:71;;6024:18;;:::i;6055:217::-;6095:1;6121;6111:132;;6165:10;6160:3;6156:20;6153:1;6146:31;6200:4;6197:1;6190:15;6228:4;6225:1;6218:15;6111:132;-1:-1:-1;6257:9:1;;6055:217::o;6556:277::-;6623:6;6676:2;6664:9;6655:7;6651:23;6647:32;6644:52;;;6692:1;6689;6682:12;6644:52;6724:9;6718:16;6777:5;6770:13;6763:21;6756:5;6753:32;6743:60;;6799:1;6796;6789:12;6838:127;6899:10;6894:3;6890:20;6887:1;6880:31;6930:4;6927:1;6920:15;6954:4;6951:1;6944:15;6970:412;7099:3;7137:6;7131:13;7162:1;7172:129;7186:6;7183:1;7180:13;7172:129;;;7284:4;7268:14;;;7264:25;;7258:32;7245:11;;;7238:53;7201:12;7172:129;;;-1:-1:-1;7356:1:1;7320:16;;7345:13;;;-1:-1:-1;7320:16:1;6970:412;-1:-1:-1;6970:412:1:o
Swarm Source
ipfs://b76b92799274e5661fac1bf6a36c068b9166db478a1a6d934669466304152104
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.