Source Code
Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 2,896 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw KODO | 155438 | 564 days ago | IN | 0 ETH | 0.00000303 | ||||
| Claim | 154290 | 564 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 152542 | 564 days ago | IN | 0 ETH | 0.00002471 | ||||
| Claim | 145784 | 566 days ago | IN | 0 ETH | 0.0000239 | ||||
| Claim | 144714 | 566 days ago | IN | 0 ETH | 0.0000239 | ||||
| Claim | 138606 | 568 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 138146 | 568 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 137686 | 568 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 137315 | 568 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 136776 | 569 days ago | IN | 0 ETH | 0.0000245 | ||||
| Claim | 135953 | 569 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 133996 | 569 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 133709 | 569 days ago | IN | 0 ETH | 0.00000478 | ||||
| Set Merkle Root | 133632 | 570 days ago | IN | 0 ETH | 0.0000015 | ||||
| Claim | 131199 | 570 days ago | IN | 0 ETH | 0.00002444 | ||||
| Claim | 130570 | 570 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 128450 | 571 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 127426 | 571 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 123896 | 572 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 123771 | 572 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 122924 | 572 days ago | IN | 0 ETH | 0.00004428 | ||||
| Claim | 122078 | 573 days ago | IN | 0 ETH | 0.00004781 | ||||
| Set Merkle Root | 121933 | 573 days ago | IN | 0 ETH | 0.0000027 | ||||
| Claim | 120138 | 573 days ago | IN | 0 ETH | 0.00004781 | ||||
| Claim | 116957 | 574 days ago | IN | 0 ETH | 0.00004781 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MerkleClaim
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.13;
/// ============ Imports ============
import {IKodo} from "contracts/interfaces/IKodo.sol";
import {IVotingEscrow} from "contracts/interfaces/IVotingEscrow.sol";
import {MerkleProof} from "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol"; // OZ: MerkleProof
import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol";
/// @title MerkleClaim
/// @notice Claims KODO for members of a merkle tree
/// @author Modified from Merkle Airdrop Starter (https://github.com/Anish-Agnihotri/merkle-airdrop-starter/blob/master/contracts/src/MerkleClaimERC20.sol)
contract MerkleClaim is Ownable {
/// @notice max lock period 26 weeeks
uint256 public constant LOCK = 86400 * 7 * 52 * 4;
uint256 public duration;
uint256 public startTime;
IVotingEscrow public ve;
/// @notice KODO token to claim
IKodo public KODO;
/// @notice ERC20-claimee inclusion root
bytes32 public merkleRoot;
/// @notice Mapping of addresses who have claimed tokens
mapping(address => uint256) public claimedAmounts;
/// ============ Constructor ============
/// @notice Creates a new MerkleClaim contract
/// @param _ve address
/// @param _merkleRoot of claimees
/// @param _duration duration for airdrop (in days)
constructor(address _ve, bytes32 _merkleRoot, uint256 _duration) {
ve = IVotingEscrow(_ve);
KODO = IKodo(IVotingEscrow(_ve).token());
merkleRoot = _merkleRoot;
duration = _duration;
}
/// ============ Events ============
/// @notice Emitted after a successful token claim
/// @param to recipient of claim
/// @param amount of veTokens claimed
/// @param tokenId veToken NFT Id
event Claim(address indexed to, uint256 amount, uint256 tokenId);
/// @notice Emitted after a successful withdrawal of remaining tokens
/// @param recipient recipient of remaining tokens
/// @param amount of remaining tokens
event Withdrawal(address indexed recipient, uint256 amount);
event MerkleRootSet(bytes32 newMerkleRoot);
/// ============ Functions ============
/// @notice set start time for airdrop
/// @param _startTime start time (in seconds)
function setStartTime(uint256 _startTime) external onlyOwner {
require(_startTime > block.timestamp, "Invalid start time");
startTime = _startTime;
}
/// @notice set duration for airdrop
/// @param _duration duration (in days)
function setDuration(uint256 _duration) external onlyOwner {
require(_duration > 0, "Invalid duration days");
duration = _duration;
}
/// @notice set merkle root
function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
merkleRoot = _merkleRoot;
emit MerkleRootSet(_merkleRoot);
}
/// @notice Allows claiming tokens if address is part of merkle tree
/// @param to address of claimee
/// @param amount of tokens owed to claimee
/// @param proof merkle proof to prove address and amount are in tree
function claim(
address to,
uint256 amount,
bytes32[] calldata proof
) external {
uint256 endTime = startTime + duration * 86400;
// check valid timestamp
require(block.timestamp >= startTime && block.timestamp <= endTime, "Airdrop is not started yet or already finished");
// Throw if address has already claimed tokens
uint256 alreadyClaimed = claimedAmounts[to];
require(alreadyClaimed < amount, "ALREADY_CLAIMED_FULL_AMOUNT");
uint256 claimableAmount = amount - alreadyClaimed;
// Verify merkle proof, or revert if not in tree
bytes32 leaf = keccak256(abi.encodePacked(to, amount));
bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
require(isValidLeaf, "NOT_IN_MERKLE");
// Set address to claimed
claimedAmounts[to] = amount;
KODO.approve(address(ve), claimableAmount);
// Claim tokens for address
uint256 tokenId = ve.create_lock_for(claimableAmount, LOCK, to);
// Emit claim event
emit Claim(to, claimableAmount, tokenId);
}
/// @notice withdraw remaining tokens if airdrop is finished
function withdrawKODO(address _recipient) external onlyOwner {
require(block.timestamp > startTime + duration * 86400, "Airdrop is not finished yet");
uint256 remaining = KODO.balanceOf(address(this));
require(remaining > 0, "No remaining tokens");
KODO.transfer(_recipient, remaining);
// Emit withdrawal event
emit Withdrawal(_recipient, remaining);
}
function setClaimedAmount(address[] memory _accounts, uint256[] memory _amounts) external onlyOwner {
for (uint256 i = 0; i < _accounts.length; i++) {
claimedAmounts[_accounts[i]] = _amounts[i];
}
}
}pragma solidity 0.8.13;
interface IKodo {
function totalSupply() external view returns (uint);
function balanceOf(address) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address, uint) external returns (bool);
function transferFrom(address,address,uint) external returns (bool);
function mint(address, uint) external returns (bool);
function minter() external returns (address);
}pragma solidity 0.8.13;
interface IVotingEscrow {
struct Point {
int128 bias;
int128 slope; // # -dweight / dt
uint256 ts;
uint256 blk; // block
}
function token() external view returns (address);
function team() external returns (address);
function epoch() external view returns (uint);
function point_history(uint loc) external view returns (Point memory);
function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
function user_point_epoch(uint tokenId) external view returns (uint);
function ownerOf(uint) external view returns (address);
function isApprovedOrOwner(address, uint) external view returns (bool);
function transferFrom(address, address, uint) external;
function voting(uint tokenId) external;
function abstain(uint tokenId) external;
function attach(uint tokenId) external;
function detach(uint tokenId) external;
function checkpoint() external;
function deposit_for(uint tokenId, uint value) external;
function create_lock_for(uint, uint, address) external returns (uint);
function balanceOfNFT(uint) external view returns (uint);
function totalSupply() external view returns (uint);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (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 Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_ve","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"MerkleRootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"KODO","outputs":[{"internalType":"contract IKodo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":"","type":"address"}],"name":"claimedAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setClaimedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawKODO","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50604051610fcf380380610fcf83398101604081905261002f91610150565b610038336100e4565b600380546001600160a01b0319166001600160a01b03851690811790915560408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa158015610091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b59190610185565b600480546001600160a01b0319166001600160a01b0392909216919091179055600591909155600155506101a7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461014b57600080fd5b919050565b60008060006060848603121561016557600080fd5b61016e84610134565b925060208401519150604084015190509250925092565b60006020828403121561019757600080fd5b6101a082610134565b9392505050565b610e19806101b66000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806378e9792511610097578063c81e05ad11610066578063c81e05ad146101f0578063f1685a4e14610203578063f2fde38b14610216578063f6be71d11461022957600080fd5b806378e97925146101b85780637cb64759146101c15780638da5cb5b146101d4578063a4f0d7d0146101e557600080fd5b80633d13f874116100d35780633d13f8741461016a5780633e0a322d1461017d57806371417b3214610190578063715018a6146101b057600080fd5b80630fb5a6b4146101055780631390a444146101215780631f850716146101365780632eb4a7ab14610161575b600080fd5b61010e60015481565b6040519081526020015b60405180910390f35b61013461012f366004610b97565b61023c565b005b600354610149906001600160a01b031681565b6040516001600160a01b039091168152602001610118565b61010e60055481565b610134610178366004610c57565b6102c4565b61013461018b366004610ce1565b610602565b61010e61019e366004610cfa565b60066020526000908152604090205481565b610134610653565b61010e60025481565b6101346101cf366004610ce1565b610667565b6000546001600160a01b0316610149565b61010e63077f880081565b600454610149906001600160a01b031681565b610134610211366004610cfa565b6106aa565b610134610224366004610cfa565b610898565b610134610237366004610ce1565b610911565b610244610966565b60005b82518110156102bf5781818151811061026257610262610d15565b60200260200101516006600085848151811061028057610280610d15565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806102b790610d41565b915050610247565b505050565b6000600154620151806102d79190610d5a565b6002546102e49190610d79565b905060025442101580156102f85750804211155b6103605760405162461bcd60e51b815260206004820152602e60248201527f41697264726f70206973206e6f74207374617274656420796574206f7220616c60448201526d1c9958591e48199a5b9a5cda195960921b60648201526084015b60405180910390fd5b6001600160a01b0385166000908152600660205260409020548481106103c85760405162461bcd60e51b815260206004820152601b60248201527f414c52454144595f434c41494d45445f46554c4c5f414d4f554e5400000000006044820152606401610357565b60006103d48287610d91565b6040516bffffffffffffffffffffffff1960608a901b16602082015260348101889052909150600090605401604051602081830303815290604052805190602001209050600061045b8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060055491508590506109c0565b90508061049a5760405162461bcd60e51b815260206004820152600d60248201526c4e4f545f494e5f4d45524b4c4560981b6044820152606401610357565b6001600160a01b03898116600090815260066020526040908190208a905560048054600354925163095ea7b360e01b815292841691830191909152602482018690529091169063095ea7b3906044016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190610da8565b5060035460405163d4e54c3b60e01b81526004810185905263077f880060248201526001600160a01b038b81166044830152600092169063d4e54c3b906064016020604051808303816000875af115801561058b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105af9190610dca565b60408051868152602081018390529192506001600160a01b038c16917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250505050505050505050565b61060a610966565b42811161064e5760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642073746172742074696d6560701b6044820152606401610357565b600255565b61065b610966565b61066560006109d6565b565b61066f610966565b60058190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b6106b2610966565b6001546106c29062015180610d5a565b6002546106cf9190610d79565b421161071d5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206973206e6f742066696e69736865642079657400000000006044820152606401610357565b600480546040516370a0823160e01b815230928101929092526000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f9190610dca565b9050600081116107d75760405162461bcd60e51b81526020600482015260136024820152724e6f2072656d61696e696e6720746f6b656e7360681b6044820152606401610357565b6004805460405163a9059cbb60e01b81526001600160a01b03858116938201939093526024810184905291169063a9059cbb906044016020604051808303816000875af115801561082c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190610da8565b50816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161088c91815260200190565b60405180910390a25050565b6108a0610966565b6001600160a01b0381166109055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610357565b61090e816109d6565b50565b610919610966565b600081116109615760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206475726174696f6e206461797360581b6044820152606401610357565b600155565b6000546001600160a01b031633146106655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610357565b6000826109cd8584610a26565b14949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610a6b57610a5782868381518110610a4a57610a4a610d15565b6020026020010151610a73565b915080610a6381610d41565b915050610a2b565b509392505050565b6000818310610a8f576000828152602084905260409020610a9e565b60008381526020839052604090205b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610ae457610ae4610aa5565b604052919050565b600067ffffffffffffffff821115610b0657610b06610aa5565b5060051b60200190565b80356001600160a01b0381168114610b2757600080fd5b919050565b600082601f830112610b3d57600080fd5b81356020610b52610b4d83610aec565b610abb565b82815260059290921b84018101918181019086841115610b7157600080fd5b8286015b84811015610b8c5780358352918301918301610b75565b509695505050505050565b60008060408385031215610baa57600080fd5b823567ffffffffffffffff80821115610bc257600080fd5b818501915085601f830112610bd657600080fd5b81356020610be6610b4d83610aec565b82815260059290921b84018101918181019089841115610c0557600080fd5b948201945b83861015610c2a57610c1b86610b10565b82529482019490820190610c0a565b96505086013592505080821115610c4057600080fd5b50610c4d85828601610b2c565b9150509250929050565b60008060008060608587031215610c6d57600080fd5b610c7685610b10565b935060208501359250604085013567ffffffffffffffff80821115610c9a57600080fd5b818701915087601f830112610cae57600080fd5b813581811115610cbd57600080fd5b8860208260051b8501011115610cd257600080fd5b95989497505060200194505050565b600060208284031215610cf357600080fd5b5035919050565b600060208284031215610d0c57600080fd5b610a9e82610b10565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610d5357610d53610d2b565b5060010190565b6000816000190483118215151615610d7457610d74610d2b565b500290565b60008219821115610d8c57610d8c610d2b565b500190565b600082821015610da357610da3610d2b565b500390565b600060208284031215610dba57600080fd5b81518015158114610a9e57600080fd5b600060208284031215610ddc57600080fd5b505191905056fea26469706673582212204c98081ae8af66ad63c0750f5fe36d15e653d775b84e98a1721e01e24e48ca3f64736f6c634300080d00330000000000000000000000006c4a102b7aaffa9a8c9440c08a5c09deecafb3245a3e655dd9c015529bd57acd0a1ee32e728c80a77cb1f2698436887902adcccf000000000000000000000000000000000000000000000000000000000000001c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c806378e9792511610097578063c81e05ad11610066578063c81e05ad146101f0578063f1685a4e14610203578063f2fde38b14610216578063f6be71d11461022957600080fd5b806378e97925146101b85780637cb64759146101c15780638da5cb5b146101d4578063a4f0d7d0146101e557600080fd5b80633d13f874116100d35780633d13f8741461016a5780633e0a322d1461017d57806371417b3214610190578063715018a6146101b057600080fd5b80630fb5a6b4146101055780631390a444146101215780631f850716146101365780632eb4a7ab14610161575b600080fd5b61010e60015481565b6040519081526020015b60405180910390f35b61013461012f366004610b97565b61023c565b005b600354610149906001600160a01b031681565b6040516001600160a01b039091168152602001610118565b61010e60055481565b610134610178366004610c57565b6102c4565b61013461018b366004610ce1565b610602565b61010e61019e366004610cfa565b60066020526000908152604090205481565b610134610653565b61010e60025481565b6101346101cf366004610ce1565b610667565b6000546001600160a01b0316610149565b61010e63077f880081565b600454610149906001600160a01b031681565b610134610211366004610cfa565b6106aa565b610134610224366004610cfa565b610898565b610134610237366004610ce1565b610911565b610244610966565b60005b82518110156102bf5781818151811061026257610262610d15565b60200260200101516006600085848151811061028057610280610d15565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806102b790610d41565b915050610247565b505050565b6000600154620151806102d79190610d5a565b6002546102e49190610d79565b905060025442101580156102f85750804211155b6103605760405162461bcd60e51b815260206004820152602e60248201527f41697264726f70206973206e6f74207374617274656420796574206f7220616c60448201526d1c9958591e48199a5b9a5cda195960921b60648201526084015b60405180910390fd5b6001600160a01b0385166000908152600660205260409020548481106103c85760405162461bcd60e51b815260206004820152601b60248201527f414c52454144595f434c41494d45445f46554c4c5f414d4f554e5400000000006044820152606401610357565b60006103d48287610d91565b6040516bffffffffffffffffffffffff1960608a901b16602082015260348101889052909150600090605401604051602081830303815290604052805190602001209050600061045b8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060055491508590506109c0565b90508061049a5760405162461bcd60e51b815260206004820152600d60248201526c4e4f545f494e5f4d45524b4c4560981b6044820152606401610357565b6001600160a01b03898116600090815260066020526040908190208a905560048054600354925163095ea7b360e01b815292841691830191909152602482018690529091169063095ea7b3906044016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190610da8565b5060035460405163d4e54c3b60e01b81526004810185905263077f880060248201526001600160a01b038b81166044830152600092169063d4e54c3b906064016020604051808303816000875af115801561058b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105af9190610dca565b60408051868152602081018390529192506001600160a01b038c16917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250505050505050505050565b61060a610966565b42811161064e5760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642073746172742074696d6560701b6044820152606401610357565b600255565b61065b610966565b61066560006109d6565b565b61066f610966565b60058190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b6106b2610966565b6001546106c29062015180610d5a565b6002546106cf9190610d79565b421161071d5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206973206e6f742066696e69736865642079657400000000006044820152606401610357565b600480546040516370a0823160e01b815230928101929092526000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f9190610dca565b9050600081116107d75760405162461bcd60e51b81526020600482015260136024820152724e6f2072656d61696e696e6720746f6b656e7360681b6044820152606401610357565b6004805460405163a9059cbb60e01b81526001600160a01b03858116938201939093526024810184905291169063a9059cbb906044016020604051808303816000875af115801561082c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190610da8565b50816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161088c91815260200190565b60405180910390a25050565b6108a0610966565b6001600160a01b0381166109055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610357565b61090e816109d6565b50565b610919610966565b600081116109615760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206475726174696f6e206461797360581b6044820152606401610357565b600155565b6000546001600160a01b031633146106655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610357565b6000826109cd8584610a26565b14949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610a6b57610a5782868381518110610a4a57610a4a610d15565b6020026020010151610a73565b915080610a6381610d41565b915050610a2b565b509392505050565b6000818310610a8f576000828152602084905260409020610a9e565b60008381526020839052604090205b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610ae457610ae4610aa5565b604052919050565b600067ffffffffffffffff821115610b0657610b06610aa5565b5060051b60200190565b80356001600160a01b0381168114610b2757600080fd5b919050565b600082601f830112610b3d57600080fd5b81356020610b52610b4d83610aec565b610abb565b82815260059290921b84018101918181019086841115610b7157600080fd5b8286015b84811015610b8c5780358352918301918301610b75565b509695505050505050565b60008060408385031215610baa57600080fd5b823567ffffffffffffffff80821115610bc257600080fd5b818501915085601f830112610bd657600080fd5b81356020610be6610b4d83610aec565b82815260059290921b84018101918181019089841115610c0557600080fd5b948201945b83861015610c2a57610c1b86610b10565b82529482019490820190610c0a565b96505086013592505080821115610c4057600080fd5b50610c4d85828601610b2c565b9150509250929050565b60008060008060608587031215610c6d57600080fd5b610c7685610b10565b935060208501359250604085013567ffffffffffffffff80821115610c9a57600080fd5b818701915087601f830112610cae57600080fd5b813581811115610cbd57600080fd5b8860208260051b8501011115610cd257600080fd5b95989497505060200194505050565b600060208284031215610cf357600080fd5b5035919050565b600060208284031215610d0c57600080fd5b610a9e82610b10565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610d5357610d53610d2b565b5060010190565b6000816000190483118215151615610d7457610d74610d2b565b500290565b60008219821115610d8c57610d8c610d2b565b500190565b600082821015610da357610da3610d2b565b500390565b600060208284031215610dba57600080fd5b81518015158114610a9e57600080fd5b600060208284031215610ddc57600080fd5b505191905056fea26469706673582212204c98081ae8af66ad63c0750f5fe36d15e653d775b84e98a1721e01e24e48ca3f64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006c4a102b7aaffa9a8c9440c08a5c09deecafb3245a3e655dd9c015529bd57acd0a1ee32e728c80a77cb1f2698436887902adcccf000000000000000000000000000000000000000000000000000000000000001c
-----Decoded View---------------
Arg [0] : _ve (address): 0x6c4A102B7aafFA9a8C9440c08A5c09deECAFB324
Arg [1] : _merkleRoot (bytes32): 0x5a3e655dd9c015529bd57acd0a1ee32e728c80a77cb1f2698436887902adcccf
Arg [2] : _duration (uint256): 28
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c4a102b7aaffa9a8c9440c08a5c09deecafb324
Arg [1] : 5a3e655dd9c015529bd57acd0a1ee32e728c80a77cb1f2698436887902adcccf
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.