Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,128 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Tokens | 23635879 | 13 days ago | IN | 0 ETH | 0.00013224 | ||||
| Request Claim Ac... | 23595572 | 19 days ago | IN | 0 ETH | 0.00014166 | ||||
| Request Claim Ac... | 23537800 | 27 days ago | IN | 0 ETH | 0.00005717 | ||||
| Request Claim Ac... | 23504840 | 31 days ago | IN | 0 ETH | 0.00001202 | ||||
| Deposit | 23492178 | 33 days ago | IN | 0 ETH | 0.00012083 | ||||
| Deposit | 23487497 | 34 days ago | IN | 0 ETH | 0.00011024 | ||||
| Deposit | 23455613 | 38 days ago | IN | 0 ETH | 0.00013113 | ||||
| Request Claim Ac... | 23445808 | 40 days ago | IN | 0 ETH | 0.00012178 | ||||
| Request Claim Ac... | 23430617 | 42 days ago | IN | 0 ETH | 0.00002205 | ||||
| Request Claim Ac... | 23429510 | 42 days ago | IN | 0 ETH | 0.0000959 | ||||
| Withdraw Tokens | 23422883 | 43 days ago | IN | 0 ETH | 0.0000653 | ||||
| Request Claim Ac... | 23412230 | 44 days ago | IN | 0 ETH | 0.00009724 | ||||
| Deposit | 23410312 | 45 days ago | IN | 0 ETH | 0.00001155 | ||||
| Deposit | 23409937 | 45 days ago | IN | 0 ETH | 0.00008621 | ||||
| Deposit | 23404079 | 45 days ago | IN | 0 ETH | 0.00007811 | ||||
| Deposit | 23398698 | 46 days ago | IN | 0 ETH | 0.00016001 | ||||
| Deposit | 23388510 | 48 days ago | IN | 0 ETH | 0.00002173 | ||||
| Deposit | 23370460 | 50 days ago | IN | 0 ETH | 0.0001992 | ||||
| Deposit | 23360328 | 51 days ago | IN | 0 ETH | 0.00012459 | ||||
| Deposit | 23354422 | 52 days ago | IN | 0 ETH | 0.00014071 | ||||
| Request Claim Ac... | 23346513 | 53 days ago | IN | 0 ETH | 0.00010726 | ||||
| Request Claim Ac... | 23345664 | 54 days ago | IN | 0 ETH | 0.00008215 | ||||
| Request Claim Ac... | 23342395 | 54 days ago | IN | 0 ETH | 0.00010322 | ||||
| Deposit | 23342365 | 54 days ago | IN | 0 ETH | 0.00013122 | ||||
| Deposit | 23342112 | 54 days ago | IN | 0 ETH | 0.00010523 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NewMoonTokenVesting
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract NewMoonTokenVesting is Ownable {
bytes32 private root;
IERC20 public newMoon;
IERC20 public oldMoon;
uint256 public limitPerDay;
uint256 public globalLock;
uint256 public claimedToday;
uint256 public lastUpdatedDay;
uint256 public bonusStartDate;
uint256 denominator = 10000;
uint256[] bonusMultipliers = [10500, 10400, 10300, 10200, 10100, 10000];
mapping(address => uint256) public userDeposits;
mapping(address => uint256) public userClaimed;
mapping(address => mapping(uint256 => uint256)) public userDepositsWithBonus;
mapping(address => bool) public claimAllowed;
mapping(address => bool) public claimRequested;
event UserDeposit(address indexed user, uint256 amount, uint256 bonusMultipler);
event UserClaim(address indexed user, uint256 amount);
event DailyLimitUpdated(uint256 limit);
event ClaimAccessRequest(address indexed user, bool access);
constructor(
address owner,
bytes32 _root,
address _oldTokenAddress,
address _newTokenAddress,
uint256 _limitPerDay,
uint256 _globalLock,
uint256 _bonusStartDate
) Ownable(owner) {
root = _root;
oldMoon = IERC20(_oldTokenAddress);
newMoon = IERC20(_newTokenAddress);
limitPerDay = _limitPerDay;
globalLock = _globalLock;
bonusStartDate = _bonusStartDate;
}
function deposit(bytes32[] memory proof, uint256 depositAmount, uint256 snapshotAmount) public {
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(msg.sender, snapshotAmount))));
require(MerkleProof.verify(proof, root, leaf), "Invalid proof");
require(userDeposits[msg.sender] + depositAmount <= snapshotAmount, "Deposit exceeds snapshot balance of user.");
uint256 multiplierBps = getBonusMultiplier();
userDeposits[msg.sender] += depositAmount;
userDepositsWithBonus[msg.sender][multiplierBps] += depositAmount;
oldMoon.transferFrom(msg.sender, address(this), depositAmount);
emit UserDeposit(msg.sender, depositAmount, multiplierBps);
}
function claim(uint256 amount) public {
require(block.timestamp > globalLock, "Claim is not open yet.");
require(claimAllowed[msg.sender], "Waiting for admin approval to claim...");
require(userClaimed[msg.sender] + amount <= getUserDepositWithBonus(msg.sender), "Claim amount is invalid.");
_updateDailyLimit();
require(claimedToday + amount <= limitPerDay, "Daily claim limit exceeded");
claimedToday += amount;
userClaimed[msg.sender] += amount;
newMoon.transfer(msg.sender, amount);
emit UserClaim(msg.sender, amount);
}
function requestClaimAccess() public {
require(
getUserDepositWithBonus(msg.sender) > 0,
"You must have deposits greater than zero to request claim access..."
);
require(!claimRequested[msg.sender], "You've already requested access to claim.");
claimRequested[msg.sender] = true;
emit ClaimAccessRequest(msg.sender, false);
}
function getBonusMultiplier() public view returns (uint256 multiplierBps) {
if (block.timestamp > bonusStartDate) {
uint256 weeksSinceStart = (block.timestamp - bonusStartDate) / 1 weeks;
if (weeksSinceStart == 0) return 10500; // 5%
if (weeksSinceStart == 1) return 10400;
if (weeksSinceStart == 2) return 10300;
if (weeksSinceStart == 3) return 10200;
if (weeksSinceStart == 4) return 10100;
return 10000; // 1:1
} else {
return 10000; // 1:1
}
}
function getUserDepositWithBonus(address user) public view returns (uint256 depositAmount) {
for (uint256 i = 0; i < bonusMultipliers.length; i++) {
uint256 depositAmountWithBonus =
((userDepositsWithBonus[user][bonusMultipliers[i]] * bonusMultipliers[i]) / denominator);
depositAmount += depositAmountWithBonus;
}
return depositAmount;
}
function _updateDailyLimit() internal {
uint256 currentDay = block.timestamp / 1 days;
if (currentDay > lastUpdatedDay) {
claimedToday = 0;
lastUpdatedDay = currentDay;
}
}
function withdrawTokens(address _token, uint256 amount) external onlyOwner {
IERC20(_token).transfer(owner(), amount);
}
function updateMerkleRoot(bytes32 _root) external onlyOwner {
root = _root;
}
function updateLimitPerDay(uint256 _limit) external onlyOwner {
limitPerDay = _limit;
emit DailyLimitUpdated(_limit);
}
function allowClaim(address _user, bool _claimStatus) external onlyOwner {
claimAllowed[_user] = _claimStatus;
emit ClaimAccessRequest(_user, _claimStatus);
}
function allowMultipleClaim(address[] memory _users, bool[] memory _claimStatuses) external onlyOwner {
for (uint256 i = 0; i < _users.length; i++) {
claimAllowed[_users[i]] = _claimStatuses[i];
emit ClaimAccessRequest(_users[i], _claimStatuses[i]);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../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.
*
* 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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)
// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.
pragma solidity ^0.8.20;
import {Hashes} from "./Hashes.sol";
/**
* @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.
*
* IMPORTANT: Consider memory side-effects when using custom hashing functions
* that access memory in an unsafe way.
*
* NOTE: This library supports proof verification for merkle trees built using
* custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving
* leaf inclusion in trees built using non-commutative hashing functions requires
* additional logic that is not supported by this library.
*/
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.
*
* This version handles proofs in memory with the default hashing function.
*/
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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with the default hashing function.
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in memory with a custom hashing function.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProof(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with a custom hashing function.
*/
function processProof(
bytes32[] memory proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in calldata with the default hashing function.
*/
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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with the default hashing function.
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProofCalldata(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function processProofCalldata(
bytes32[] calldata proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(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}.
*
* This version handles multiproofs in memory with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(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.
*
* This version handles multiproofs in memory with the default hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = Hashes.commutativeKeccak256(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProof(proof, proofFlags, leaves, hasher) == 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.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
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.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = Hashes.commutativeKeccak256(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == 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.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)
pragma solidity ^0.8.20;
/**
* @dev Library of standard hash functions.
*
* _Available since v5.1._
*/
library Hashes {
/**
* @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.
*
* NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
*/
function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {
return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);
}
/**
* @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
*/
function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {
assembly ("memory-safe") {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"address","name":"_oldTokenAddress","type":"address"},{"internalType":"address","name":"_newTokenAddress","type":"address"},{"internalType":"uint256","name":"_limitPerDay","type":"uint256"},{"internalType":"uint256","name":"_globalLock","type":"uint256"},{"internalType":"uint256","name":"_bonusStartDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"access","type":"bool"}],"name":"ClaimAccessRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"DailyLimitUpdated","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonusMultipler","type":"uint256"}],"name":"UserDeposit","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_claimStatus","type":"bool"}],"name":"allowClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"bool[]","name":"_claimStatuses","type":"bool[]"}],"name":"allowMultipleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedToday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"snapshotAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBonusMultiplier","outputs":[{"internalType":"uint256","name":"multiplierBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserDepositWithBonus","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newMoon","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldMoon","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":[],"name":"requestClaimAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updateLimitPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userDepositsWithBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526127106009556040518060c0016040528061290461ffff1681526020016128a061ffff16815260200161283c61ffff1681526020016127d861ffff16815260200161277461ffff16815260200161271061ffff16815250600a90600661006b929190610283565b50348015610077575f5ffd5b506040516125cd3803806125cd833981810160405281019061009991906103b3565b865f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010a575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610101919061045f565b60405180910390fd5b610119816101c260201b60201c565b50856001819055508460035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600481905550816005819055508060088190555050505050505050610478565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255905f5260205f209081019282156102c3579160200282015b828111156102c2578251829061ffff169055916020019190600101906102a1565b5b5090506102d091906102d4565b5090565b5b808211156102eb575f815f9055506001016102d5565b5090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61031c826102f3565b9050919050565b61032c81610312565b8114610336575f5ffd5b50565b5f8151905061034781610323565b92915050565b5f819050919050565b61035f8161034d565b8114610369575f5ffd5b50565b5f8151905061037a81610356565b92915050565b5f819050919050565b61039281610380565b811461039c575f5ffd5b50565b5f815190506103ad81610389565b92915050565b5f5f5f5f5f5f5f60e0888a0312156103ce576103cd6102ef565b5b5f6103db8a828b01610339565b97505060206103ec8a828b0161036c565b96505060406103fd8a828b01610339565b955050606061040e8a828b01610339565b945050608061041f8a828b0161039f565b93505060a06104308a828b0161039f565b92505060c06104418a828b0161039f565b91505092959891949750929550565b61045981610312565b82525050565b5f6020820190506104725f830184610450565b92915050565b612148806104855f395ff3fe608060405234801561000f575f5ffd5b5060043610610171575f3560e01c806353473010116100dc5780638e1f81bb11610095578063b4c407111161006f578063b4c4071114610425578063d5d97e7814610441578063f2fde38b1461045f578063f7efd7241461047b57610171565b80638e1f81bb146103cb5780639a6dd716146103e9578063a9d740131461040757610171565b8063534730101461031957806354c838a9146103375780636b6d23d614610367578063715018a614610385578063786c12cb1461038f5780638da5cb5b146103ad57610171565b8063379607f51161012e578063379607f5146102355780633b7fcdca146102515780633dfb55551461028157806343518f3f146102b15780634783f0ef146102cd5780635185192d146102e957610171565b806301e637651461017557806306b091f9146101a55780630ba36dcd146101c15780631983558e146101f15780631c6190d6146101fb5780632211f42a14610219575b5f5ffd5b61018f600480360381019061018a9190611474565b610497565b60405161019c91906114b7565b60405180910390f35b6101bf60048036038101906101ba91906114fa565b61056c565b005b6101db60048036038101906101d69190611474565b6105fb565b6040516101e891906114b7565b60405180910390f35b6101f9610610565b005b610203610789565b60405161021091906114b7565b60405180910390f35b610233600480360381019061022e919061177d565b61078f565b005b61024f600480360381019061024a91906117f3565b6108c1565b005b61026b60048036038101906102669190611474565b610bd4565b60405161027891906114b7565b60405180910390f35b61029b600480360381019061029691906114fa565b610be9565b6040516102a891906114b7565b60405180910390f35b6102cb60048036038101906102c6919061181e565b610c09565b005b6102e760048036038101906102e2919061188f565b610cb7565b005b61030360048036038101906102fe9190611474565b610cc9565b60405161031091906118c9565b60405180910390f35b610321610ce6565b60405161032e91906114b7565b60405180910390f35b610351600480360381019061034c9190611474565b610cec565b60405161035e91906118c9565b60405180910390f35b61036f610d09565b60405161037c919061193d565b60405180910390f35b61038d610d2e565b005b610397610d41565b6040516103a491906114b7565b60405180910390f35b6103b5610ddd565b6040516103c29190611965565b60405180910390f35b6103d3610e04565b6040516103e091906114b7565b60405180910390f35b6103f1610e0a565b6040516103fe919061193d565b60405180910390f35b61040f610e2f565b60405161041c91906114b7565b60405180910390f35b61043f600480360381019061043a9190611a3e565b610e35565b005b610449611114565b60405161045691906114b7565b60405180910390f35b61047960048036038101906104749190611474565b61111a565b005b610495600480360381019061049091906117f3565b61119e565b005b5f5f5f90505b600a80549050811015610566575f600954600a83815481106104c2576104c1611aaa565b5b905f5260205f200154600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600a868154811061051d5761051c611aaa565b5b905f5260205f20015481526020019081526020015f205461053e9190611b04565b6105489190611b72565b905080836105569190611ba2565b925050808060010191505061049d565b50919050565b6105746111e7565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610598610ddd565b836040518363ffffffff1660e01b81526004016105b6929190611bd5565b6020604051808303815f875af11580156105d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f69190611c10565b505050565b600b602052805f5260405f205f915090505481565b5f61061a33610497565b1161065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190611ce1565b60405180910390fd5b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db90611d6f565b60405180910390fd5b6001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f5f60405161077f91906118c9565b60405180910390a2565b60085481565b6107976111e7565b5f5f90505b82518110156108bc578181815181106107b8576107b7611aaa565b5b6020026020010151600e5f8584815181106107d6576107d5611aaa565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508281815181106108405761083f611aaa565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f83838151811061089257610891611aaa565b5b60200260200101516040516108a791906118c9565b60405180910390a2808060010191505061079c565b505050565b6005544211610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90611dd7565b60405180910390fd5b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590611e65565b60405180910390fd5b61099733610497565b81600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546109e09190611ba2565b1115610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890611ecd565b60405180910390fd5b610a2961126e565b60045481600654610a3a9190611ba2565b1115610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7290611f35565b60405180910390fd5b8060065f828254610a8c9190611ba2565b9250508190555080600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610adf9190611ba2565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b42929190611bd5565b6020604051808303815f875af1158015610b5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b829190611c10565b503373ffffffffffffffffffffffffffffffffffffffff167fe2323fa72fc40846465d64f4b6ceb6716d38c6938c38fc238c4c07b7c3ecbb0082604051610bc991906114b7565b60405180910390a250565b600c602052805f5260405f205f915090505481565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b610c116111e7565b80600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f82604051610cab91906118c9565b60405180910390a25050565b610cbf6111e7565b8060018190555050565b600f602052805f5260405f205f915054906101000a900460ff1681565b60045481565b600e602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d366111e7565b610d3f5f61129c565b565b5f600854421115610dd4575f62093a8060085442610d5f9190611f53565b610d699190611b72565b90505f8103610d7d57612904915050610dda565b60018103610d90576128a0915050610dda565b60028103610da35761283c915050610dda565b60038103610db6576127d8915050610dda565b60048103610dc957612774915050610dda565b612710915050610dda565b61271090505b90565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b5f3382604051602001610e49929190611bd5565b60405160208183030381529060405280519060200120604051602001610e6f9190611fa6565b604051602081830303815290604052805190602001209050610e94846001548361135d565b610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca9061200a565b60405180910390fd5b8183600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610f1d9190611ba2565b1115610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612098565b60405180910390fd5b5f610f67610d41565b905083600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610fb59190611ba2565b9250508190555083600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546110179190611ba2565b9250508190555060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161107c939291906120b6565b6020604051808303815f875af1158015611098573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190611c10565b503373ffffffffffffffffffffffffffffffffffffffff167f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c437585836040516111059291906120eb565b60405180910390a25050505050565b60075481565b6111226111e7565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611192575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111899190611965565b60405180910390fd5b61119b8161129c565b50565b6111a66111e7565b806004819055507f6cd8635c4285386b9de2e59a4c1eaf32ad41f28ae64c308280217d7af51464e0816040516111dc91906114b7565b60405180910390a150565b6111ef611373565b73ffffffffffffffffffffffffffffffffffffffff1661120d610ddd565b73ffffffffffffffffffffffffffffffffffffffff161461126c57611230611373565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112639190611965565b60405180910390fd5b565b5f620151804261127e9190611b72565b9050600754811115611299575f600681905550806007819055505b50565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f82611369858461137a565b1490509392505050565b5f33905090565b5f5f8290505f5f90505b84518110156113c0576113b1828683815181106113a4576113a3611aaa565b5b60200260200101516113cb565b91508080600101915050611384565b508091505092915050565b5f8183106113e2576113dd82846113f5565b6113ed565b6113ec83836113f5565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114438261141a565b9050919050565b61145381611439565b811461145d575f5ffd5b50565b5f8135905061146e8161144a565b92915050565b5f6020828403121561148957611488611412565b5b5f61149684828501611460565b91505092915050565b5f819050919050565b6114b18161149f565b82525050565b5f6020820190506114ca5f8301846114a8565b92915050565b6114d98161149f565b81146114e3575f5ffd5b50565b5f813590506114f4816114d0565b92915050565b5f5f604083850312156115105761150f611412565b5b5f61151d85828601611460565b925050602061152e858286016114e6565b9150509250929050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115828261153c565b810181811067ffffffffffffffff821117156115a1576115a061154c565b5b80604052505050565b5f6115b3611409565b90506115bf8282611579565b919050565b5f67ffffffffffffffff8211156115de576115dd61154c565b5b602082029050602081019050919050565b5f5ffd5b5f611605611600846115c4565b6115aa565b90508083825260208201905060208402830185811115611628576116276115ef565b5b835b81811015611651578061163d8882611460565b84526020840193505060208101905061162a565b5050509392505050565b5f82601f83011261166f5761166e611538565b5b813561167f8482602086016115f3565b91505092915050565b5f67ffffffffffffffff8211156116a2576116a161154c565b5b602082029050602081019050919050565b5f8115159050919050565b6116c7816116b3565b81146116d1575f5ffd5b50565b5f813590506116e2816116be565b92915050565b5f6116fa6116f584611688565b6115aa565b9050808382526020820190506020840283018581111561171d5761171c6115ef565b5b835b81811015611746578061173288826116d4565b84526020840193505060208101905061171f565b5050509392505050565b5f82601f83011261176457611763611538565b5b81356117748482602086016116e8565b91505092915050565b5f5f6040838503121561179357611792611412565b5b5f83013567ffffffffffffffff8111156117b0576117af611416565b5b6117bc8582860161165b565b925050602083013567ffffffffffffffff8111156117dd576117dc611416565b5b6117e985828601611750565b9150509250929050565b5f6020828403121561180857611807611412565b5b5f611815848285016114e6565b91505092915050565b5f5f6040838503121561183457611833611412565b5b5f61184185828601611460565b9250506020611852858286016116d4565b9150509250929050565b5f819050919050565b61186e8161185c565b8114611878575f5ffd5b50565b5f8135905061188981611865565b92915050565b5f602082840312156118a4576118a3611412565b5b5f6118b18482850161187b565b91505092915050565b6118c3816116b3565b82525050565b5f6020820190506118dc5f8301846118ba565b92915050565b5f819050919050565b5f6119056119006118fb8461141a565b6118e2565b61141a565b9050919050565b5f611916826118eb565b9050919050565b5f6119278261190c565b9050919050565b6119378161191d565b82525050565b5f6020820190506119505f83018461192e565b92915050565b61195f81611439565b82525050565b5f6020820190506119785f830184611956565b92915050565b5f67ffffffffffffffff8211156119985761199761154c565b5b602082029050602081019050919050565b5f6119bb6119b68461197e565b6115aa565b905080838252602082019050602084028301858111156119de576119dd6115ef565b5b835b81811015611a0757806119f3888261187b565b8452602084019350506020810190506119e0565b5050509392505050565b5f82601f830112611a2557611a24611538565b5b8135611a358482602086016119a9565b91505092915050565b5f5f5f60608486031215611a5557611a54611412565b5b5f84013567ffffffffffffffff811115611a7257611a71611416565b5b611a7e86828701611a11565b9350506020611a8f868287016114e6565b9250506040611aa0868287016114e6565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b0e8261149f565b9150611b198361149f565b9250828202611b278161149f565b91508282048414831517611b3e57611b3d611ad7565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611b7c8261149f565b9150611b878361149f565b925082611b9757611b96611b45565b5b828204905092915050565b5f611bac8261149f565b9150611bb78361149f565b9250828201905080821115611bcf57611bce611ad7565b5b92915050565b5f604082019050611be85f830185611956565b611bf560208301846114a8565b9392505050565b5f81519050611c0a816116be565b92915050565b5f60208284031215611c2557611c24611412565b5b5f611c3284828501611bfc565b91505092915050565b5f82825260208201905092915050565b7f596f75206d7573742068617665206465706f73697473206772656174657220745f8201527f68616e207a65726f20746f207265717565737420636c61696d2061636365737360208201527f2e2e2e0000000000000000000000000000000000000000000000000000000000604082015250565b5f611ccb604383611c3b565b9150611cd682611c4b565b606082019050919050565b5f6020820190508181035f830152611cf881611cbf565b9050919050565b7f596f7527766520616c72656164792072657175657374656420616363657373205f8201527f746f20636c61696d2e0000000000000000000000000000000000000000000000602082015250565b5f611d59602983611c3b565b9150611d6482611cff565b604082019050919050565b5f6020820190508181035f830152611d8681611d4d565b9050919050565b7f436c61696d206973206e6f74206f70656e207965742e000000000000000000005f82015250565b5f611dc1601683611c3b565b9150611dcc82611d8d565b602082019050919050565b5f6020820190508181035f830152611dee81611db5565b9050919050565b7f57616974696e6720666f722061646d696e20617070726f76616c20746f20636c5f8201527f61696d2e2e2e0000000000000000000000000000000000000000000000000000602082015250565b5f611e4f602683611c3b565b9150611e5a82611df5565b604082019050919050565b5f6020820190508181035f830152611e7c81611e43565b9050919050565b7f436c61696d20616d6f756e7420697320696e76616c69642e00000000000000005f82015250565b5f611eb7601883611c3b565b9150611ec282611e83565b602082019050919050565b5f6020820190508181035f830152611ee481611eab565b9050919050565b7f4461696c7920636c61696d206c696d69742065786365656465640000000000005f82015250565b5f611f1f601a83611c3b565b9150611f2a82611eeb565b602082019050919050565b5f6020820190508181035f830152611f4c81611f13565b9050919050565b5f611f5d8261149f565b9150611f688361149f565b9250828203905081811115611f8057611f7f611ad7565b5b92915050565b5f819050919050565b611fa0611f9b8261185c565b611f86565b82525050565b5f611fb18284611f8f565b60208201915081905092915050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f611ff4600d83611c3b565b9150611fff82611fc0565b602082019050919050565b5f6020820190508181035f83015261202181611fe8565b9050919050565b7f4465706f736974206578636565647320736e617073686f742062616c616e63655f8201527f206f6620757365722e0000000000000000000000000000000000000000000000602082015250565b5f612082602983611c3b565b915061208d82612028565b604082019050919050565b5f6020820190508181035f8301526120af81612076565b9050919050565b5f6060820190506120c95f830186611956565b6120d66020830185611956565b6120e360408301846114a8565b949350505050565b5f6040820190506120fe5f8301856114a8565b61210b60208301846114a8565b939250505056fea26469706673582212208a2a919e6c8917f80985d8c1fde46da75bd0e3fbdfed45fde658f7978c33d0f364736f6c634300081b00330000000000000000000000001e077166c938ade2b3e4e4d58c58d8fb8e07eb7ff5bbf81e13242abf426c4c418b8faaa963e0050b4741f163bd566bd45fa114a3000000000000000000000000b6c0189080a6441caf056b856dd4d795b909c46000000000000000000000000078069e97c5a1c4a92da4c577dbcfd86cfd83da5300000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000068acdce0000000000000000000000000000000000000000000000000000000006853533c
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610171575f3560e01c806353473010116100dc5780638e1f81bb11610095578063b4c407111161006f578063b4c4071114610425578063d5d97e7814610441578063f2fde38b1461045f578063f7efd7241461047b57610171565b80638e1f81bb146103cb5780639a6dd716146103e9578063a9d740131461040757610171565b8063534730101461031957806354c838a9146103375780636b6d23d614610367578063715018a614610385578063786c12cb1461038f5780638da5cb5b146103ad57610171565b8063379607f51161012e578063379607f5146102355780633b7fcdca146102515780633dfb55551461028157806343518f3f146102b15780634783f0ef146102cd5780635185192d146102e957610171565b806301e637651461017557806306b091f9146101a55780630ba36dcd146101c15780631983558e146101f15780631c6190d6146101fb5780632211f42a14610219575b5f5ffd5b61018f600480360381019061018a9190611474565b610497565b60405161019c91906114b7565b60405180910390f35b6101bf60048036038101906101ba91906114fa565b61056c565b005b6101db60048036038101906101d69190611474565b6105fb565b6040516101e891906114b7565b60405180910390f35b6101f9610610565b005b610203610789565b60405161021091906114b7565b60405180910390f35b610233600480360381019061022e919061177d565b61078f565b005b61024f600480360381019061024a91906117f3565b6108c1565b005b61026b60048036038101906102669190611474565b610bd4565b60405161027891906114b7565b60405180910390f35b61029b600480360381019061029691906114fa565b610be9565b6040516102a891906114b7565b60405180910390f35b6102cb60048036038101906102c6919061181e565b610c09565b005b6102e760048036038101906102e2919061188f565b610cb7565b005b61030360048036038101906102fe9190611474565b610cc9565b60405161031091906118c9565b60405180910390f35b610321610ce6565b60405161032e91906114b7565b60405180910390f35b610351600480360381019061034c9190611474565b610cec565b60405161035e91906118c9565b60405180910390f35b61036f610d09565b60405161037c919061193d565b60405180910390f35b61038d610d2e565b005b610397610d41565b6040516103a491906114b7565b60405180910390f35b6103b5610ddd565b6040516103c29190611965565b60405180910390f35b6103d3610e04565b6040516103e091906114b7565b60405180910390f35b6103f1610e0a565b6040516103fe919061193d565b60405180910390f35b61040f610e2f565b60405161041c91906114b7565b60405180910390f35b61043f600480360381019061043a9190611a3e565b610e35565b005b610449611114565b60405161045691906114b7565b60405180910390f35b61047960048036038101906104749190611474565b61111a565b005b610495600480360381019061049091906117f3565b61119e565b005b5f5f5f90505b600a80549050811015610566575f600954600a83815481106104c2576104c1611aaa565b5b905f5260205f200154600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600a868154811061051d5761051c611aaa565b5b905f5260205f20015481526020019081526020015f205461053e9190611b04565b6105489190611b72565b905080836105569190611ba2565b925050808060010191505061049d565b50919050565b6105746111e7565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610598610ddd565b836040518363ffffffff1660e01b81526004016105b6929190611bd5565b6020604051808303815f875af11580156105d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f69190611c10565b505050565b600b602052805f5260405f205f915090505481565b5f61061a33610497565b1161065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190611ce1565b60405180910390fd5b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db90611d6f565b60405180910390fd5b6001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f5f60405161077f91906118c9565b60405180910390a2565b60085481565b6107976111e7565b5f5f90505b82518110156108bc578181815181106107b8576107b7611aaa565b5b6020026020010151600e5f8584815181106107d6576107d5611aaa565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508281815181106108405761083f611aaa565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f83838151811061089257610891611aaa565b5b60200260200101516040516108a791906118c9565b60405180910390a2808060010191505061079c565b505050565b6005544211610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90611dd7565b60405180910390fd5b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590611e65565b60405180910390fd5b61099733610497565b81600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546109e09190611ba2565b1115610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890611ecd565b60405180910390fd5b610a2961126e565b60045481600654610a3a9190611ba2565b1115610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7290611f35565b60405180910390fd5b8060065f828254610a8c9190611ba2565b9250508190555080600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610adf9190611ba2565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b42929190611bd5565b6020604051808303815f875af1158015610b5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b829190611c10565b503373ffffffffffffffffffffffffffffffffffffffff167fe2323fa72fc40846465d64f4b6ceb6716d38c6938c38fc238c4c07b7c3ecbb0082604051610bc991906114b7565b60405180910390a250565b600c602052805f5260405f205f915090505481565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b610c116111e7565b80600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f36a4cc28346d45c27d94c1f7cc837ce02d4a8c86c8deb752f88b2b28f2f1186f82604051610cab91906118c9565b60405180910390a25050565b610cbf6111e7565b8060018190555050565b600f602052805f5260405f205f915054906101000a900460ff1681565b60045481565b600e602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d366111e7565b610d3f5f61129c565b565b5f600854421115610dd4575f62093a8060085442610d5f9190611f53565b610d699190611b72565b90505f8103610d7d57612904915050610dda565b60018103610d90576128a0915050610dda565b60028103610da35761283c915050610dda565b60038103610db6576127d8915050610dda565b60048103610dc957612774915050610dda565b612710915050610dda565b61271090505b90565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b5f3382604051602001610e49929190611bd5565b60405160208183030381529060405280519060200120604051602001610e6f9190611fa6565b604051602081830303815290604052805190602001209050610e94846001548361135d565b610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca9061200a565b60405180910390fd5b8183600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610f1d9190611ba2565b1115610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612098565b60405180910390fd5b5f610f67610d41565b905083600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610fb59190611ba2565b9250508190555083600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546110179190611ba2565b9250508190555060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161107c939291906120b6565b6020604051808303815f875af1158015611098573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190611c10565b503373ffffffffffffffffffffffffffffffffffffffff167f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c437585836040516111059291906120eb565b60405180910390a25050505050565b60075481565b6111226111e7565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611192575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111899190611965565b60405180910390fd5b61119b8161129c565b50565b6111a66111e7565b806004819055507f6cd8635c4285386b9de2e59a4c1eaf32ad41f28ae64c308280217d7af51464e0816040516111dc91906114b7565b60405180910390a150565b6111ef611373565b73ffffffffffffffffffffffffffffffffffffffff1661120d610ddd565b73ffffffffffffffffffffffffffffffffffffffff161461126c57611230611373565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112639190611965565b60405180910390fd5b565b5f620151804261127e9190611b72565b9050600754811115611299575f600681905550806007819055505b50565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f82611369858461137a565b1490509392505050565b5f33905090565b5f5f8290505f5f90505b84518110156113c0576113b1828683815181106113a4576113a3611aaa565b5b60200260200101516113cb565b91508080600101915050611384565b508091505092915050565b5f8183106113e2576113dd82846113f5565b6113ed565b6113ec83836113f5565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114438261141a565b9050919050565b61145381611439565b811461145d575f5ffd5b50565b5f8135905061146e8161144a565b92915050565b5f6020828403121561148957611488611412565b5b5f61149684828501611460565b91505092915050565b5f819050919050565b6114b18161149f565b82525050565b5f6020820190506114ca5f8301846114a8565b92915050565b6114d98161149f565b81146114e3575f5ffd5b50565b5f813590506114f4816114d0565b92915050565b5f5f604083850312156115105761150f611412565b5b5f61151d85828601611460565b925050602061152e858286016114e6565b9150509250929050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115828261153c565b810181811067ffffffffffffffff821117156115a1576115a061154c565b5b80604052505050565b5f6115b3611409565b90506115bf8282611579565b919050565b5f67ffffffffffffffff8211156115de576115dd61154c565b5b602082029050602081019050919050565b5f5ffd5b5f611605611600846115c4565b6115aa565b90508083825260208201905060208402830185811115611628576116276115ef565b5b835b81811015611651578061163d8882611460565b84526020840193505060208101905061162a565b5050509392505050565b5f82601f83011261166f5761166e611538565b5b813561167f8482602086016115f3565b91505092915050565b5f67ffffffffffffffff8211156116a2576116a161154c565b5b602082029050602081019050919050565b5f8115159050919050565b6116c7816116b3565b81146116d1575f5ffd5b50565b5f813590506116e2816116be565b92915050565b5f6116fa6116f584611688565b6115aa565b9050808382526020820190506020840283018581111561171d5761171c6115ef565b5b835b81811015611746578061173288826116d4565b84526020840193505060208101905061171f565b5050509392505050565b5f82601f83011261176457611763611538565b5b81356117748482602086016116e8565b91505092915050565b5f5f6040838503121561179357611792611412565b5b5f83013567ffffffffffffffff8111156117b0576117af611416565b5b6117bc8582860161165b565b925050602083013567ffffffffffffffff8111156117dd576117dc611416565b5b6117e985828601611750565b9150509250929050565b5f6020828403121561180857611807611412565b5b5f611815848285016114e6565b91505092915050565b5f5f6040838503121561183457611833611412565b5b5f61184185828601611460565b9250506020611852858286016116d4565b9150509250929050565b5f819050919050565b61186e8161185c565b8114611878575f5ffd5b50565b5f8135905061188981611865565b92915050565b5f602082840312156118a4576118a3611412565b5b5f6118b18482850161187b565b91505092915050565b6118c3816116b3565b82525050565b5f6020820190506118dc5f8301846118ba565b92915050565b5f819050919050565b5f6119056119006118fb8461141a565b6118e2565b61141a565b9050919050565b5f611916826118eb565b9050919050565b5f6119278261190c565b9050919050565b6119378161191d565b82525050565b5f6020820190506119505f83018461192e565b92915050565b61195f81611439565b82525050565b5f6020820190506119785f830184611956565b92915050565b5f67ffffffffffffffff8211156119985761199761154c565b5b602082029050602081019050919050565b5f6119bb6119b68461197e565b6115aa565b905080838252602082019050602084028301858111156119de576119dd6115ef565b5b835b81811015611a0757806119f3888261187b565b8452602084019350506020810190506119e0565b5050509392505050565b5f82601f830112611a2557611a24611538565b5b8135611a358482602086016119a9565b91505092915050565b5f5f5f60608486031215611a5557611a54611412565b5b5f84013567ffffffffffffffff811115611a7257611a71611416565b5b611a7e86828701611a11565b9350506020611a8f868287016114e6565b9250506040611aa0868287016114e6565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b0e8261149f565b9150611b198361149f565b9250828202611b278161149f565b91508282048414831517611b3e57611b3d611ad7565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611b7c8261149f565b9150611b878361149f565b925082611b9757611b96611b45565b5b828204905092915050565b5f611bac8261149f565b9150611bb78361149f565b9250828201905080821115611bcf57611bce611ad7565b5b92915050565b5f604082019050611be85f830185611956565b611bf560208301846114a8565b9392505050565b5f81519050611c0a816116be565b92915050565b5f60208284031215611c2557611c24611412565b5b5f611c3284828501611bfc565b91505092915050565b5f82825260208201905092915050565b7f596f75206d7573742068617665206465706f73697473206772656174657220745f8201527f68616e207a65726f20746f207265717565737420636c61696d2061636365737360208201527f2e2e2e0000000000000000000000000000000000000000000000000000000000604082015250565b5f611ccb604383611c3b565b9150611cd682611c4b565b606082019050919050565b5f6020820190508181035f830152611cf881611cbf565b9050919050565b7f596f7527766520616c72656164792072657175657374656420616363657373205f8201527f746f20636c61696d2e0000000000000000000000000000000000000000000000602082015250565b5f611d59602983611c3b565b9150611d6482611cff565b604082019050919050565b5f6020820190508181035f830152611d8681611d4d565b9050919050565b7f436c61696d206973206e6f74206f70656e207965742e000000000000000000005f82015250565b5f611dc1601683611c3b565b9150611dcc82611d8d565b602082019050919050565b5f6020820190508181035f830152611dee81611db5565b9050919050565b7f57616974696e6720666f722061646d696e20617070726f76616c20746f20636c5f8201527f61696d2e2e2e0000000000000000000000000000000000000000000000000000602082015250565b5f611e4f602683611c3b565b9150611e5a82611df5565b604082019050919050565b5f6020820190508181035f830152611e7c81611e43565b9050919050565b7f436c61696d20616d6f756e7420697320696e76616c69642e00000000000000005f82015250565b5f611eb7601883611c3b565b9150611ec282611e83565b602082019050919050565b5f6020820190508181035f830152611ee481611eab565b9050919050565b7f4461696c7920636c61696d206c696d69742065786365656465640000000000005f82015250565b5f611f1f601a83611c3b565b9150611f2a82611eeb565b602082019050919050565b5f6020820190508181035f830152611f4c81611f13565b9050919050565b5f611f5d8261149f565b9150611f688361149f565b9250828203905081811115611f8057611f7f611ad7565b5b92915050565b5f819050919050565b611fa0611f9b8261185c565b611f86565b82525050565b5f611fb18284611f8f565b60208201915081905092915050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f611ff4600d83611c3b565b9150611fff82611fc0565b602082019050919050565b5f6020820190508181035f83015261202181611fe8565b9050919050565b7f4465706f736974206578636565647320736e617073686f742062616c616e63655f8201527f206f6620757365722e0000000000000000000000000000000000000000000000602082015250565b5f612082602983611c3b565b915061208d82612028565b604082019050919050565b5f6020820190508181035f8301526120af81612076565b9050919050565b5f6060820190506120c95f830186611956565b6120d66020830185611956565b6120e360408301846114a8565b949350505050565b5f6040820190506120fe5f8301856114a8565b61210b60208301846114a8565b939250505056fea26469706673582212208a2a919e6c8917f80985d8c1fde46da75bd0e3fbdfed45fde658f7978c33d0f364736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001e077166c938ade2b3e4e4d58c58d8fb8e07eb7ff5bbf81e13242abf426c4c418b8faaa963e0050b4741f163bd566bd45fa114a3000000000000000000000000b6c0189080a6441caf056b856dd4d795b909c46000000000000000000000000078069e97c5a1c4a92da4c577dbcfd86cfd83da5300000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000068acdce0000000000000000000000000000000000000000000000000000000006853533c
-----Decoded View---------------
Arg [0] : owner (address): 0x1e077166C938adE2b3e4e4D58C58D8Fb8e07eb7F
Arg [1] : _root (bytes32): 0xf5bbf81e13242abf426c4c418b8faaa963e0050b4741f163bd566bd45fa114a3
Arg [2] : _oldTokenAddress (address): 0xb6c0189080a6441CAF056B856Dd4d795B909C460
Arg [3] : _newTokenAddress (address): 0x78069E97C5a1c4a92da4C577DBCfd86CFd83da53
Arg [4] : _limitPerDay (uint256): 1000000000000000000000000
Arg [5] : _globalLock (uint256): 1756159200
Arg [6] : _bonusStartDate (uint256): 1750291260
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000001e077166c938ade2b3e4e4d58c58d8fb8e07eb7f
Arg [1] : f5bbf81e13242abf426c4c418b8faaa963e0050b4741f163bd566bd45fa114a3
Arg [2] : 000000000000000000000000b6c0189080a6441caf056b856dd4d795b909c460
Arg [3] : 00000000000000000000000078069e97c5a1c4a92da4c577dbcfd86cfd83da53
Arg [4] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000068acdce0
Arg [6] : 000000000000000000000000000000000000000000000000000000006853533c
Deployed Bytecode Sourcemap
293:5363:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4112:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4771:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;708:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3109:401;;;:::i;:::-;;558:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5351:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2491:610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;762:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;815:76;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5162:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4913:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;949:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;423:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;898:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;395:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2293:101:0;;;:::i;:::-;;3518:586:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1638:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;456:25:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;367:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;488:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1754:729;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;522:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2543:215:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5012:142:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4112:413;4180:21;4219:9;4231:1;4219:13;;4214:273;4238:16;:23;;;;4234:1;:27;4214:273;;;4283:30;4409:11;;4386:16;4403:1;4386:19;;;;;;;;:::i;:::-;;;;;;;;;;4335:21;:27;4357:4;4335:27;;;;;;;;;;;;;;;:48;4363:16;4380:1;4363:19;;;;;;;;:::i;:::-;;;;;;;;;;4335:48;;;;;;;;;;;;:70;;;;:::i;:::-;4334:86;;;;:::i;:::-;4283:138;;4453:22;4436:39;;;;;:::i;:::-;;;4268:219;4263:3;;;;;;;4214:273;;;;4112:413;;;:::o;4771:134::-;1531:13:0;:11;:13::i;:::-;4864:6:5::1;4857:23;;;4881:7;:5;:7::i;:::-;4890:6;4857:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4771:134:::0;;:::o;708:47::-;;;;;;;;;;;;;;;;;:::o;3109:401::-;3217:1;3179:35;3203:10;3179:23;:35::i;:::-;:39;3157:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;3333:14;:26;3348:10;3333:26;;;;;;;;;;;;;;;;;;;;;;;;;3332:27;3324:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3445:4;3416:14;:26;3431:10;3416:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;3484:10;3465:37;;;3496:5;3465:37;;;;;;:::i;:::-;;;;;;;;3109:401::o;558:29::-;;;;:::o;5351:302::-;1531:13:0;:11;:13::i;:::-;5469:9:5::1;5481:1;5469:13;;5464:182;5488:6;:13;5484:1;:17;5464:182;;;5549:14;5564:1;5549:17;;;;;;;;:::i;:::-;;;;;;;;5523:12;:23;5536:6;5543:1;5536:9;;;;;;;;:::i;:::-;;;;;;;;5523:23;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;5605:6;5612:1;5605:9;;;;;;;;:::i;:::-;;;;;;;;5586:48;;;5616:14;5631:1;5616:17;;;;;;;;:::i;:::-;;;;;;;;5586:48;;;;;;:::i;:::-;;;;;;;;5503:3;;;;;;;5464:182;;;;5351:302:::0;;:::o;2491:610::-;2566:10;;2548:15;:28;2540:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2622:12;:24;2635:10;2622:24;;;;;;;;;;;;;;;;;;;;;;;;;2614:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2744:35;2768:10;2744:23;:35::i;:::-;2734:6;2708:11;:23;2720:10;2708:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:71;;2700:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2819:19;:17;:19::i;:::-;2882:11;;2872:6;2857:12;;:21;;;;:::i;:::-;:36;;2849:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2951:6;2935:12;;:22;;;;;;;:::i;:::-;;;;;;;;2995:6;2968:11;:23;2980:10;2968:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;3012:7;;;;;;;;;;;:16;;;3029:10;3041:6;3012:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3074:10;3064:29;;;3086:6;3064:29;;;;;;:::i;:::-;;;;;;;;2491:610;:::o;762:46::-;;;;;;;;;;;;;;;;;:::o;815:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5162:181::-;1531:13:0;:11;:13::i;:::-;5268:12:5::1;5246;:19;5259:5;5246:19;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;5315:5;5296:39;;;5322:12;5296:39;;;;;;:::i;:::-;;;;;;;;5162:181:::0;;:::o;4913:91::-;1531:13:0;:11;:13::i;:::-;4991:5:5::1;4984:4;:12;;;;4913:91:::0;:::o;949:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;423:26::-;;;;:::o;898:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;395:21::-;;;;;;;;;;;;;:::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;3518:586:5:-;3569:21;3625:14;;3607:15;:32;3603:494;;;3656:23;3719:7;3701:14;;3683:15;:32;;;;:::i;:::-;3682:44;;;;:::i;:::-;3656:70;;3766:1;3747:15;:20;3743:38;;3776:5;3769:12;;;;;3743:38;3825:1;3806:15;:20;3802:38;;3835:5;3828:12;;;;;3802:38;3878:1;3859:15;:20;3855:38;;3888:5;3881:12;;;;;3855:38;3931:1;3912:15;:20;3908:38;;3941:5;3934:12;;;;;3908:38;3984:1;3965:15;:20;3961:38;;3994:5;3987:12;;;;;3961:38;4021:5;4014:12;;;;;3603:494;4073:5;4066:12;;3518:586;;:::o;1638:85:0:-;1684:7;1710:6;;;;;;;;;;;1703:13;;1638:85;:::o;456:25:5:-;;;;:::o;367:21::-;;;;;;;;;;;;;:::o;488:27::-;;;;:::o;1754:729::-;1860:12;1919:10;1931:14;1908:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1898:49;;;;;;1885:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;1875:74;;;;;;1860:89;;1968:37;1987:5;1994:4;;2000;1968:18;:37::i;:::-;1960:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2086:14;2069:13;2042:12;:24;2055:10;2042:24;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:58;;2034:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;2159:21;2183:20;:18;:20::i;:::-;2159:44;;2242:13;2214:12;:24;2227:10;2214:24;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;2318:13;2266:21;:33;2288:10;2266:33;;;;;;;;;;;;;;;:48;2300:13;2266:48;;;;;;;;;;;;:65;;;;;;;:::i;:::-;;;;;;;;2344:7;;;;;;;;;;;:20;;;2365:10;2385:4;2392:13;2344:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2434:10;2422:53;;;2446:13;2461;2422:53;;;;;;;:::i;:::-;;;;;;;;1849:634;;1754:729;;;:::o;522:29::-;;;;:::o;2543:215:0:-;1531:13;:11;:13::i;:::-;2647:1:::1;2627:22;;:8;:22;;::::0;2623:91:::1;;2700:1;2672:31;;;;;;;;;;;:::i;:::-;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;5012:142:5:-;1531:13:0;:11;:13::i;:::-;5099:6:5::1;5085:11;:20;;;;5121:25;5139:6;5121:25;;;;;;:::i;:::-;;;;;;;;5012:142:::0;:::o;1796:162:0:-;1866:12;:10;:12::i;:::-;1855:23;;:7;:5;:7::i;:::-;:23;;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;;;;;;;;;;:::i;:::-;;;;;;;;1851:101;1796:162::o;4533:230:5:-;4582:18;4621:6;4603:15;:24;;;;:::i;:::-;4582:45;;4655:14;;4642:10;:27;4638:118;;;4701:1;4686:12;:16;;;;4734:10;4717:14;:27;;;;4638:118;4571:192;4533:230::o;2912:187:0:-;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;1902:154:4:-;1993:4;2045;2016:25;2029:5;2036:4;2016:12;:25::i;:::-;:33;2009:40;;1902:154;;;;;:::o;656:96:2:-;709:7;735:10;728:17;;656:96;:::o;2457:308:4:-;2540:7;2559:20;2582:4;2559:27;;2601:9;2613:1;2601:13;;2596:134;2620:5;:12;2616:1;:16;2596:134;;;2668:51;2696:12;2710:5;2716:1;2710:8;;;;;;;;:::i;:::-;;;;;;;;2668:27;:51::i;:::-;2653:66;;2634:3;;;;;;;2596:134;;;;2746:12;2739:19;;;2457:308;;;;:::o;504:167:3:-;579:7;609:1;605;:5;:59;;640:24;659:1;662;640:18;:24::i;:::-;605:59;;;613:24;632:1;635;613:18;:24::i;:::-;605:59;598:66;;504:167;;;;:::o;791:239::-;864:13;941:1;935:4;928:15;969:1;963:4;956:15;1009:4;1003;993:21;984:30;;791:239;;;;:::o;7:75:6:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:474::-;1952:6;1960;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:53;2205:7;2196:6;2185:9;2181:22;2160:53;:::i;:::-;2150:63;;2106:117;2262:2;2288:53;2333:7;2324:6;2313:9;2309:22;2288:53;:::i;:::-;2278:63;;2233:118;1884:474;;;;;:::o;2364:117::-;2473:1;2470;2463:12;2487:102;2528:6;2579:2;2575:7;2570:2;2563:5;2559:14;2555:28;2545:38;;2487:102;;;:::o;2595:180::-;2643:77;2640:1;2633:88;2740:4;2737:1;2730:15;2764:4;2761:1;2754:15;2781:281;2864:27;2886:4;2864:27;:::i;:::-;2856:6;2852:40;2994:6;2982:10;2979:22;2958:18;2946:10;2943:34;2940:62;2937:88;;;3005:18;;:::i;:::-;2937:88;3045:10;3041:2;3034:22;2824:238;2781:281;;:::o;3068:129::-;3102:6;3129:20;;:::i;:::-;3119:30;;3158:33;3186:4;3178:6;3158:33;:::i;:::-;3068:129;;;:::o;3203:311::-;3280:4;3370:18;3362:6;3359:30;3356:56;;;3392:18;;:::i;:::-;3356:56;3442:4;3434:6;3430:17;3422:25;;3502:4;3496;3492:15;3484:23;;3203:311;;;:::o;3520:117::-;3629:1;3626;3619:12;3660:710;3756:5;3781:81;3797:64;3854:6;3797:64;:::i;:::-;3781:81;:::i;:::-;3772:90;;3882:5;3911:6;3904:5;3897:21;3945:4;3938:5;3934:16;3927:23;;3998:4;3990:6;3986:17;3978:6;3974:30;4027:3;4019:6;4016:15;4013:122;;;4046:79;;:::i;:::-;4013:122;4161:6;4144:220;4178:6;4173:3;4170:15;4144:220;;;4253:3;4282:37;4315:3;4303:10;4282:37;:::i;:::-;4277:3;4270:50;4349:4;4344:3;4340:14;4333:21;;4220:144;4204:4;4199:3;4195:14;4188:21;;4144:220;;;4148:21;3762:608;;3660:710;;;;;:::o;4393:370::-;4464:5;4513:3;4506:4;4498:6;4494:17;4490:27;4480:122;;4521:79;;:::i;:::-;4480:122;4638:6;4625:20;4663:94;4753:3;4745:6;4738:4;4730:6;4726:17;4663:94;:::i;:::-;4654:103;;4470:293;4393:370;;;;:::o;4769:308::-;4843:4;4933:18;4925:6;4922:30;4919:56;;;4955:18;;:::i;:::-;4919:56;5005:4;4997:6;4993:17;4985:25;;5065:4;5059;5055:15;5047:23;;4769:308;;;:::o;5083:90::-;5117:7;5160:5;5153:13;5146:21;5135:32;;5083:90;;;:::o;5179:116::-;5249:21;5264:5;5249:21;:::i;:::-;5242:5;5239:32;5229:60;;5285:1;5282;5275:12;5229:60;5179:116;:::o;5301:133::-;5344:5;5382:6;5369:20;5360:29;;5398:30;5422:5;5398:30;:::i;:::-;5301:133;;;;:::o;5454:701::-;5547:5;5572:78;5588:61;5642:6;5588:61;:::i;:::-;5572:78;:::i;:::-;5563:87;;5670:5;5699:6;5692:5;5685:21;5733:4;5726:5;5722:16;5715:23;;5786:4;5778:6;5774:17;5766:6;5762:30;5815:3;5807:6;5804:15;5801:122;;;5834:79;;:::i;:::-;5801:122;5949:6;5932:217;5966:6;5961:3;5958:15;5932:217;;;6041:3;6070:34;6100:3;6088:10;6070:34;:::i;:::-;6065:3;6058:47;6134:4;6129:3;6125:14;6118:21;;6008:141;5992:4;5987:3;5983:14;5976:21;;5932:217;;;5936:21;5553:602;;5454:701;;;;;:::o;6175:364::-;6243:5;6292:3;6285:4;6277:6;6273:17;6269:27;6259:122;;6300:79;;:::i;:::-;6259:122;6417:6;6404:20;6442:91;6529:3;6521:6;6514:4;6506:6;6502:17;6442:91;:::i;:::-;6433:100;;6249:290;6175:364;;;;:::o;6545:888::-;6660:6;6668;6717:2;6705:9;6696:7;6692:23;6688:32;6685:119;;;6723:79;;:::i;:::-;6685:119;6871:1;6860:9;6856:17;6843:31;6901:18;6893:6;6890:30;6887:117;;;6923:79;;:::i;:::-;6887:117;7028:78;7098:7;7089:6;7078:9;7074:22;7028:78;:::i;:::-;7018:88;;6814:302;7183:2;7172:9;7168:18;7155:32;7214:18;7206:6;7203:30;7200:117;;;7236:79;;:::i;:::-;7200:117;7341:75;7408:7;7399:6;7388:9;7384:22;7341:75;:::i;:::-;7331:85;;7126:300;6545:888;;;;;:::o;7439:329::-;7498:6;7547:2;7535:9;7526:7;7522:23;7518:32;7515:119;;;7553:79;;:::i;:::-;7515:119;7673:1;7698:53;7743:7;7734:6;7723:9;7719:22;7698:53;:::i;:::-;7688:63;;7644:117;7439:329;;;;:::o;7774:468::-;7839:6;7847;7896:2;7884:9;7875:7;7871:23;7867:32;7864:119;;;7902:79;;:::i;:::-;7864:119;8022:1;8047:53;8092:7;8083:6;8072:9;8068:22;8047:53;:::i;:::-;8037:63;;7993:117;8149:2;8175:50;8217:7;8208:6;8197:9;8193:22;8175:50;:::i;:::-;8165:60;;8120:115;7774:468;;;;;:::o;8248:77::-;8285:7;8314:5;8303:16;;8248:77;;;:::o;8331:122::-;8404:24;8422:5;8404:24;:::i;:::-;8397:5;8394:35;8384:63;;8443:1;8440;8433:12;8384:63;8331:122;:::o;8459:139::-;8505:5;8543:6;8530:20;8521:29;;8559:33;8586:5;8559:33;:::i;:::-;8459:139;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:109::-;9020:21;9035:5;9020:21;:::i;:::-;9015:3;9008:34;8939:109;;:::o;9054:210::-;9141:4;9179:2;9168:9;9164:18;9156:26;;9192:65;9254:1;9243:9;9239:17;9230:6;9192:65;:::i;:::-;9054:210;;;;:::o;9270:60::-;9298:3;9319:5;9312:12;;9270:60;;;:::o;9336:142::-;9386:9;9419:53;9437:34;9446:24;9464:5;9446:24;:::i;:::-;9437:34;:::i;:::-;9419:53;:::i;:::-;9406:66;;9336:142;;;:::o;9484:126::-;9534:9;9567:37;9598:5;9567:37;:::i;:::-;9554:50;;9484:126;;;:::o;9616:140::-;9680:9;9713:37;9744:5;9713:37;:::i;:::-;9700:50;;9616:140;;;:::o;9762:159::-;9863:51;9908:5;9863:51;:::i;:::-;9858:3;9851:64;9762:159;;:::o;9927:250::-;10034:4;10072:2;10061:9;10057:18;10049:26;;10085:85;10167:1;10156:9;10152:17;10143:6;10085:85;:::i;:::-;9927:250;;;;:::o;10183:118::-;10270:24;10288:5;10270:24;:::i;:::-;10265:3;10258:37;10183:118;;:::o;10307:222::-;10400:4;10438:2;10427:9;10423:18;10415:26;;10451:71;10519:1;10508:9;10504:17;10495:6;10451:71;:::i;:::-;10307:222;;;;:::o;10535:311::-;10612:4;10702:18;10694:6;10691:30;10688:56;;;10724:18;;:::i;:::-;10688:56;10774:4;10766:6;10762:17;10754:25;;10834:4;10828;10824:15;10816:23;;10535:311;;;:::o;10869:710::-;10965:5;10990:81;11006:64;11063:6;11006:64;:::i;:::-;10990:81;:::i;:::-;10981:90;;11091:5;11120:6;11113:5;11106:21;11154:4;11147:5;11143:16;11136:23;;11207:4;11199:6;11195:17;11187:6;11183:30;11236:3;11228:6;11225:15;11222:122;;;11255:79;;:::i;:::-;11222:122;11370:6;11353:220;11387:6;11382:3;11379:15;11353:220;;;11462:3;11491:37;11524:3;11512:10;11491:37;:::i;:::-;11486:3;11479:50;11558:4;11553:3;11549:14;11542:21;;11429:144;11413:4;11408:3;11404:14;11397:21;;11353:220;;;11357:21;10971:608;;10869:710;;;;;:::o;11602:370::-;11673:5;11722:3;11715:4;11707:6;11703:17;11699:27;11689:122;;11730:79;;:::i;:::-;11689:122;11847:6;11834:20;11872:94;11962:3;11954:6;11947:4;11939:6;11935:17;11872:94;:::i;:::-;11863:103;;11679:293;11602:370;;;;:::o;11978:829::-;12080:6;12088;12096;12145:2;12133:9;12124:7;12120:23;12116:32;12113:119;;;12151:79;;:::i;:::-;12113:119;12299:1;12288:9;12284:17;12271:31;12329:18;12321:6;12318:30;12315:117;;;12351:79;;:::i;:::-;12315:117;12456:78;12526:7;12517:6;12506:9;12502:22;12456:78;:::i;:::-;12446:88;;12242:302;12583:2;12609:53;12654:7;12645:6;12634:9;12630:22;12609:53;:::i;:::-;12599:63;;12554:118;12711:2;12737:53;12782:7;12773:6;12762:9;12758:22;12737:53;:::i;:::-;12727:63;;12682:118;11978:829;;;;;:::o;12813:180::-;12861:77;12858:1;12851:88;12958:4;12955:1;12948:15;12982:4;12979:1;12972:15;12999:180;13047:77;13044:1;13037:88;13144:4;13141:1;13134:15;13168:4;13165:1;13158:15;13185:410;13225:7;13248:20;13266:1;13248:20;:::i;:::-;13243:25;;13282:20;13300:1;13282:20;:::i;:::-;13277:25;;13337:1;13334;13330:9;13359:30;13377:11;13359:30;:::i;:::-;13348:41;;13538:1;13529:7;13525:15;13522:1;13519:22;13499:1;13492:9;13472:83;13449:139;;13568:18;;:::i;:::-;13449:139;13233:362;13185:410;;;;:::o;13601:180::-;13649:77;13646:1;13639:88;13746:4;13743:1;13736:15;13770:4;13767:1;13760:15;13787:185;13827:1;13844:20;13862:1;13844:20;:::i;:::-;13839:25;;13878:20;13896:1;13878:20;:::i;:::-;13873:25;;13917:1;13907:35;;13922:18;;:::i;:::-;13907:35;13964:1;13961;13957:9;13952:14;;13787:185;;;;:::o;13978:191::-;14018:3;14037:20;14055:1;14037:20;:::i;:::-;14032:25;;14071:20;14089:1;14071:20;:::i;:::-;14066:25;;14114:1;14111;14107:9;14100:16;;14135:3;14132:1;14129:10;14126:36;;;14142:18;;:::i;:::-;14126:36;13978:191;;;;:::o;14175:332::-;14296:4;14334:2;14323:9;14319:18;14311:26;;14347:71;14415:1;14404:9;14400:17;14391:6;14347:71;:::i;:::-;14428:72;14496:2;14485:9;14481:18;14472:6;14428:72;:::i;:::-;14175:332;;;;;:::o;14513:137::-;14567:5;14598:6;14592:13;14583:22;;14614:30;14638:5;14614:30;:::i;:::-;14513:137;;;;:::o;14656:345::-;14723:6;14772:2;14760:9;14751:7;14747:23;14743:32;14740:119;;;14778:79;;:::i;:::-;14740:119;14898:1;14923:61;14976:7;14967:6;14956:9;14952:22;14923:61;:::i;:::-;14913:71;;14869:125;14656:345;;;;:::o;15007:169::-;15091:11;15125:6;15120:3;15113:19;15165:4;15160:3;15156:14;15141:29;;15007:169;;;;:::o;15182:291::-;15322:34;15318:1;15310:6;15306:14;15299:58;15391:34;15386:2;15378:6;15374:15;15367:59;15460:5;15455:2;15447:6;15443:15;15436:30;15182:291;:::o;15479:366::-;15621:3;15642:67;15706:2;15701:3;15642:67;:::i;:::-;15635:74;;15718:93;15807:3;15718:93;:::i;:::-;15836:2;15831:3;15827:12;15820:19;;15479:366;;;:::o;15851:419::-;16017:4;16055:2;16044:9;16040:18;16032:26;;16104:9;16098:4;16094:20;16090:1;16079:9;16075:17;16068:47;16132:131;16258:4;16132:131;:::i;:::-;16124:139;;15851:419;;;:::o;16276:228::-;16416:34;16412:1;16404:6;16400:14;16393:58;16485:11;16480:2;16472:6;16468:15;16461:36;16276:228;:::o;16510:366::-;16652:3;16673:67;16737:2;16732:3;16673:67;:::i;:::-;16666:74;;16749:93;16838:3;16749:93;:::i;:::-;16867:2;16862:3;16858:12;16851:19;;16510:366;;;:::o;16882:419::-;17048:4;17086:2;17075:9;17071:18;17063:26;;17135:9;17129:4;17125:20;17121:1;17110:9;17106:17;17099:47;17163:131;17289:4;17163:131;:::i;:::-;17155:139;;16882:419;;;:::o;17307:172::-;17447:24;17443:1;17435:6;17431:14;17424:48;17307:172;:::o;17485:366::-;17627:3;17648:67;17712:2;17707:3;17648:67;:::i;:::-;17641:74;;17724:93;17813:3;17724:93;:::i;:::-;17842:2;17837:3;17833:12;17826:19;;17485:366;;;:::o;17857:419::-;18023:4;18061:2;18050:9;18046:18;18038:26;;18110:9;18104:4;18100:20;18096:1;18085:9;18081:17;18074:47;18138:131;18264:4;18138:131;:::i;:::-;18130:139;;17857:419;;;:::o;18282:225::-;18422:34;18418:1;18410:6;18406:14;18399:58;18491:8;18486:2;18478:6;18474:15;18467:33;18282:225;:::o;18513:366::-;18655:3;18676:67;18740:2;18735:3;18676:67;:::i;:::-;18669:74;;18752:93;18841:3;18752:93;:::i;:::-;18870:2;18865:3;18861:12;18854:19;;18513:366;;;:::o;18885:419::-;19051:4;19089:2;19078:9;19074:18;19066:26;;19138:9;19132:4;19128:20;19124:1;19113:9;19109:17;19102:47;19166:131;19292:4;19166:131;:::i;:::-;19158:139;;18885:419;;;:::o;19310:174::-;19450:26;19446:1;19438:6;19434:14;19427:50;19310:174;:::o;19490:366::-;19632:3;19653:67;19717:2;19712:3;19653:67;:::i;:::-;19646:74;;19729:93;19818:3;19729:93;:::i;:::-;19847:2;19842:3;19838:12;19831:19;;19490:366;;;:::o;19862:419::-;20028:4;20066:2;20055:9;20051:18;20043:26;;20115:9;20109:4;20105:20;20101:1;20090:9;20086:17;20079:47;20143:131;20269:4;20143:131;:::i;:::-;20135:139;;19862:419;;;:::o;20287:176::-;20427:28;20423:1;20415:6;20411:14;20404:52;20287:176;:::o;20469:366::-;20611:3;20632:67;20696:2;20691:3;20632:67;:::i;:::-;20625:74;;20708:93;20797:3;20708:93;:::i;:::-;20826:2;20821:3;20817:12;20810:19;;20469:366;;;:::o;20841:419::-;21007:4;21045:2;21034:9;21030:18;21022:26;;21094:9;21088:4;21084:20;21080:1;21069:9;21065:17;21058:47;21122:131;21248:4;21122:131;:::i;:::-;21114:139;;20841:419;;;:::o;21266:194::-;21306:4;21326:20;21344:1;21326:20;:::i;:::-;21321:25;;21360:20;21378:1;21360:20;:::i;:::-;21355:25;;21404:1;21401;21397:9;21389:17;;21428:1;21422:4;21419:11;21416:37;;;21433:18;;:::i;:::-;21416:37;21266:194;;;;:::o;21466:79::-;21505:7;21534:5;21523:16;;21466:79;;;:::o;21551:157::-;21656:45;21676:24;21694:5;21676:24;:::i;:::-;21656:45;:::i;:::-;21651:3;21644:58;21551:157;;:::o;21714:256::-;21826:3;21841:75;21912:3;21903:6;21841:75;:::i;:::-;21941:2;21936:3;21932:12;21925:19;;21961:3;21954:10;;21714:256;;;;:::o;21976:163::-;22116:15;22112:1;22104:6;22100:14;22093:39;21976:163;:::o;22145:366::-;22287:3;22308:67;22372:2;22367:3;22308:67;:::i;:::-;22301:74;;22384:93;22473:3;22384:93;:::i;:::-;22502:2;22497:3;22493:12;22486:19;;22145:366;;;:::o;22517:419::-;22683:4;22721:2;22710:9;22706:18;22698:26;;22770:9;22764:4;22760:20;22756:1;22745:9;22741:17;22734:47;22798:131;22924:4;22798:131;:::i;:::-;22790:139;;22517:419;;;:::o;22942:228::-;23082:34;23078:1;23070:6;23066:14;23059:58;23151:11;23146:2;23138:6;23134:15;23127:36;22942:228;:::o;23176:366::-;23318:3;23339:67;23403:2;23398:3;23339:67;:::i;:::-;23332:74;;23415:93;23504:3;23415:93;:::i;:::-;23533:2;23528:3;23524:12;23517:19;;23176:366;;;:::o;23548:419::-;23714:4;23752:2;23741:9;23737:18;23729:26;;23801:9;23795:4;23791:20;23787:1;23776:9;23772:17;23765:47;23829:131;23955:4;23829:131;:::i;:::-;23821:139;;23548:419;;;:::o;23973:442::-;24122:4;24160:2;24149:9;24145:18;24137:26;;24173:71;24241:1;24230:9;24226:17;24217:6;24173:71;:::i;:::-;24254:72;24322:2;24311:9;24307:18;24298:6;24254:72;:::i;:::-;24336;24404:2;24393:9;24389:18;24380:6;24336:72;:::i;:::-;23973:442;;;;;;:::o;24421:332::-;24542:4;24580:2;24569:9;24565:18;24557:26;;24593:71;24661:1;24650:9;24646:17;24637:6;24593:71;:::i;:::-;24674:72;24742:2;24731:9;24727:18;24718:6;24674:72;:::i;:::-;24421:332;;;;;:::o
Swarm Source
ipfs://8a2a919e6c8917f80985d8c1fde46da75bd0e3fbdfed45fde658f7978c33d0f3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 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.