More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,033 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Native | 22076809 | 2 hrs ago | IN | 0 ETH | 0.00003231 | ||||
Claim Native | 22074552 | 9 hrs ago | IN | 0 ETH | 0.00005288 | ||||
Claim Native | 22073416 | 13 hrs ago | IN | 0 ETH | 0.00003059 | ||||
Claim Native | 22072877 | 15 hrs ago | IN | 0 ETH | 0.00004226 | ||||
Claim Native | 22067382 | 33 hrs ago | IN | 0 ETH | 0.00006356 | ||||
Claim Native | 22064842 | 42 hrs ago | IN | 0 ETH | 0.00003551 | ||||
Claim Native | 22063039 | 2 days ago | IN | 0 ETH | 0.00005532 | ||||
Claim Native | 22062496 | 2 days ago | IN | 0 ETH | 0.00006753 | ||||
Claim Native | 22060079 | 2 days ago | IN | 0 ETH | 0.00004049 | ||||
Claim Native | 22059605 | 2 days ago | IN | 0 ETH | 0.00004624 | ||||
Claim Native | 22058382 | 2 days ago | IN | 0 ETH | 0.00003041 | ||||
Claim Native | 22052440 | 3 days ago | IN | 0 ETH | 0.00004843 | ||||
Claim Native | 22052347 | 3 days ago | IN | 0 ETH | 0.00003324 | ||||
Claim Native | 22052036 | 3 days ago | IN | 0 ETH | 0.00003156 | ||||
Claim Native | 22051482 | 3 days ago | IN | 0 ETH | 0.00003377 | ||||
Claim Native | 22050207 | 3 days ago | IN | 0 ETH | 0.0000298 | ||||
Claim Native | 22047945 | 4 days ago | IN | 0 ETH | 0.00006071 | ||||
Claim Native | 22044551 | 4 days ago | IN | 0 ETH | 0.00004885 | ||||
Claim Native | 22038534 | 5 days ago | IN | 0 ETH | 0.00013738 | ||||
Claim Native | 22037418 | 5 days ago | IN | 0 ETH | 0.00003959 | ||||
Claim Native | 22034680 | 5 days ago | IN | 0 ETH | 0.00003782 | ||||
Claim Native | 22033970 | 6 days ago | IN | 0 ETH | 0.00004271 | ||||
Claim Native | 22033440 | 6 days ago | IN | 0 ETH | 0.00004383 | ||||
Claim Native | 22032062 | 6 days ago | IN | 0 ETH | 0.00014858 | ||||
Claim Native | 22031100 | 6 days ago | IN | 0 ETH | 0.00006873 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22076809 | 2 hrs ago | 0.00209094 ETH | ||||
Transfer | 22076809 | 2 hrs ago | 0.00209094 ETH | ||||
Transfer | 22074552 | 9 hrs ago | 0.00280331 ETH | ||||
Transfer | 22074552 | 9 hrs ago | 0.00280331 ETH | ||||
Transfer | 22073416 | 13 hrs ago | 0.00075904 ETH | ||||
Transfer | 22073416 | 13 hrs ago | 0.00075904 ETH | ||||
Transfer | 22072877 | 15 hrs ago | 0.49714437 ETH | ||||
Transfer | 22072877 | 15 hrs ago | 0.49714437 ETH | ||||
Transfer | 22067382 | 33 hrs ago | 2.02473897 ETH | ||||
Transfer | 22067382 | 33 hrs ago | 2.02473897 ETH | ||||
Transfer | 22064842 | 42 hrs ago | 0.96916526 ETH | ||||
Transfer | 22064842 | 42 hrs ago | 0.96916526 ETH | ||||
Transfer | 22063039 | 2 days ago | 0.00008723 ETH | ||||
Transfer | 22063039 | 2 days ago | 0.00008723 ETH | ||||
Transfer | 22062496 | 2 days ago | 0.27704114 ETH | ||||
Transfer | 22062496 | 2 days ago | 0.27704114 ETH | ||||
Transfer | 22060079 | 2 days ago | 0.04602561 ETH | ||||
Transfer | 22060079 | 2 days ago | 0.04602561 ETH | ||||
Transfer | 22059605 | 2 days ago | 0.0391686 ETH | ||||
Transfer | 22059605 | 2 days ago | 0.0391686 ETH | ||||
Transfer | 22058382 | 2 days ago | 0.00358434 ETH | ||||
Transfer | 22058382 | 2 days ago | 0.00358434 ETH | ||||
Transfer | 22052440 | 3 days ago | 0.00173743 ETH | ||||
Transfer | 22052440 | 3 days ago | 0.00173743 ETH | ||||
Transfer | 22052347 | 3 days ago | 0.2656084 ETH |
Loading...
Loading
Contract Name:
CumulativeMerkleDistributor
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 100000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GNU AGPLv3 pragma solidity ^0.8.6; import "solmate/src/utils/SafeTransferLib.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-solidity/contracts/utils/cryptography/MerkleProof.sol"; import "openzeppelin-solidity/contracts/access/Ownable.sol"; import "./Utils.sol"; interface IWrapped is IERC20 { function withdraw(uint256 amount) external; } /// Cumulative Merkle distributor that supports claiming native chain currency via unwrapping. /// @author Euler developers, modified by Morpho developers, modified by ParaSwap developers contract CumulativeMerkleDistributor is Ownable { using SafeTransferLib for ERC20; /// STORAGE /// ERC20 public immutable TOKEN; bytes32 public currRoot; // The merkle tree's root of the current rewards distribution. bytes32 public prevRoot; // The merkle tree's root of the previous rewards distribution. mapping(address => uint256) public claimed; // The rewards already claimed. account -> amount. bool public isWrappedNative; /// EVENTS /// /// @notice Emitted when the root is updated. /// @param newRoot The new merkle's tree root. event RootUpdated(bytes32 newRoot); /// @notice Emitted when tokens are withdrawn. /// @param to The address of the recipient. /// @param amount The amount of tokens withdrawn. /// @param isNative Amount sent as native or wrapped event Withdrawn(address to, uint256 amount, bool isNative); /// @notice Emitted when an account claims rewards. /// @param account The address of the claimer. /// @param amount The amount of rewards claimed. /// @param isNative Rewards sent as native or wrapped event RewardsClaimed(address account, uint256 amount, bool isNative); /// ERRORS /// /// @notice Thrown when the proof is invalid or expired. error ProofInvalidOrExpired(); /// @notice Thrown when the claimer has already claimed the rewards. error AlreadyClaimed(); /// @notice throw when trying to claim native while not supported error NativeNotSupported(); /// CONSTRUCTOR /// /// @notice Constructs RewardsDistributor contract. /// @param _token The address of the token to distribute. constructor(address _token, bool _isWrappedNative) { TOKEN = ERC20(_token); isWrappedNative = _isWrappedNative; } /// EXTERNAL /// /// @notice Updates the current merkle tree's root. /// @param _newRoot The new merkle tree's root. function updateRoot(bytes32 _newRoot) external onlyOwner { prevRoot = currRoot; currRoot = _newRoot; emit RootUpdated(_newRoot); } /// @notice Withdraws tokens to a recipient. /// @param _to The address of the recipient. /// @param _amount The amount of tokens to transfer. function withdrawTokens(address _to, uint256 _amount) external onlyOwner { uint256 tokenBalance = TOKEN.balanceOf(address(this)); uint256 toWithdraw = tokenBalance < _amount ? tokenBalance : _amount; TOKEN.safeTransfer(_to, toWithdraw); emit Withdrawn(_to, toWithdraw, false); } /// @notice Withdraws native to a recipient. /// @param _to The address of the recipient. /// @param _amount The amount of tokens to transfer. function withdrawNative(address _to, uint256 _amount) external onlyOwner { if (isWrappedNative != true) { revert NativeNotSupported(); } uint256 nativeBalance = address(this).balance; uint256 toWithdraw = nativeBalance < _amount ? nativeBalance : _amount; Utils.transferETH(payable(_to), toWithdraw); emit Withdrawn(_to, toWithdraw, true); } /// @notice Claims rewards. /// @param _account The address of the claimer. /// @param _claimable The overall claimable amount of token rewards. /// @param _proof The merkle proof that validates this claim. function _claim( address _account, uint256 _claimable, bytes32[] calldata _proof ) private returns (uint256) { bytes32 candidateRoot = MerkleProof.processProof(_proof, keccak256(abi.encodePacked(_account, _claimable))); if (candidateRoot != currRoot && candidateRoot != prevRoot) revert ProofInvalidOrExpired(); uint256 alreadyClaimed = claimed[_account]; if (_claimable <= alreadyClaimed) revert AlreadyClaimed(); uint256 amount; unchecked { amount = _claimable - alreadyClaimed; } claimed[_account] = _claimable; return amount; } /// @notice Claims rewards. /// @param _account The address of the claimer. /// @param _claimable The overall claimable amount of token rewards. /// @param _proof The merkle proof that validates this claim. function claim( address _account, uint256 _claimable, bytes32[] calldata _proof ) external { uint256 amount = _claim(_account, _claimable, _proof); TOKEN.safeTransfer(_account, amount); emit RewardsClaimed(_account, amount, false); } /// @notice Claims rewards. /// @param _account The address of the claimer. /// @param _claimable The overall claimable amount of token rewards in native token. /// @param _proof The merkle proof that validates this claim. function claimNative( address _account, uint256 _claimable, bytes32[] calldata _proof ) external { if (isWrappedNative != true) { revert NativeNotSupported(); } uint256 amount = _claim(_account, _claimable, _proof); IWrapped(address(TOKEN)).withdraw(amount); Utils.transferETH(payable(_account), amount); emit RewardsClaimed(_account, amount, true); } receive() external payable {} }
pragma solidity 0.8.6; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; error PermitFailed(); error TransferEthFailed(); library Utils { function permit(IERC20 token, bytes memory permit) internal { if (permit.length == 32 * 7) { (bool success, ) = address(token).call(abi.encodePacked(IERC20Permit.permit.selector, permit)); if (!success) { revert PermitFailed(); } } } function transferETH(address payable destination, uint256 amount) internal { if (amount > 0) { (bool result, ) = destination.call{ value: amount }(""); if (!result) { revert TransferEthFailed(); } } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument. mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// 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; } }
{ "optimizer": { "enabled": true, "runs": 100000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_isWrappedNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"NativeNotSupported","type":"error"},{"inputs":[],"name":"ProofInvalidOrExpired","type":"error"},{"inputs":[],"name":"TransferEthFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isNative","type":"bool"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"RootUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isNative","type":"bool"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_claimable","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":"_claimable","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWrappedNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"updateRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161117a38038061117a83398101604081905261002f916100b1565b61003833610061565b60609190911b6001600160601b0319166080526004805460ff19169115159190911790556100fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100c457600080fd5b82516001600160a01b03811681146100db57600080fd5b602084015190925080151581146100f157600080fd5b809150509250929050565b60805160601c611044610136600039600081816101da0152818161038a01528181610448015281816106f201526107fc01526110446000f3fe6080604052600436106100d65760003560e01c8063787fcbdb1161007f578063c884ef8311610059578063c884ef831461024c578063e3f5b19514610287578063f2fde38b1461029d578063fdb4beda146102bd57600080fd5b8063787fcbdb1461019957806382bfefc8146101c85780638da5cb5b1461022157600080fd5b80633d13f874116100b05780633d13f8741461014457806366d5437b14610164578063715018a61461018457600080fd5b806306b091f9146100e257806307b18bde1461010457806321ff99701461012457600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd366004610e99565b6102d3565b005b34801561011057600080fd5b5061010261011f366004610e99565b6104d0565b34801561013057600080fd5b5061010261013f366004610f4d565b610607565b34801561015057600080fd5b5061010261015f366004610ec3565b6106c8565b34801561017057600080fd5b5061010261017f366004610ec3565b61077b565b34801561019057600080fd5b506101026108ce565b3480156101a557600080fd5b506004546101b39060ff1681565b60405190151581526020015b60405180910390f35b3480156101d457600080fd5b506101fc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bf565b34801561022d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101fc565b34801561025857600080fd5b50610279610267366004610e77565b60036020526000908152604090205481565b6040519081526020016101bf565b34801561029357600080fd5b5061027960015481565b3480156102a957600080fd5b506101026102b8366004610e77565b61095b565b3480156102c957600080fd5b5061027960025481565b60005473ffffffffffffffffffffffffffffffffffffffff163314610359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156103e157600080fd5b505afa1580156103f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104199190610f66565b9050600082821061042a578261042c565b815b905061046f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168583610a8b565b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390526000918101919091527f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5906060015b60405180910390a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b60045460ff161515600114610592576040517f0a7287b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4760008282106105a257826105a4565b815b90506105b08482610b4a565b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390526001918101919091527f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5906060016104c2565b60005473ffffffffffffffffffffffffffffffffffffffff163314610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b600180546002558190556040518181527f2cbc14f49c068133583f7cb530018af451c87c1cf1327cf2a4ff4698c4730aa49060200160405180910390a150565b60006106d685858585610bf0565b905061071973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168683610a8b565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152602081018390526000918101919091527fab3c4ae116d5285676cffaad9c32cae8acf49b49ca0fc9953b029f97acb955ef906060015b60405180910390a15050505050565b60045460ff1615156001146107bc576040517f0a7287b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107ca85858585610bf0565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506108778582610b4a565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152602081018390526001918101919091527fab3c4ae116d5285676cffaad9c32cae8acf49b49ca0fc9953b029f97acb955ef9060600161076c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b6109596000610d65565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b73ffffffffffffffffffffffffffffffffffffffff8116610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b610a8881610d65565b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610350565b50505050565b8015610bec5760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b5050905080610bea576040517f6200562d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5050565b600080610c84848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b166020820152603481018a90526054019150610c699050565b60405160208183030381529060405280519060200120610dda565b90506001548114158015610c9a57506002548114155b15610cd1576040517ff542095700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616600090815260036020526040902054808611610d30576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526003602052604090208690558503915050949350505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610e46576000858281518110610dfc57610dfc610fdf565b60200260200101519050808311610e225760008381526020829052604090209250610e33565b600081815260208490526040902092505b5080610e3e81610f7f565b915050610ddf565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e7257600080fd5b919050565b600060208284031215610e8957600080fd5b610e9282610e4e565b9392505050565b60008060408385031215610eac57600080fd5b610eb583610e4e565b946020939093013593505050565b60008060008060608587031215610ed957600080fd5b610ee285610e4e565b935060208501359250604085013567ffffffffffffffff80821115610f0657600080fd5b818701915087601f830112610f1a57600080fd5b813581811115610f2957600080fd5b8860208260051b8501011115610f3e57600080fd5b95989497505060200194505050565b600060208284031215610f5f57600080fd5b5035919050565b600060208284031215610f7857600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610fd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200796f426ffd469ebde2155737004761b501d4d36bdb498e432a26801790e1a4264736f6c63430008060033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106100d65760003560e01c8063787fcbdb1161007f578063c884ef8311610059578063c884ef831461024c578063e3f5b19514610287578063f2fde38b1461029d578063fdb4beda146102bd57600080fd5b8063787fcbdb1461019957806382bfefc8146101c85780638da5cb5b1461022157600080fd5b80633d13f874116100b05780633d13f8741461014457806366d5437b14610164578063715018a61461018457600080fd5b806306b091f9146100e257806307b18bde1461010457806321ff99701461012457600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd366004610e99565b6102d3565b005b34801561011057600080fd5b5061010261011f366004610e99565b6104d0565b34801561013057600080fd5b5061010261013f366004610f4d565b610607565b34801561015057600080fd5b5061010261015f366004610ec3565b6106c8565b34801561017057600080fd5b5061010261017f366004610ec3565b61077b565b34801561019057600080fd5b506101026108ce565b3480156101a557600080fd5b506004546101b39060ff1681565b60405190151581526020015b60405180910390f35b3480156101d457600080fd5b506101fc7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bf565b34801561022d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101fc565b34801561025857600080fd5b50610279610267366004610e77565b60036020526000908152604090205481565b6040519081526020016101bf565b34801561029357600080fd5b5061027960015481565b3480156102a957600080fd5b506101026102b8366004610e77565b61095b565b3480156102c957600080fd5b5061027960025481565b60005473ffffffffffffffffffffffffffffffffffffffff163314610359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156103e157600080fd5b505afa1580156103f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104199190610f66565b9050600082821061042a578261042c565b815b905061046f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168583610a8b565b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390526000918101919091527f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5906060015b60405180910390a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b60045460ff161515600114610592576040517f0a7287b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4760008282106105a257826105a4565b815b90506105b08482610b4a565b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390526001918101919091527f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5906060016104c2565b60005473ffffffffffffffffffffffffffffffffffffffff163314610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b600180546002558190556040518181527f2cbc14f49c068133583f7cb530018af451c87c1cf1327cf2a4ff4698c4730aa49060200160405180910390a150565b60006106d685858585610bf0565b905061071973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168683610a8b565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152602081018390526000918101919091527fab3c4ae116d5285676cffaad9c32cae8acf49b49ca0fc9953b029f97acb955ef906060015b60405180910390a15050505050565b60045460ff1615156001146107bc576040517f0a7287b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107ca85858585610bf0565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506108778582610b4a565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152602081018390526001918101919091527fab3c4ae116d5285676cffaad9c32cae8acf49b49ca0fc9953b029f97acb955ef9060600161076c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b6109596000610d65565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610350565b73ffffffffffffffffffffffffffffffffffffffff8116610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b610a8881610d65565b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610350565b50505050565b8015610bec5760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b5050905080610bea576040517f6200562d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5050565b600080610c84848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b166020820152603481018a90526054019150610c699050565b60405160208183030381529060405280519060200120610dda565b90506001548114158015610c9a57506002548114155b15610cd1576040517ff542095700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616600090815260036020526040902054808611610d30576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526003602052604090208690558503915050949350505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610e46576000858281518110610dfc57610dfc610fdf565b60200260200101519050808311610e225760008381526020829052604090209250610e33565b600081815260208490526040902092505b5080610e3e81610f7f565b915050610ddf565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e7257600080fd5b919050565b600060208284031215610e8957600080fd5b610e9282610e4e565b9392505050565b60008060408385031215610eac57600080fd5b610eb583610e4e565b946020939093013593505050565b60008060008060608587031215610ed957600080fd5b610ee285610e4e565b935060208501359250604085013567ffffffffffffffff80821115610f0657600080fd5b818701915087601f830112610f1a57600080fd5b813581811115610f2957600080fd5b8860208260051b8501011115610f3e57600080fd5b95989497505060200194505050565b600060208284031215610f5f57600080fd5b5035919050565b600060208284031215610f7857600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610fd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200796f426ffd469ebde2155737004761b501d4d36bdb498e432a26801790e1a4264736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _token (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _isWrappedNative (bool): True
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,945.63 | 98.5221 | $191,687.66 |
Loading...
Loading
Loading...
Loading
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.