Latest 25 from a total of 1,810 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 20076024 | 633 days ago | IN | 0 ETH | 0.00286544 | ||||
| Claim | 20075542 | 633 days ago | IN | 0 ETH | 0.00156533 | ||||
| Claim | 20072828 | 633 days ago | IN | 0 ETH | 0.00077248 | ||||
| Claim | 20072269 | 633 days ago | IN | 0 ETH | 0.00062676 | ||||
| Claim | 20071916 | 633 days ago | IN | 0 ETH | 0.00062688 | ||||
| Claim | 20070600 | 633 days ago | IN | 0 ETH | 0.00115083 | ||||
| Claim | 20070176 | 633 days ago | IN | 0 ETH | 0.00138894 | ||||
| Claim | 20070154 | 633 days ago | IN | 0 ETH | 0.00159011 | ||||
| Claim | 20068688 | 634 days ago | IN | 0 ETH | 0.00130608 | ||||
| Claim | 20068082 | 634 days ago | IN | 0 ETH | 0.00099196 | ||||
| Claim | 20067838 | 634 days ago | IN | 0 ETH | 0.00098708 | ||||
| Claim | 20067678 | 634 days ago | IN | 0 ETH | 0.00066973 | ||||
| Claim | 20067225 | 634 days ago | IN | 0 ETH | 0.00065183 | ||||
| Claim | 20066449 | 634 days ago | IN | 0 ETH | 0.00053684 | ||||
| Claim | 20062810 | 634 days ago | IN | 0 ETH | 0.00154066 | ||||
| Claim | 20062630 | 634 days ago | IN | 0 ETH | 0.00157916 | ||||
| Claim | 20059846 | 635 days ago | IN | 0 ETH | 0.00053631 | ||||
| Claim | 20059724 | 635 days ago | IN | 0 ETH | 0.00048227 | ||||
| Claim | 20059102 | 635 days ago | IN | 0 ETH | 0.0003587 | ||||
| Claim | 20058594 | 635 days ago | IN | 0 ETH | 0.00037017 | ||||
| Claim | 20057913 | 635 days ago | IN | 0 ETH | 0.00048329 | ||||
| Claim | 20057806 | 635 days ago | IN | 0 ETH | 0.00054617 | ||||
| Claim | 20057682 | 635 days ago | IN | 0 ETH | 0.00036143 | ||||
| Claim | 20057522 | 635 days ago | IN | 0 ETH | 0.00048221 | ||||
| Claim | 20057085 | 635 days ago | IN | 0 ETH | 0.0006902 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
IncentiveDistributor
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Owned} from "@solmate/auth/Owned.sol";
contract IncentiveDistributor is Owned {
using SafeERC20 for IERC20;
// merkleroot -> bool
mapping(bytes32 => bool) public merkleAvailable;
//merkleroot -> user address -> bool
mapping(bytes32 => mapping(address => bool)) public claimed;
event RegisteredMerkleTree(bytes32 rootHash);
event UnRegisteredMerkleTree(bytes32 rootHash);
event Claimed(bytes32 rootHash, address user, address token, uint256 balance);
constructor(address _owner) Owned(_owner) {}
function registerMerkleTree(bytes32 _rootHash) external onlyOwner {
require(!merkleAvailable[_rootHash], "Already registered");
merkleAvailable[_rootHash] = true;
emit RegisteredMerkleTree(_rootHash);
}
function unregisterMerkleTree(bytes32 _rootHash) external onlyOwner {
require(merkleAvailable[_rootHash], "Not registered");
merkleAvailable[_rootHash] = false;
emit UnRegisteredMerkleTree(_rootHash);
}
function claim(
address _to,
bytes32[] calldata _rootHashes,
address[] calldata _tokens,
uint256[] calldata _balances,
bytes32[][] calldata _merkleProofs
) external {
uint256 length = _rootHashes.length;
require(_tokens.length == length, "Incorrect array length");
require(_balances.length == length, "Incorrect array length");
require(_merkleProofs.length == length, "Incorrect array length");
for (uint256 i; i < length; ++i) {
_claim(_to, _tokens[i], _balances[i], _rootHashes[i], _merkleProofs[i]);
_pay(_to, _tokens[i], _balances[i]);
}
}
function verifyClaim(
address _to,
address _token,
uint256 _balance,
bytes32 _rootHash,
bytes32[] calldata _merkleProof
) external view returns (bool) {
require(merkleAvailable[_rootHash] == true, "Not available merkle root");
return _verifyClaim(_to, _token, _balance, _rootHash, _merkleProof);
}
function withdraw(address _to, address _token, uint256 _balance) external onlyOwner {
uint256 tokenAmount = _balance;
if (_balance == 0) {
tokenAmount = IERC20(_token).balanceOf(address(this));
}
IERC20(_token).safeTransfer(_to, tokenAmount);
}
function _claim(address _to, address _token, uint256 _balance, bytes32 _rootHash, bytes32[] calldata _merkleProof)
private
{
require(merkleAvailable[_rootHash] == true, "Not available merkle root");
require(!claimed[_rootHash][_to], "It has already claimed");
require(_verifyClaim(_to, _token, _balance, _rootHash, _merkleProof), "Incorrect merkle proof");
claimed[_rootHash][_to] = true;
emit Claimed(_rootHash, _to, _token, _balance);
}
function _verifyClaim(
address _to,
address _token,
uint256 _balance,
bytes32 _rootHash,
bytes32[] calldata _merkleProof
) private pure returns (bool) {
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(_to, _token, _balance))));
return MerkleProof.verify(_merkleProof, _rootHash, leaf);
}
function _pay(address _to, address _token, uint256 _balance) private {
require(_balance > 0, "No balance would be transferred");
IERC20(_token).safeTransfer(_to, _balance);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event OwnershipTransferred(address indexed user, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
OWNERSHIP STORAGE
//////////////////////////////////////////////////////////////*/
address public owner;
modifier onlyOwner() virtual {
require(msg.sender == owner, "UNAUTHORIZED");
_;
}
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(address _owner) {
owner = _owner;
emit OwnershipTransferred(address(0), _owner);
}
/*//////////////////////////////////////////////////////////////
OWNERSHIP LOGIC
//////////////////////////////////////////////////////////////*/
function transferOwnership(address newOwner) public virtual onlyOwner {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}{
"remappings": [
"@solmate/=lib/solmate/src/",
"@forge-std/=lib/forge-std/src/",
"@ds-test/=lib/forge-std/lib/ds-test/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/v3-periphery/=lib/v3-periphery/",
"@uniswap/v3-core/=lib/v3-core/",
"@chainlink/=lib/chainlink/",
"@uniswapV3P/=lib/v3-periphery/contracts/",
"@uniswapV3C/=lib/v3-core/contracts/",
"@balancer/=lib/balancer-v2-monorepo/pkg/",
"@ccip/=lib/ccip/",
"@pendle/=lib/pendle-core-v2-public/",
"@balancer-labs/=lib/balancer-v2-monorepo/../../node_modules/@balancer-labs/",
"axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/",
"balancer-v2-monorepo/=lib/balancer-v2-monorepo/",
"ccip/=lib/ccip/contracts/",
"chainlink/=lib/chainlink/integration-tests/contracts/ethereum/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"pendle-core-v2-public/=lib/pendle-core-v2-public/contracts/",
"solmate/=lib/solmate/src/",
"v3-core/=lib/v3-core/contracts/",
"v3-periphery/=lib/v3-periphery/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "shanghai",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"rootHash","type":"bytes32"}],"name":"RegisteredMerkleTree","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"rootHash","type":"bytes32"}],"name":"UnRegisteredMerkleTree","type":"event"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_rootHashes","type":"bytes32[]"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_balances","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_merkleProofs","type":"bytes32[][]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"merkleAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"registerMerkleTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"unregisterMerkleTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"bytes32","name":"_rootHash","type":"bytes32"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b5060405161109538038061109583398101604081905261002e9161007c565b5f80546001600160a01b0319166001600160a01b03831690811782556040518392907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506100a9565b5f6020828403121561008c575f80fd5b81516001600160a01b03811681146100a2575f80fd5b9392505050565b610fdf806100b65f395ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063d9caed1211610063578063d9caed121461011d578063dfcae62214610130578063ea6751771461015d578063f2fde38b14610170578063f3aed33114610183575f80fd5b80632546ff62146100945780632e1bf1f9146100a95780636667843b146100d15780638da5cb5b146100f3575b5f80fd5b6100a76100a2366004610bfa565b610196565b005b6100bc6100b7366004610c74565b610268565b60405190151581526020015b60405180910390f35b6100bc6100df366004610bfa565b60016020525f908152604090205460ff1681565b5f54610105906001600160a01b031681565b6040516001600160a01b0390911681526020016100c8565b6100a761012b366004610ce7565b6102df565b6100bc61013e366004610d20565b600260209081525f928352604080842090915290825290205460ff1681565b6100a761016b366004610bfa565b610394565b6100a761017e366004610d4a565b61045a565b6100a7610191366004610d63565b6104cd565b5f546001600160a01b031633146101c85760405162461bcd60e51b81526004016101bf90610e30565b60405180910390fd5b5f8181526001602052604090205460ff166102165760405162461bcd60e51b815260206004820152600e60248201526d139bdd081c9959da5cdd195c995960921b60448201526064016101bf565b5f8181526001602052604090819020805460ff19169055517f3c7f98ea33e2313c4290aa5b7c9c736c23b8c2d291464f4134dc92686637a6809061025d9083815260200190565b60405180910390a150565b5f83815260016020819052604082205460ff161515146102c65760405162461bcd60e51b8152602060048201526019602482015278139bdd08185d985a5b18589b19481b595c9adb19481c9bdbdd603a1b60448201526064016101bf565b6102d4878787878787610621565b979650505050505050565b5f546001600160a01b031633146103085760405162461bcd60e51b81526004016101bf90610e30565b805f81900361037a576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103779190610e56565b90505b61038e6001600160a01b03841685836106cc565b50505050565b5f546001600160a01b031633146103bd5760405162461bcd60e51b81526004016101bf90610e30565b5f8181526001602052604090205460ff16156104105760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c9959da5cdd195c995960721b60448201526064016101bf565b5f81815260016020818152604092839020805460ff191690921790915590518281527f5758f3e96c5841077c66799825e4296712b1562e1c673c4e13370723a1c4515b910161025d565b5f546001600160a01b031633146104835760405162461bcd60e51b81526004016101bf90610e30565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b868581146104ed5760405162461bcd60e51b81526004016101bf90610e6d565b83811461050c5760405162461bcd60e51b81526004016101bf90610e6d565b81811461052b5760405162461bcd60e51b81526004016101bf90610e6d565b5f5b81811015610614576105bb8b89898481811061054b5761054b610e9d565b90506020020160208101906105609190610d4a565b88888581811061057257610572610e9d565b905060200201358d8d8681811061058b5761058b610e9d565b905060200201358888878181106105a4576105a4610e9d565b90506020028101906105b69190610eb1565b610723565b6106048b8989848181106105d1576105d1610e9d565b90506020020160208101906105e69190610d4a565b8888858181106105f8576105f8610e9d565b905060200201356108bc565b61060d81610ef7565b905061052d565b5050505050505050505050565b604080516001600160a01b038089166020830152871691810191909152606081018590525f90819060800160408051601f19818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506106c08484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525089925085915061091f9050565b98975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261071e908490610934565b505050565b5f8381526001602081905260409091205460ff161515146107825760405162461bcd60e51b8152602060048201526019602482015278139bdd08185d985a5b18589b19481b595c9adb19481c9bdbdd603a1b60448201526064016101bf565b5f8381526002602090815260408083206001600160a01b038a16845290915290205460ff16156107ed5760405162461bcd60e51b8152602060048201526016602482015275125d081a185cc8185b1c9958591e4818db185a5b595960521b60448201526064016101bf565b6107fb868686868686610621565b6108405760405162461bcd60e51b815260206004820152601660248201527524b731b7b93932b1ba1036b2b935b63290383937b7b360511b60448201526064016101bf565b5f8381526002602090815260408083206001600160a01b038a811680865291845293829020805460ff19166001179055815187815292830152918716818301526060810186905290517f8b1927e0809f1e7682bb8c52fafe4c0445fea47afef60dd27e037e91fd104d2e916080908290030190a1505050505050565b5f811161090b5760405162461bcd60e51b815260206004820152601f60248201527f4e6f2062616c616e636520776f756c64206265207472616e736665727265640060448201526064016101bf565b61071e6001600160a01b03831684836106cc565b5f8261092b8584610a05565b14949350505050565b5f610988826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610a519092919063ffffffff16565b80519091501561071e57808060200190518101906109a69190610f1b565b61071e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101bf565b5f81815b8451811015610a4957610a3582868381518110610a2857610a28610e9d565b6020026020010151610a67565b915080610a4181610ef7565b915050610a09565b509392505050565b6060610a5f84845f85610a96565b949350505050565b5f818310610a81575f828152602084905260409020610a8f565b5f8381526020839052604090205b9392505050565b606082471015610af75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101bf565b5f80866001600160a01b03168587604051610b129190610f5c565b5f6040518083038185875af1925050503d805f8114610b4c576040519150601f19603f3d011682016040523d82523d5f602084013e610b51565b606091505b50915091506102d48783838760608315610bcb5782515f03610bc4576001600160a01b0385163b610bc45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bf565b5081610a5f565b610a5f8383815115610be05781518083602001fd5b8060405162461bcd60e51b81526004016101bf9190610f77565b5f60208284031215610c0a575f80fd5b5035919050565b80356001600160a01b0381168114610c27575f80fd5b919050565b5f8083601f840112610c3c575f80fd5b50813567ffffffffffffffff811115610c53575f80fd5b6020830191508360208260051b8501011115610c6d575f80fd5b9250929050565b5f805f805f8060a08789031215610c89575f80fd5b610c9287610c11565b9550610ca060208801610c11565b94506040870135935060608701359250608087013567ffffffffffffffff811115610cc9575f80fd5b610cd589828a01610c2c565b979a9699509497509295939492505050565b5f805f60608486031215610cf9575f80fd5b610d0284610c11565b9250610d1060208501610c11565b9150604084013590509250925092565b5f8060408385031215610d31575f80fd5b82359150610d4160208401610c11565b90509250929050565b5f60208284031215610d5a575f80fd5b610a8f82610c11565b5f805f805f805f805f60a08a8c031215610d7b575f80fd5b610d848a610c11565b985060208a013567ffffffffffffffff80821115610da0575f80fd5b610dac8d838e01610c2c565b909a50985060408c0135915080821115610dc4575f80fd5b610dd08d838e01610c2c565b909850965060608c0135915080821115610de8575f80fd5b610df48d838e01610c2c565b909650945060808c0135915080821115610e0c575f80fd5b50610e198c828d01610c2c565b915080935050809150509295985092959850929598565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215610e66575f80fd5b5051919050565b602080825260169082015275092dcc6dee4e4cac6e840c2e4e4c2f240d8cadccee8d60531b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112610ec6575f80fd5b83018035915067ffffffffffffffff821115610ee0575f80fd5b6020019150600581901b3603821315610c6d575f80fd5b5f60018201610f1457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f60208284031215610f2b575f80fd5b81518015158114610a8f575f80fd5b5f5b83811015610f54578181015183820152602001610f3c565b50505f910152565b5f8251610f6d818460208701610f3a565b9190910192915050565b602081525f8251806020840152610f95816040850160208701610f3a565b601f01601f1916919091016040019291505056fea26469706673582212201bb3c623edc47173cb68393956d5800a59b9e8839ea5409cdcc5740a70f6dfdc64736f6c634300081500330000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd1
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063d9caed1211610063578063d9caed121461011d578063dfcae62214610130578063ea6751771461015d578063f2fde38b14610170578063f3aed33114610183575f80fd5b80632546ff62146100945780632e1bf1f9146100a95780636667843b146100d15780638da5cb5b146100f3575b5f80fd5b6100a76100a2366004610bfa565b610196565b005b6100bc6100b7366004610c74565b610268565b60405190151581526020015b60405180910390f35b6100bc6100df366004610bfa565b60016020525f908152604090205460ff1681565b5f54610105906001600160a01b031681565b6040516001600160a01b0390911681526020016100c8565b6100a761012b366004610ce7565b6102df565b6100bc61013e366004610d20565b600260209081525f928352604080842090915290825290205460ff1681565b6100a761016b366004610bfa565b610394565b6100a761017e366004610d4a565b61045a565b6100a7610191366004610d63565b6104cd565b5f546001600160a01b031633146101c85760405162461bcd60e51b81526004016101bf90610e30565b60405180910390fd5b5f8181526001602052604090205460ff166102165760405162461bcd60e51b815260206004820152600e60248201526d139bdd081c9959da5cdd195c995960921b60448201526064016101bf565b5f8181526001602052604090819020805460ff19169055517f3c7f98ea33e2313c4290aa5b7c9c736c23b8c2d291464f4134dc92686637a6809061025d9083815260200190565b60405180910390a150565b5f83815260016020819052604082205460ff161515146102c65760405162461bcd60e51b8152602060048201526019602482015278139bdd08185d985a5b18589b19481b595c9adb19481c9bdbdd603a1b60448201526064016101bf565b6102d4878787878787610621565b979650505050505050565b5f546001600160a01b031633146103085760405162461bcd60e51b81526004016101bf90610e30565b805f81900361037a576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103779190610e56565b90505b61038e6001600160a01b03841685836106cc565b50505050565b5f546001600160a01b031633146103bd5760405162461bcd60e51b81526004016101bf90610e30565b5f8181526001602052604090205460ff16156104105760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c9959da5cdd195c995960721b60448201526064016101bf565b5f81815260016020818152604092839020805460ff191690921790915590518281527f5758f3e96c5841077c66799825e4296712b1562e1c673c4e13370723a1c4515b910161025d565b5f546001600160a01b031633146104835760405162461bcd60e51b81526004016101bf90610e30565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b868581146104ed5760405162461bcd60e51b81526004016101bf90610e6d565b83811461050c5760405162461bcd60e51b81526004016101bf90610e6d565b81811461052b5760405162461bcd60e51b81526004016101bf90610e6d565b5f5b81811015610614576105bb8b89898481811061054b5761054b610e9d565b90506020020160208101906105609190610d4a565b88888581811061057257610572610e9d565b905060200201358d8d8681811061058b5761058b610e9d565b905060200201358888878181106105a4576105a4610e9d565b90506020028101906105b69190610eb1565b610723565b6106048b8989848181106105d1576105d1610e9d565b90506020020160208101906105e69190610d4a565b8888858181106105f8576105f8610e9d565b905060200201356108bc565b61060d81610ef7565b905061052d565b5050505050505050505050565b604080516001600160a01b038089166020830152871691810191909152606081018590525f90819060800160408051601f19818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506106c08484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525089925085915061091f9050565b98975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261071e908490610934565b505050565b5f8381526001602081905260409091205460ff161515146107825760405162461bcd60e51b8152602060048201526019602482015278139bdd08185d985a5b18589b19481b595c9adb19481c9bdbdd603a1b60448201526064016101bf565b5f8381526002602090815260408083206001600160a01b038a16845290915290205460ff16156107ed5760405162461bcd60e51b8152602060048201526016602482015275125d081a185cc8185b1c9958591e4818db185a5b595960521b60448201526064016101bf565b6107fb868686868686610621565b6108405760405162461bcd60e51b815260206004820152601660248201527524b731b7b93932b1ba1036b2b935b63290383937b7b360511b60448201526064016101bf565b5f8381526002602090815260408083206001600160a01b038a811680865291845293829020805460ff19166001179055815187815292830152918716818301526060810186905290517f8b1927e0809f1e7682bb8c52fafe4c0445fea47afef60dd27e037e91fd104d2e916080908290030190a1505050505050565b5f811161090b5760405162461bcd60e51b815260206004820152601f60248201527f4e6f2062616c616e636520776f756c64206265207472616e736665727265640060448201526064016101bf565b61071e6001600160a01b03831684836106cc565b5f8261092b8584610a05565b14949350505050565b5f610988826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610a519092919063ffffffff16565b80519091501561071e57808060200190518101906109a69190610f1b565b61071e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101bf565b5f81815b8451811015610a4957610a3582868381518110610a2857610a28610e9d565b6020026020010151610a67565b915080610a4181610ef7565b915050610a09565b509392505050565b6060610a5f84845f85610a96565b949350505050565b5f818310610a81575f828152602084905260409020610a8f565b5f8381526020839052604090205b9392505050565b606082471015610af75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101bf565b5f80866001600160a01b03168587604051610b129190610f5c565b5f6040518083038185875af1925050503d805f8114610b4c576040519150601f19603f3d011682016040523d82523d5f602084013e610b51565b606091505b50915091506102d48783838760608315610bcb5782515f03610bc4576001600160a01b0385163b610bc45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bf565b5081610a5f565b610a5f8383815115610be05781518083602001fd5b8060405162461bcd60e51b81526004016101bf9190610f77565b5f60208284031215610c0a575f80fd5b5035919050565b80356001600160a01b0381168114610c27575f80fd5b919050565b5f8083601f840112610c3c575f80fd5b50813567ffffffffffffffff811115610c53575f80fd5b6020830191508360208260051b8501011115610c6d575f80fd5b9250929050565b5f805f805f8060a08789031215610c89575f80fd5b610c9287610c11565b9550610ca060208801610c11565b94506040870135935060608701359250608087013567ffffffffffffffff811115610cc9575f80fd5b610cd589828a01610c2c565b979a9699509497509295939492505050565b5f805f60608486031215610cf9575f80fd5b610d0284610c11565b9250610d1060208501610c11565b9150604084013590509250925092565b5f8060408385031215610d31575f80fd5b82359150610d4160208401610c11565b90509250929050565b5f60208284031215610d5a575f80fd5b610a8f82610c11565b5f805f805f805f805f60a08a8c031215610d7b575f80fd5b610d848a610c11565b985060208a013567ffffffffffffffff80821115610da0575f80fd5b610dac8d838e01610c2c565b909a50985060408c0135915080821115610dc4575f80fd5b610dd08d838e01610c2c565b909850965060608c0135915080821115610de8575f80fd5b610df48d838e01610c2c565b909650945060808c0135915080821115610e0c575f80fd5b50610e198c828d01610c2c565b915080935050809150509295985092959850929598565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215610e66575f80fd5b5051919050565b602080825260169082015275092dcc6dee4e4cac6e840c2e4e4c2f240d8cadccee8d60531b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112610ec6575f80fd5b83018035915067ffffffffffffffff821115610ee0575f80fd5b6020019150600581901b3603821315610c6d575f80fd5b5f60018201610f1457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f60208284031215610f2b575f80fd5b81518015158114610a8f575f80fd5b5f5b83811015610f54578181015183820152602001610f3c565b50505f910152565b5f8251610f6d818460208701610f3a565b9190910192915050565b602081525f8251806020840152610f95816040850160208701610f3a565b601f01601f1916919091016040019291505056fea26469706673582212201bb3c623edc47173cb68393956d5800a59b9e8839ea5409cdcc5740a70f6dfdc64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd1
-----Decoded View---------------
Arg [0] : _owner (address): 0x2322ba43eFF1542b6A7bAeD35e66099Ea0d12Bd1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd1
Deployed Bytecode Sourcemap
302:3383:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1041:232;;;;;;:::i;:::-;;:::i;:::-;;1949:362;;;;;;:::i;:::-;;:::i;:::-;;;1642:14:7;;1635:22;1617:41;;1605:2;1590:18;1949:362:6;;;;;;;;406:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;690:20:5;;;;;-1:-1:-1;;;;;690:20:5;;;;;;-1:-1:-1;;;;;1833:32:7;;;1815:51;;1803:2;1788:18;690:20:5;1669:203:7;2317:294:6;;;;;;:::i;:::-;;:::i;501:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;803:232;;;;;;:::i;:::-;;:::i;1312:161:5:-;;;;;;:::i;:::-;;:::i;1279:664:6:-;;;;;;:::i;:::-;;:::i;1041:232::-;778:5:5;;-1:-1:-1;;;;;778:5:5;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:5;;;;;;;:::i;:::-;;;;;;;;;1127:26:6::1;::::0;;;:15:::1;:26;::::0;;;;;::::1;;1119:53;;;::::0;-1:-1:-1;;;1119:53:6;;4714:2:7;1119:53:6::1;::::0;::::1;4696:21:7::0;4753:2;4733:18;;;4726:30;-1:-1:-1;;;4772:18:7;;;4765:44;4826:18;;1119:53:6::1;4512:338:7::0;1119:53:6::1;1212:5;1183:26:::0;;;:15:::1;:26;::::0;;;;;;:34;;-1:-1:-1;;1183:34:6::1;::::0;;1233:33;::::1;::::0;::::1;::::0;1199:9;5001:25:7;;4989:2;4974:18;;4855:177;1233:33:6::1;;;;;;;;1041:232:::0;:::o;1949:362::-;2138:4;2162:26;;;:15;:26;;;;;;;;;;:34;;;2154:72;;;;-1:-1:-1;;;2154:72:6;;5239:2:7;2154:72:6;;;5221:21:7;5278:2;5258:18;;;5251:30;-1:-1:-1;;;5297:18:7;;;5290:55;5362:18;;2154:72:6;5037:349:7;2154:72:6;2244:60;2257:3;2262:6;2270:8;2280:9;2291:12;;2244;:60::i;:::-;2237:67;1949:362;-1:-1:-1;;;;;;;1949:362:6:o;2317:294::-;778:5:5;;-1:-1:-1;;;;;778:5:5;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:5;;;;;;;:::i;:::-;2433:8:6;2411:19:::1;2456:13:::0;;;2452:97:::1;;2499:39;::::0;-1:-1:-1;;;2499:39:6;;2532:4:::1;2499:39;::::0;::::1;1815:51:7::0;-1:-1:-1;;;;;2499:24:6;::::1;::::0;::::1;::::0;1788:18:7;;2499:39:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2485:53;;2452:97;2559:45;-1:-1:-1::0;;;;;2559:27:6;::::1;2587:3:::0;2592:11;2559:27:::1;:45::i;:::-;2401:210;2317:294:::0;;;:::o;803:232::-;778:5:5;;-1:-1:-1;;;;;778:5:5;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:5;;;;;;;:::i;:::-;888:26:6::1;::::0;;;:15:::1;:26;::::0;;;;;::::1;;887:27;879:58;;;::::0;-1:-1:-1;;;879:58:6;;5782:2:7;879:58:6::1;::::0;::::1;5764:21:7::0;5821:2;5801:18;;;5794:30;-1:-1:-1;;;5840:18:7;;;5833:48;5898:18;;879:58:6::1;5580:342:7::0;879:58:6::1;948:26;::::0;;;977:4:::1;948:26;::::0;;;;;;;;:33;;-1:-1:-1;;948:33:6::1;::::0;;::::1;::::0;;;997:31;;5001:25:7;;;997:31:6::1;::::0;4974:18:7;997:31:6::1;4855:177:7::0;1312:161:5;778:5;;-1:-1:-1;;;;;778:5:5;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:5;;;;;;;:::i;:::-;1392:5:::1;:16:::0;;-1:-1:-1;;;;;;1392:16:5::1;-1:-1:-1::0;;;;;1392:16:5;::::1;::::0;;::::1;::::0;;1424:42:::1;::::0;1392:16;;1445:10:::1;::::0;1424:42:::1;::::0;1392:5;1424:42:::1;1312:161:::0;:::o;1279:664:6:-;1515:11;1551:24;;;1543:59;;;;-1:-1:-1;;;1543:59:6;;;;;;;:::i;:::-;1620:26;;;1612:61;;;;-1:-1:-1;;;1612:61:6;;;;;;;:::i;:::-;1691:30;;;1683:65;;;;-1:-1:-1;;;1683:65:6;;;;;;;:::i;:::-;1764:9;1759:178;1779:6;1775:1;:10;1759:178;;;1806:71;1813:3;1818:7;;1826:1;1818:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1830:9;;1840:1;1830:12;;;;;;;:::i;:::-;;;;;;;1844:11;;1856:1;1844:14;;;;;;;:::i;:::-;;;;;;;1860:13;;1874:1;1860:16;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1806:6;:71::i;:::-;1891:35;1896:3;1901:7;;1909:1;1901:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1913:9;;1923:1;1913:12;;;;;;;:::i;:::-;;;;;;;1891:4;:35::i;:::-;1787:3;;;:::i;:::-;;;1759:178;;;;1488:455;1279:664;;;;;;;;;:::o;3119:363::-;3372:33;;;-1:-1:-1;;;;;7455:15:7;;;3372:33:6;;;7437:34:7;7507:15;;7487:18;;;7480:43;;;;7539:18;;;7532:34;;;3308:4:6;;;;7372:18:7;;3372:33:6;;;-1:-1:-1;;3372:33:6;;;;;;;;;3362:44;;3372:33;3362:44;;;;3349:58;;;7706:19:7;7741:12;3349:58:6;;;;;;;;;;;;3339:69;;;;;;3324:84;;3426:49;3445:12;;3426:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3459:9:6;;-1:-1:-1;3470:4:6;;-1:-1:-1;3426:18:6;;-1:-1:-1;3426:49:6:i;:::-;3419:56;3119:363;-1:-1:-1;;;;;;;;3119:363:6:o;763:205:2:-;902:58;;;-1:-1:-1;;;;;7956:32:7;;902:58:2;;;7938:51:7;8005:18;;;;7998:34;;;902:58:2;;;;;;;;;;7911:18:7;;;;902:58:2;;;;;;;;-1:-1:-1;;;;;902:58:2;-1:-1:-1;;;902:58:2;;;875:86;;895:5;;875:19;:86::i;:::-;763:205;;;:::o;2617:496:6:-;2770:26;;;;:15;:26;;;;;;;;;;;:34;;;2762:72;;;;-1:-1:-1;;;2762:72:6;;5239:2:7;2762:72:6;;;5221:21:7;5278:2;5258:18;;;5251:30;-1:-1:-1;;;5297:18:7;;;5290:55;5362:18;;2762:72:6;5037:349:7;2762:72:6;2853:18;;;;:7;:18;;;;;;;;-1:-1:-1;;;;;2853:23:6;;;;;;;;;;;;2852:24;2844:59;;;;-1:-1:-1;;;2844:59:6;;8245:2:7;2844:59:6;;;8227:21:7;8284:2;8264:18;;;8257:30;-1:-1:-1;;;8303:18:7;;;8296:52;8365:18;;2844:59:6;8043:346:7;2844:59:6;2921:60;2934:3;2939:6;2947:8;2957:9;2968:12;;2921;:60::i;:::-;2913:95;;;;-1:-1:-1;;;2913:95:6;;8596:2:7;2913:95:6;;;8578:21:7;8635:2;8615:18;;;8608:30;-1:-1:-1;;;8654:18:7;;;8647:52;8716:18;;2913:95:6;8394:346:7;2913:95:6;3019:18;;;;:7;:18;;;;;;;;-1:-1:-1;;;;;3019:23:6;;;;;;;;;;;;;:30;;-1:-1:-1;;3019:30:6;3045:4;3019:30;;;3065:41;;8976:25:7;;;9055:18;;;9048:43;9127:15;;;9107:18;;;9100:43;9174:2;9159:18;;9152:34;;;3065:41:6;;;;8963:3:7;3065:41:6;;;;;;;2617:496;;;;;;:::o;3488:195::-;3586:1;3575:8;:12;3567:56;;;;-1:-1:-1;;;3567:56:6;;9399:2:7;3567:56:6;;;9381:21:7;9438:2;9418:18;;;9411:30;9477:33;9457:18;;;9450:61;9528:18;;3567:56:6;9197:355:7;3567:56:6;3634:42;-1:-1:-1;;;;;3634:27:6;;3662:3;3667:8;3634:27;:42::i;1153:184:4:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;;1153:184;-1:-1:-1;;;;1153:184:4:o;3747:706:2:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:2;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:2;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:2;;10041:2:7;4351:85:2;;;10023:21:7;10080:2;10060:18;;;10053:30;10119:34;10099:18;;;10092:62;-1:-1:-1;;;10170:18:7;;;10163:40;10220:19;;4351:85:2;9839:406:7;1991:290:4;2074:7;2116:4;2074:7;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;2202:9;:33::i;:::-;2187:48;-1:-1:-1;2168:3:4;;;;:::i;:::-;;;;2130:116;;;-1:-1:-1;2262:12:4;1991:290;-1:-1:-1;;;1991:290:4:o;3872:223:3:-;4005:12;4036:52;4058:6;4066:4;4072:1;4075:12;4036:21;:52::i;:::-;4029:59;3872:223;-1:-1:-1;;;;3872:223:3:o;8876:147:4:-;8939:7;8969:1;8965;:5;:51;;9097:13;9188:15;;;9223:4;9216:15;;;9269:4;9253:21;;8965:51;;;9097:13;9188:15;;;9223:4;9216:15;;;9269:4;9253:21;;8973:20;8958:58;8876:147;-1:-1:-1;;;8876:147:4:o;4959:446:3:-;5124:12;5181:5;5156:21;:30;;5148:81;;;;-1:-1:-1;;;5148:81:3;;10452:2:7;5148:81:3;;;10434:21:7;10491:2;10471:18;;;10464:30;10530:34;10510:18;;;10503:62;-1:-1:-1;;;10581:18:7;;;10574:36;10627:19;;5148:81:3;10250:402:7;5148:81:3;5240:12;5254:23;5281:6;-1:-1:-1;;;;;5281:11:3;5300:5;5307:4;5281:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5239:73;;;;5329:69;5356:6;5364:7;5373:10;5385:12;7645;7673:7;7669:418;;;7700:10;:17;7721:1;7700:22;7696:286;;-1:-1:-1;;;;;1465:19:3;;;7907:60;;;;-1:-1:-1;;;7907:60:3;;11406:2:7;7907:60:3;;;11388:21:7;11445:2;11425:18;;;11418:30;11484:31;11464:18;;;11457:59;11533:18;;7907:60:3;11204:353:7;7907:60:3;-1:-1:-1;8002:10:3;7995:17;;7669:418;8043:33;8051:10;8063:12;8774:17;;:21;8770:379;;9002:10;8996:17;9058:15;9045:10;9041:2;9037:19;9030:44;8770:379;9125:12;9118:20;;-1:-1:-1;;;9118:20:3;;;;;;;;:::i;14:180:7:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:7;;14:180;-1:-1:-1;14:180:7:o;199:173::-;267:20;;-1:-1:-1;;;;;316:31:7;;306:42;;296:70;;362:1;359;352:12;296:70;199:173;;;:::o;377:367::-;440:8;450:6;504:3;497:4;489:6;485:17;481:27;471:55;;522:1;519;512:12;471:55;-1:-1:-1;545:20:7;;588:18;577:30;;574:50;;;620:1;617;610:12;574:50;657:4;649:6;645:17;633:29;;717:3;710:4;700:6;697:1;693:14;685:6;681:27;677:38;674:47;671:67;;;734:1;731;724:12;671:67;377:367;;;;;:::o;749:723::-;871:6;879;887;895;903;911;964:3;952:9;943:7;939:23;935:33;932:53;;;981:1;978;971:12;932:53;1004:29;1023:9;1004:29;:::i;:::-;994:39;;1052:38;1086:2;1075:9;1071:18;1052:38;:::i;:::-;1042:48;;1137:2;1126:9;1122:18;1109:32;1099:42;;1188:2;1177:9;1173:18;1160:32;1150:42;;1243:3;1232:9;1228:19;1215:33;1271:18;1263:6;1260:30;1257:50;;;1303:1;1300;1293:12;1257:50;1342:70;1404:7;1395:6;1384:9;1380:22;1342:70;:::i;:::-;749:723;;;;-1:-1:-1;749:723:7;;-1:-1:-1;749:723:7;;1431:8;;749:723;-1:-1:-1;;;749:723:7:o;1877:328::-;1954:6;1962;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2062:29;2081:9;2062:29;:::i;:::-;2052:39;;2110:38;2144:2;2133:9;2129:18;2110:38;:::i;:::-;2100:48;;2195:2;2184:9;2180:18;2167:32;2157:42;;1877:328;;;;;:::o;2210:254::-;2278:6;2286;2339:2;2327:9;2318:7;2314:23;2310:32;2307:52;;;2355:1;2352;2345:12;2307:52;2391:9;2378:23;2368:33;;2420:38;2454:2;2443:9;2439:18;2420:38;:::i;:::-;2410:48;;2210:254;;;;;:::o;2469:186::-;2528:6;2581:2;2569:9;2560:7;2556:23;2552:32;2549:52;;;2597:1;2594;2587:12;2549:52;2620:29;2639:9;2620:29;:::i;2660:1506::-;2890:6;2898;2906;2914;2922;2930;2938;2946;2954;3007:3;2995:9;2986:7;2982:23;2978:33;2975:53;;;3024:1;3021;3014:12;2975:53;3047:29;3066:9;3047:29;:::i;:::-;3037:39;;3127:2;3116:9;3112:18;3099:32;3150:18;3191:2;3183:6;3180:14;3177:34;;;3207:1;3204;3197:12;3177:34;3246:70;3308:7;3299:6;3288:9;3284:22;3246:70;:::i;:::-;3335:8;;-1:-1:-1;3220:96:7;-1:-1:-1;3423:2:7;3408:18;;3395:32;;-1:-1:-1;3439:16:7;;;3436:36;;;3468:1;3465;3458:12;3436:36;3507:72;3571:7;3560:8;3549:9;3545:24;3507:72;:::i;:::-;3598:8;;-1:-1:-1;3481:98:7;-1:-1:-1;3686:2:7;3671:18;;3658:32;;-1:-1:-1;3702:16:7;;;3699:36;;;3731:1;3728;3721:12;3699:36;3770:72;3834:7;3823:8;3812:9;3808:24;3770:72;:::i;:::-;3861:8;;-1:-1:-1;3744:98:7;-1:-1:-1;3949:3:7;3934:19;;3921:33;;-1:-1:-1;3966:16:7;;;3963:36;;;3995:1;3992;3985:12;3963:36;;4034:72;4098:7;4087:8;4076:9;4072:24;4034:72;:::i;:::-;4008:98;;4125:8;4115:18;;;4152:8;4142:18;;;2660:1506;;;;;;;;;;;:::o;4171:336::-;4373:2;4355:21;;;4412:2;4392:18;;;4385:30;-1:-1:-1;;;4446:2:7;4431:18;;4424:42;4498:2;4483:18;;4171:336::o;5391:184::-;5461:6;5514:2;5502:9;5493:7;5489:23;5485:32;5482:52;;;5530:1;5527;5520:12;5482:52;-1:-1:-1;5553:16:7;;5391:184;-1:-1:-1;5391:184:7:o;5927:346::-;6129:2;6111:21;;;6168:2;6148:18;;;6141:30;-1:-1:-1;;;6202:2:7;6187:18;;6180:52;6264:2;6249:18;;5927:346::o;6278:127::-;6339:10;6334:3;6330:20;6327:1;6320:31;6370:4;6367:1;6360:15;6394:4;6391:1;6384:15;6410:545;6503:4;6509:6;6569:11;6556:25;6663:2;6659:7;6648:8;6632:14;6628:29;6624:43;6604:18;6600:68;6590:96;;6682:1;6679;6672:12;6590:96;6709:33;;6761:20;;;-1:-1:-1;6804:18:7;6793:30;;6790:50;;;6836:1;6833;6826:12;6790:50;6869:4;6857:17;;-1:-1:-1;6920:1:7;6916:14;;;6900;6896:35;6886:46;;6883:66;;;6945:1;6942;6935:12;6960:232;6999:3;7020:17;;;7017:140;;7079:10;7074:3;7070:20;7067:1;7060:31;7114:4;7111:1;7104:15;7142:4;7139:1;7132:15;7017:140;-1:-1:-1;7184:1:7;7173:13;;6960:232::o;9557:277::-;9624:6;9677:2;9665:9;9656:7;9652:23;9648:32;9645:52;;;9693:1;9690;9683:12;9645:52;9725:9;9719:16;9778:5;9771:13;9764:21;9757:5;9754:32;9744:60;;9800:1;9797;9790:12;10657:250;10742:1;10752:113;10766:6;10763:1;10760:13;10752:113;;;10842:11;;;10836:18;10823:11;;;10816:39;10788:2;10781:10;10752:113;;;-1:-1:-1;;10899:1:7;10881:16;;10874:27;10657:250::o;10912:287::-;11041:3;11079:6;11073:13;11095:66;11154:6;11149:3;11142:4;11134:6;11130:17;11095:66;:::i;:::-;11177:16;;;;;10912:287;-1:-1:-1;;10912:287:7:o;11562:396::-;11711:2;11700:9;11693:21;11674:4;11743:6;11737:13;11786:6;11781:2;11770:9;11766:18;11759:34;11802:79;11874:6;11869:2;11858:9;11854:18;11849:2;11841:6;11837:15;11802:79;:::i;:::-;11942:2;11921:15;-1:-1:-1;;11917:29:7;11902:45;;;;11949:2;11898:54;;11562:396;-1:-1:-1;;11562:396:7:o
Swarm Source
ipfs://1bb3c623edc47173cb68393956d5800a59b9e8839ea5409cdcc5740a70f6dfdc
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.