Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 20 from a total of 20 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim With Proof... | 19146497 | 215 days ago | IN | 0 ETH | 0.00039361 | ||||
Recover Lost Tok... | 19144732 | 215 days ago | IN | 0 ETH | 0.00153184 | ||||
Claim With Proof... | 19109405 | 220 days ago | IN | 0 ETH | 0.00317015 | ||||
Claim With Proof... | 19109130 | 220 days ago | IN | 0 ETH | 0.00323059 | ||||
Claim With Proof... | 19104932 | 221 days ago | IN | 0 ETH | 0.00428638 | ||||
Claim With Proof... | 19100539 | 222 days ago | IN | 0 ETH | 0.00325089 | ||||
Claim With Proof... | 19095713 | 222 days ago | IN | 0 ETH | 0.00348559 | ||||
Claim With Proof... | 19094703 | 222 days ago | IN | 0 ETH | 0.00350412 | ||||
Claim With Proof... | 19082212 | 224 days ago | IN | 0 ETH | 0.00360981 | ||||
Claim With Proof... | 19081246 | 224 days ago | IN | 0 ETH | 0.00385733 | ||||
Claim With Proof... | 19079176 | 225 days ago | IN | 0 ETH | 0.00390621 | ||||
Claim With Proof... | 19072109 | 226 days ago | IN | 0 ETH | 0.00369244 | ||||
Claim With Proof... | 19061832 | 227 days ago | IN | 0 ETH | 0.0059494 | ||||
Claim With Proof... | 19061675 | 227 days ago | IN | 0 ETH | 0.00591773 | ||||
Claim With Proof... | 19061602 | 227 days ago | IN | 0 ETH | 0.00501926 | ||||
Claim With Proof... | 19060109 | 227 days ago | IN | 0 ETH | 0.00339697 | ||||
Claim With Proof... | 19059118 | 227 days ago | IN | 0 ETH | 0.00334063 | ||||
Claim With Proof... | 19059079 | 227 days ago | IN | 0 ETH | 0.00381438 | ||||
Claim With Proof... | 19057819 | 228 days ago | IN | 0 ETH | 0.00446329 | ||||
0x60806040 | 19050913 | 229 days ago | IN | 0 ETH | 0.01661799 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HubAirdrop
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-20 */ pragma solidity ^0.8.19; // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the 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); } // // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.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. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // struct LockArg { uint256 platform; address asset; address receiver; uint48 vestingStart; uint16 firstUnlockRatio; uint48 unlockInterval; uint48 lockDuration; uint192 totalAmount; bytes32 reason; bool allowTax; address paymentAsset; } bytes32 constant PRESALE_REASON = keccak256("Presale"); bytes32 constant LP_REASON = keccak256("Liquidity"); interface ICryptohubLockFactory { function setInternalLocker(address _locker, bool _isInternal) external; function lock(LockArg memory _lockArg) external returns (uint256, address); function internalFreeLock( LockArg calldata _lockArg ) external returns (uint256, address); function increaseCredits( uint256 _platform, address _user, uint256 _amount ) external; function increaseAmountForLock( uint256 _platform, uint256 _lockId, uint256 _amount ) external; function claimUnlockedToken( uint256 _platform, uint256 _lockId ) external returns (uint256 unlockedAmount); } // // import pauseable // import ownable // import merkletree // 784.52 contract HubAirdrop is Ownable, Pausable { uint256 public SHARE_TO_HUB = 150000 * 10 ** 18; IERC20 constant hub = IERC20(0x6923F9B683111DCc0e20124e9A031dEeAE5DaD93); IERC721 constant shareNft = IERC721(0xD2e53A95FaCbd47fe3973B913cB91FA3b013bbF5); address constant treasury = 0xDD48fA33AB3e6A094B1cA89c1578B9ca96d0e563; ICryptohubLockFactory public constant lockFactory = ICryptohubLockFactory(0x46A43cf26743BA40d05aE350A85ABBa4883A6299); // merkle root bytes32 constant merkleRoot = 0xaa6ae5be7358e4b66589c70ef41b513254f673f77634ee6108e395ccf84f3b35; // 0xc16062aae93cac69c3ec3e811f24177509c2fe8c64a97743a95827bcb4e3b8eb; mapping(address => bool) public claimed; constructor() //IERC20 _hub, //IERC721 _shareNft, //address _treasury, //ICryptohubLockFactory _lockFactory, //uint48 _vestingStart { //hub = _hub; //shareNft = _shareNft; //treasury = _treasury; // lockFactory = _lockFactory; //vestingStart = _vestingStart; } /* uint256 platform; address asset; address receiver; uint48 vestingStart; uint16 firstUnlockRatio; uint48 unlockInterval; uint48 lockDuration; uint192 totalAmount; bytes32 reason; bool allowTax; address paymentAsset; */ uint48 constant vestingStart = 1699387200; uint16 constant firstUnlockRatio = 1000; uint48 constant unlockInterval = 30 days; uint48 constant lockDuration = 6 * 30 days; function claimForShareHolder( uint256[] calldata _tokenIds ) external whenNotPaused { for (uint256 i = 0; i < _tokenIds.length; i++) { uint256 tokenId = _tokenIds[i]; require( shareNft.ownerOf(tokenId) == msg.sender, "HubAirdrop: not owner" ); shareNft.transferFrom(msg.sender, owner(), tokenId); } uint256 amount = _tokenIds.length * SHARE_TO_HUB; LockArg memory _lockArg = LockArg({ platform: 0, asset: address(hub), receiver: msg.sender, vestingStart: vestingStart, firstUnlockRatio: firstUnlockRatio, unlockInterval: unlockInterval, lockDuration: lockDuration, totalAmount: uint192(amount), reason: PRESALE_REASON, allowTax: false, paymentAsset: address(0) }); // approve hub hub.approve(address(lockFactory), amount); (uint256 lockId, ) = lockFactory.internalFreeLock(_lockArg); // if vesting start has arived claim if (block.timestamp >= vestingStart) { lockFactory.claimUnlockedToken(0, lockId); } } function claimWithProofFor( address _user, uint256 _amount, bytes32[] calldata _proof ) external whenNotPaused { _claimWithProof(_user, _amount, _proof); } function claimWithProof( uint256 _amount, bytes32[] calldata _proof ) external whenNotPaused { _claimWithProof(msg.sender, _amount, _proof); } function batchClaimWithProof( address[] calldata _users, uint256[] calldata _amounts, bytes32[][] calldata _proofs ) external whenNotPaused { require( _users.length == _amounts.length && _users.length == _proofs.length, "HubAirdrop: invalid input" ); for (uint256 i = 0; i < _users.length; i++) { _claimWithProof(_users[i], _amounts[i], _proofs[i]); } } function _claimWithProof( address _user, uint256 _amount, bytes32[] calldata _proof ) internal { require(!claimed[_user], "HubAirdrop: already claimed"); // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(_user, _amount)); require( MerkleProof.verify(_proof, merkleRoot, node), "HubAirdrop: Invalid proof." ); claimed[_user] = true; LockArg memory _lockArg = LockArg({ platform: 0, asset: address(hub), receiver: _user, vestingStart: vestingStart, firstUnlockRatio: firstUnlockRatio, unlockInterval: unlockInterval, lockDuration: lockDuration, totalAmount: uint192(_amount), reason: PRESALE_REASON, allowTax: false, paymentAsset: address(0) }); // approve hub hub.approve(address(lockFactory), _amount); (uint256 lockId, ) = lockFactory.internalFreeLock(_lockArg); // if vesting start has arived claim if (block.timestamp >= vestingStart) { lockFactory.claimUnlockedToken(0, lockId); } } function recoverLostTokens(address _token) external onlyOwner { if (address(0) == _token) { // use call to transfer eth (bool success, ) = payable(owner()).call{ value: address(this).balance }(""); require(success, "HubAirdrop: ETH_TRANSFER_FAILED"); } else { IERC20(_token).transfer( owner(), IERC20(_token).balanceOf(address(this)) ); } } function setPaused(bool _paused) external onlyOwner { if (_paused) { _pause(); } else { _unpause(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"SHARE_TO_HUB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"}],"name":"batchClaimWithProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimForShareHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimWithProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimWithProofFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockFactory","outputs":[{"internalType":"contract ICryptohubLockFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052691fc3842bd1f071c0000060015534801561001e57600080fd5b506100283361003a565b6000805460ff60a01b1916905561008a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611407806100996000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063715018a61161008c5780639811445c116100665780639811445c146101a8578063b9e8ce2c146101bb578063c884ef83146101ce578063f2fde38b146101f157600080fd5b8063715018a61461017c578063834fa310146101845780638da5cb5b1461019757600080fd5b806316c38b3c146100d457806317a3cc82146100e95780631db9be1b1461010557806322c8018f146101385780632a7c6fbd1461014b5780635c975abb1461015e575b600080fd5b6100e76100e2366004610f97565b610204565b005b6100f260015481565b6040519081526020015b60405180910390f35b6101207346a43cf26743ba40d05ae350a85abba4883a629981565b6040516001600160a01b0390911681526020016100fc565b6100e7610146366004611000565b610225565b6100e7610159366004611061565b61023e565b600054600160a01b900460ff165b60405190151581526020016100fc565b6100e7610258565b6100e76101923660046110bd565b61026c565b6000546001600160a01b0316610120565b6100e76101b6366004611157565b610365565b6100e76101c9366004611199565b610741565b61016c6101dc366004611199565b60026020526000908152604090205460ff1681565b6100e76101ff366004611199565b6108f9565b61020c61096f565b801561021d5761021a6109c9565b50565b61021a610a29565b61022d610a65565b61023933848484610ab2565b505050565b610246610a65565b61025284848484610ab2565b50505050565b61026061096f565b61026a6000610e52565b565b610274610a65565b848314801561028257508481145b6102d35760405162461bcd60e51b815260206004820152601960248201527f48756241697264726f703a20696e76616c696420696e7075740000000000000060448201526064015b60405180910390fd5b60005b8581101561035c5761034a8787838181106102f3576102f36111b6565b90506020020160208101906103089190611199565b86868481811061031a5761031a6111b6565b90506020020135858585818110610333576103336111b6565b905060200281019061034591906111cc565b610ab2565b806103548161122c565b9150506102d6565b50505050505050565b61036d610a65565b60005b8181101561050657600083838381811061038c5761038c6111b6565b6040516331a9108f60e11b81526020919091029290920135600483018190529250339173d2e53a95facbd47fe3973b913cb91fa3b013bbf59150636352211e90602401602060405180830381865afa1580156103ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104109190611245565b6001600160a01b03161461045e5760405162461bcd60e51b8152602060048201526015602482015274243ab120b4b9323937b81d103737ba1037bbb732b960591b60448201526064016102ca565b73d2e53a95facbd47fe3973b913cb91fa3b013bbf56323b872dd3361048b6000546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b1580156104da57600080fd5b505af11580156104ee573d6000803e3d6000fd5b505050505080806104fe9061122c565b915050610370565b506001546000906105179083611262565b60408051610160810182526000808252736923f9b683111dcc0e20124e9a031deeae5dad9360208301819052338385015263654a974060608401526103e8608084015262278d0060a084015262ed4e0060c08401526001600160c01b03851660e08401527fcff8a2a4dc9d8050baca90b7a315a144de7e38fa773edf442d524939ffcce3fa6101008401526101208301829052610140830191909152915163095ea7b360e01b81527346a43cf26743ba40d05ae350a85abba4883a62996004820152602481018490529293509163095ea7b3906044016020604051808303816000875af115801561060c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106309190611279565b5060405163688a048560e11b81526000907346a43cf26743ba40d05ae350a85abba4883a62999063d114090a9061066b908590600401611296565b60408051808303816000875af1158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad9190611388565b50905063654a9740421061073a576040516333e04d9160e21b815260006004820152602481018290527346a43cf26743ba40d05ae350a85abba4883a62999063cf813644906044016020604051808303816000875af1158015610714573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073891906113b8565b505b5050505050565b61074961096f565b6001600160a01b03811660000361080157600080546040516001600160a01b039091169047908381818185875af1925050503d80600081146107a7576040519150601f19603f3d011682016040523d82523d6000602084013e6107ac565b606091505b50509050806107fd5760405162461bcd60e51b815260206004820152601f60248201527f48756241697264726f703a204554485f5452414e534645525f4641494c45440060448201526064016102ca565b5050565b806001600160a01b031663a9059cbb6108226000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a91906113b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd9190611279565b61090161096f565b6001600160a01b0381166109665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ca565b61021a81610e52565b6000546001600160a01b0316331461026a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ca565b6109d1610a65565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a0c3390565b6040516001600160a01b03909116815260200160405180910390a1565b610a31610ea2565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610a0c565b600054600160a01b900460ff161561026a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016102ca565b6001600160a01b03841660009081526002602052604090205460ff1615610b1b5760405162461bcd60e51b815260206004820152601b60248201527f48756241697264726f703a20616c726561647920636c61696d6564000000000060448201526064016102ca565b6040516bffffffffffffffffffffffff19606086901b16602082015260348101849052600090605401604051602081830303815290604052805190602001209050610bbc8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507faa6ae5be7358e4b66589c70ef41b513254f673f77634ee6108e395ccf84f3b359250859150610ef29050565b610c085760405162461bcd60e51b815260206004820152601a60248201527f48756241697264726f703a20496e76616c69642070726f6f662e00000000000060448201526064016102ca565b6001600160a01b0385166000818152600260209081526040808320805460ff19166001179055805161016081018252838152736923f9b683111dcc0e20124e9a031deeae5dad939281018390528082019490945263654a974060608501526103e8608085015262278d0060a085015262ed4e0060c08501526001600160c01b03881660e08501527fcff8a2a4dc9d8050baca90b7a315a144de7e38fa773edf442d524939ffcce3fa6101008501526101208401839052610140840192909252905163095ea7b360e01b81527346a43cf26743ba40d05ae350a85abba4883a629960048201526024810187905263095ea7b3906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190611279565b5060405163688a048560e11b81526000907346a43cf26743ba40d05ae350a85abba4883a62999063d114090a90610d7b908590600401611296565b60408051808303816000875af1158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190611388565b50905063654a9740421061035c576040516333e04d9160e21b815260006004820152602481018290527346a43cf26743ba40d05ae350a85abba4883a62999063cf813644906044016020604051808303816000875af1158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4891906113b8565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff1661026a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016102ca565b600082610eff8584610f08565b14949350505050565b600081815b8451811015610f4d57610f3982868381518110610f2c57610f2c6111b6565b6020026020010151610f57565b915080610f458161122c565b915050610f0d565b5090505b92915050565b6000818310610f73576000828152602084905260409020610f82565b60008381526020839052604090205b9392505050565b801515811461021a57600080fd5b600060208284031215610fa957600080fd5b8135610f8281610f89565b60008083601f840112610fc657600080fd5b50813567ffffffffffffffff811115610fde57600080fd5b6020830191508360208260051b8501011115610ff957600080fd5b9250929050565b60008060006040848603121561101557600080fd5b83359250602084013567ffffffffffffffff81111561103357600080fd5b61103f86828701610fb4565b9497909650939450505050565b6001600160a01b038116811461021a57600080fd5b6000806000806060858703121561107757600080fd5b84356110828161104c565b935060208501359250604085013567ffffffffffffffff8111156110a557600080fd5b6110b187828801610fb4565b95989497509550505050565b600080600080600080606087890312156110d657600080fd5b863567ffffffffffffffff808211156110ee57600080fd5b6110fa8a838b01610fb4565b9098509650602089013591508082111561111357600080fd5b61111f8a838b01610fb4565b9096509450604089013591508082111561113857600080fd5b5061114589828a01610fb4565b979a9699509497509295939492505050565b6000806020838503121561116a57600080fd5b823567ffffffffffffffff81111561118157600080fd5b61118d85828601610fb4565b90969095509350505050565b6000602082840312156111ab57600080fd5b8135610f828161104c565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126111e357600080fd5b83018035915067ffffffffffffffff8211156111fe57600080fd5b6020019150600581901b3603821315610ff957600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161123e5761123e611216565b5060010190565b60006020828403121561125757600080fd5b8151610f828161104c565b8082028115828204841417610f5157610f51611216565b60006020828403121561128b57600080fd5b8151610f8281610f89565b815181526020808301516101608301916112ba908401826001600160a01b03169052565b5060408301516112d560408401826001600160a01b03169052565b5060608301516112ef606084018265ffffffffffff169052565b506080830151611305608084018261ffff169052565b5060a083015161131f60a084018265ffffffffffff169052565b5060c083015161133960c084018265ffffffffffff169052565b5060e083015161135460e08401826001600160c01b03169052565b50610100838101519083015261012080840151151590830152610140928301516001600160a01b0316929091019190915290565b6000806040838503121561139b57600080fd5b8251915060208301516113ad8161104c565b809150509250929050565b6000602082840312156113ca57600080fd5b505191905056fea264697066735822122045cb83d524af3fbcc0d4435c9d27cab2131ea3963a246a7fb1e0151069ec9f0564736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063715018a61161008c5780639811445c116100665780639811445c146101a8578063b9e8ce2c146101bb578063c884ef83146101ce578063f2fde38b146101f157600080fd5b8063715018a61461017c578063834fa310146101845780638da5cb5b1461019757600080fd5b806316c38b3c146100d457806317a3cc82146100e95780631db9be1b1461010557806322c8018f146101385780632a7c6fbd1461014b5780635c975abb1461015e575b600080fd5b6100e76100e2366004610f97565b610204565b005b6100f260015481565b6040519081526020015b60405180910390f35b6101207346a43cf26743ba40d05ae350a85abba4883a629981565b6040516001600160a01b0390911681526020016100fc565b6100e7610146366004611000565b610225565b6100e7610159366004611061565b61023e565b600054600160a01b900460ff165b60405190151581526020016100fc565b6100e7610258565b6100e76101923660046110bd565b61026c565b6000546001600160a01b0316610120565b6100e76101b6366004611157565b610365565b6100e76101c9366004611199565b610741565b61016c6101dc366004611199565b60026020526000908152604090205460ff1681565b6100e76101ff366004611199565b6108f9565b61020c61096f565b801561021d5761021a6109c9565b50565b61021a610a29565b61022d610a65565b61023933848484610ab2565b505050565b610246610a65565b61025284848484610ab2565b50505050565b61026061096f565b61026a6000610e52565b565b610274610a65565b848314801561028257508481145b6102d35760405162461bcd60e51b815260206004820152601960248201527f48756241697264726f703a20696e76616c696420696e7075740000000000000060448201526064015b60405180910390fd5b60005b8581101561035c5761034a8787838181106102f3576102f36111b6565b90506020020160208101906103089190611199565b86868481811061031a5761031a6111b6565b90506020020135858585818110610333576103336111b6565b905060200281019061034591906111cc565b610ab2565b806103548161122c565b9150506102d6565b50505050505050565b61036d610a65565b60005b8181101561050657600083838381811061038c5761038c6111b6565b6040516331a9108f60e11b81526020919091029290920135600483018190529250339173d2e53a95facbd47fe3973b913cb91fa3b013bbf59150636352211e90602401602060405180830381865afa1580156103ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104109190611245565b6001600160a01b03161461045e5760405162461bcd60e51b8152602060048201526015602482015274243ab120b4b9323937b81d103737ba1037bbb732b960591b60448201526064016102ca565b73d2e53a95facbd47fe3973b913cb91fa3b013bbf56323b872dd3361048b6000546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b1580156104da57600080fd5b505af11580156104ee573d6000803e3d6000fd5b505050505080806104fe9061122c565b915050610370565b506001546000906105179083611262565b60408051610160810182526000808252736923f9b683111dcc0e20124e9a031deeae5dad9360208301819052338385015263654a974060608401526103e8608084015262278d0060a084015262ed4e0060c08401526001600160c01b03851660e08401527fcff8a2a4dc9d8050baca90b7a315a144de7e38fa773edf442d524939ffcce3fa6101008401526101208301829052610140830191909152915163095ea7b360e01b81527346a43cf26743ba40d05ae350a85abba4883a62996004820152602481018490529293509163095ea7b3906044016020604051808303816000875af115801561060c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106309190611279565b5060405163688a048560e11b81526000907346a43cf26743ba40d05ae350a85abba4883a62999063d114090a9061066b908590600401611296565b60408051808303816000875af1158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad9190611388565b50905063654a9740421061073a576040516333e04d9160e21b815260006004820152602481018290527346a43cf26743ba40d05ae350a85abba4883a62999063cf813644906044016020604051808303816000875af1158015610714573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073891906113b8565b505b5050505050565b61074961096f565b6001600160a01b03811660000361080157600080546040516001600160a01b039091169047908381818185875af1925050503d80600081146107a7576040519150601f19603f3d011682016040523d82523d6000602084013e6107ac565b606091505b50509050806107fd5760405162461bcd60e51b815260206004820152601f60248201527f48756241697264726f703a204554485f5452414e534645525f4641494c45440060448201526064016102ca565b5050565b806001600160a01b031663a9059cbb6108226000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a91906113b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd9190611279565b61090161096f565b6001600160a01b0381166109665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ca565b61021a81610e52565b6000546001600160a01b0316331461026a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ca565b6109d1610a65565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a0c3390565b6040516001600160a01b03909116815260200160405180910390a1565b610a31610ea2565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610a0c565b600054600160a01b900460ff161561026a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016102ca565b6001600160a01b03841660009081526002602052604090205460ff1615610b1b5760405162461bcd60e51b815260206004820152601b60248201527f48756241697264726f703a20616c726561647920636c61696d6564000000000060448201526064016102ca565b6040516bffffffffffffffffffffffff19606086901b16602082015260348101849052600090605401604051602081830303815290604052805190602001209050610bbc8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507faa6ae5be7358e4b66589c70ef41b513254f673f77634ee6108e395ccf84f3b359250859150610ef29050565b610c085760405162461bcd60e51b815260206004820152601a60248201527f48756241697264726f703a20496e76616c69642070726f6f662e00000000000060448201526064016102ca565b6001600160a01b0385166000818152600260209081526040808320805460ff19166001179055805161016081018252838152736923f9b683111dcc0e20124e9a031deeae5dad939281018390528082019490945263654a974060608501526103e8608085015262278d0060a085015262ed4e0060c08501526001600160c01b03881660e08501527fcff8a2a4dc9d8050baca90b7a315a144de7e38fa773edf442d524939ffcce3fa6101008501526101208401839052610140840192909252905163095ea7b360e01b81527346a43cf26743ba40d05ae350a85abba4883a629960048201526024810187905263095ea7b3906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190611279565b5060405163688a048560e11b81526000907346a43cf26743ba40d05ae350a85abba4883a62999063d114090a90610d7b908590600401611296565b60408051808303816000875af1158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190611388565b50905063654a9740421061035c576040516333e04d9160e21b815260006004820152602481018290527346a43cf26743ba40d05ae350a85abba4883a62999063cf813644906044016020604051808303816000875af1158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4891906113b8565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff1661026a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016102ca565b600082610eff8584610f08565b14949350505050565b600081815b8451811015610f4d57610f3982868381518110610f2c57610f2c6111b6565b6020026020010151610f57565b915080610f458161122c565b915050610f0d565b5090505b92915050565b6000818310610f73576000828152602084905260409020610f82565b60008381526020839052604090205b9392505050565b801515811461021a57600080fd5b600060208284031215610fa957600080fd5b8135610f8281610f89565b60008083601f840112610fc657600080fd5b50813567ffffffffffffffff811115610fde57600080fd5b6020830191508360208260051b8501011115610ff957600080fd5b9250929050565b60008060006040848603121561101557600080fd5b83359250602084013567ffffffffffffffff81111561103357600080fd5b61103f86828701610fb4565b9497909650939450505050565b6001600160a01b038116811461021a57600080fd5b6000806000806060858703121561107757600080fd5b84356110828161104c565b935060208501359250604085013567ffffffffffffffff8111156110a557600080fd5b6110b187828801610fb4565b95989497509550505050565b600080600080600080606087890312156110d657600080fd5b863567ffffffffffffffff808211156110ee57600080fd5b6110fa8a838b01610fb4565b9098509650602089013591508082111561111357600080fd5b61111f8a838b01610fb4565b9096509450604089013591508082111561113857600080fd5b5061114589828a01610fb4565b979a9699509497509295939492505050565b6000806020838503121561116a57600080fd5b823567ffffffffffffffff81111561118157600080fd5b61118d85828601610fb4565b90969095509350505050565b6000602082840312156111ab57600080fd5b8135610f828161104c565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126111e357600080fd5b83018035915067ffffffffffffffff8211156111fe57600080fd5b6020019150600581901b3603821315610ff957600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161123e5761123e611216565b5060010190565b60006020828403121561125757600080fd5b8151610f828161104c565b8082028115828204841417610f5157610f51611216565b60006020828403121561128b57600080fd5b8151610f8281610f89565b815181526020808301516101608301916112ba908401826001600160a01b03169052565b5060408301516112d560408401826001600160a01b03169052565b5060608301516112ef606084018265ffffffffffff169052565b506080830151611305608084018261ffff169052565b5060a083015161131f60a084018265ffffffffffff169052565b5060c083015161133960c084018265ffffffffffff169052565b5060e083015161135460e08401826001600160c01b03169052565b50610100838101519083015261012080840151151590830152610140928301516001600160a01b0316929091019190915290565b6000806040838503121561139b57600080fd5b8251915060208301516113ad8161104c565b809150509250929050565b6000602082840312156113ca57600080fd5b505191905056fea264697066735822122045cb83d524af3fbcc0d4435c9d27cab2131ea3963a246a7fb1e0151069ec9f0564736f6c63430008130033
Deployed Bytecode Sourcemap
25506:5669:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31011:161;;;;;;:::i;:::-;;:::i;:::-;;25554:47;;;;;;;;;529:25:1;;;517:2;502:18;25554:47:0;;;;;;;;25861:126;;25944:42;25861:126;;;;;-1:-1:-1;;;;;759:32:1;;;741:51;;729:2;714:18;25861:126:0;565:233:1;28569:179:0;;;;;;:::i;:::-;;:::i;28360:201::-;;;;;;:::i;:::-;;:::i;10916:86::-;10963:4;10987:7;-1:-1:-1;;;10987:7:0;;;;10916:86;;;2727:14:1;;2720:22;2702:41;;2690:2;2675:18;10916:86:0;2562:187:1;13691:103:0;;;:::i;28756:467::-;;;;;;:::i;:::-;;:::i;13050:87::-;13096:7;13123:6;-1:-1:-1;;;;;13123:6:0;13050:87;;27074:1278;;;;;;:::i;:::-;;:::i;30502:501::-;;;;;;:::i;:::-;;:::i;26206:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13949:201;;;;;;:::i;:::-;;:::i;31011:161::-;12936:13;:11;:13::i;:::-;31078:7:::1;31074:91;;;31102:8;:6;:8::i;:::-;31011:161:::0;:::o;31074:91::-:1;31143:10;:8;:10::i;28569:179::-:0;10521:19;:17;:19::i;:::-;28696:44:::1;28712:10;28724:7;28733:6;;28696:15;:44::i;:::-;28569:179:::0;;;:::o;28360:201::-;10521:19;:17;:19::i;:::-;28514:39:::1;28530:5;28537:7;28546:6;;28514:15;:39::i;:::-;28360:201:::0;;;;:::o;13691:103::-;12936:13;:11;:13::i;:::-;13756:30:::1;13783:1;13756:18;:30::i;:::-;13691:103::o:0;28756:467::-;10521:19;:17;:19::i;:::-;28961:32;;::::1;:67:::0;::::1;;;-1:-1:-1::0;28997:31:0;;::::1;28961:67;28939:142;;;::::0;-1:-1:-1;;;28939:142:0;;5087:2:1;28939:142:0::1;::::0;::::1;5069:21:1::0;5126:2;5106:18;;;5099:30;5165:27;5145:18;;;5138:55;5210:18;;28939:142:0::1;;;;;;;;;29099:9;29094:122;29114:17:::0;;::::1;29094:122;;;29153:51;29169:6;;29176:1;29169:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;29180:8;;29189:1;29180:11;;;;;;;:::i;:::-;;;;;;;29193:7;;29201:1;29193:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;29153:15;:51::i;:::-;29133:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29094:122;;;;28756:467:::0;;;;;;:::o;27074:1278::-;10521:19;:17;:19::i;:::-;27188:9:::1;27183:309;27203:20:::0;;::::1;27183:309;;;27245:15;27263:9;;27273:1;27263:12;;;;;;;:::i;:::-;27316:25;::::0;-1:-1:-1;;;27316:25:0;;27263:12:::1;::::0;;;::::1;::::0;;;::::1;;27316:25;::::0;::::1;529::1::0;;;27263:12:0;-1:-1:-1;27345:10:0::1;::::0;25734:42:::1;::::0;-1:-1:-1;27316:16:0::1;::::0;502:18:1;;27316:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27316:39:0::1;;27290:122;;;::::0;-1:-1:-1;;;27290:122:0;;6651:2:1;27290:122:0::1;::::0;::::1;6633:21:1::0;6690:2;6670:18;;;6663:30;-1:-1:-1;;;6709:18:1;;;6702:51;6770:18;;27290:122:0::1;6449:345:1::0;27290:122:0::1;25734:42;27429:21;27451:10;27463:7;13096::::0;13123:6;-1:-1:-1;;;;;13123:6:0;;13050:87;27463:7:::1;27429:51;::::0;-1:-1:-1;;;;;;27429:51:0::1;::::0;;;;;;-1:-1:-1;;;;;7057:15:1;;;27429:51:0::1;::::0;::::1;7039:34:1::0;7109:15;;7089:18;;;7082:43;7141:18;;;7134:34;;;6974:18;;27429:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27230:262;27225:3;;;;;:::i;:::-;;;;27183:309;;;-1:-1:-1::0;27540:12:0::1;::::0;27504:14:::1;::::0;27521:31:::1;::::0;:9;:31:::1;:::i;:::-;27591:440;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27591:440:0;;;25639:42:::1;27591:440;::::0;::::1;::::0;;;27684:10:::1;27591:440:::0;;;;26913:10:::1;27591:440:::0;;;;26965:4:::1;27591:440:::0;;;;27009:7:::1;27591:440:::0;;;;27054:11:::1;27591:440:::0;;;;-1:-1:-1;;;;;27591:440:0;::::1;::::0;;;;24634:20:::1;27591:440:::0;;;;;;;;;;;;;;;;;28068:41;;-1:-1:-1;;;28068:41:0;;25944:42:::1;28068:41;::::0;::::1;7526:51:1::0;7593:18;;;7586:34;;;27591:440:0;;-1:-1:-1;27591:440:0;28068:11:::1;::::0;7499:18:1;;28068:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28143:38:0::1;::::0;-1:-1:-1;;;28143:38:0;;28123:14:::1;::::0;25944:42:::1;::::0;28143:28:::1;::::0;:38:::1;::::0;28172:8;;28143:38:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28122:59:0;-1:-1:-1;26913:10:0::1;28244:15;:31;28240:105;;28292:41;::::0;-1:-1:-1;;;28292:41:0;;28323:1:::1;28292:41;::::0;::::1;10120:25:1::0;10161:18;;;10154:34;;;25944:42:0::1;::::0;28292:30:::1;::::0;10093:18:1;;28292:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28240:105;27172:1180;;;27074:1278:::0;;:::o;30502:501::-;12936:13;:11;:13::i;:::-;-1:-1:-1;;;;;30579:20:0;::::1;30587:1;30579:20:::0;30575:421:::1;;30658:12;13123:6:::0;;30676:87:::1;::::0;-1:-1:-1;;;;;13123:6:0;;;;30723:21:::1;::::0;30658:12;30676:87;30658:12;30676:87;30723:21;13123:6;30676:87:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30657:106;;;30786:7;30778:51;;;::::0;-1:-1:-1;;;30778:51:0;;10800:2:1;30778:51:0::1;::::0;::::1;10782:21:1::0;10839:2;10819:18;;;10812:30;10878:33;10858:18;;;10851:61;10929:18;;30778:51:0::1;10598:355:1::0;30778:51:0::1;30601:240;31011:161:::0;:::o;30575:421::-:1;30869:6;-1:-1:-1::0;;;;;30862:23:0::1;;30904:7;13096::::0;13123:6;-1:-1:-1;;;;;13123:6:0;;13050:87;30904:7:::1;30930:39;::::0;-1:-1:-1;;;30930:39:0;;30963:4:::1;30930:39;::::0;::::1;741:51:1::0;-1:-1:-1;;;;;30930:24:0;::::1;::::0;::::1;::::0;714:18:1;;30930:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30862:122;::::0;-1:-1:-1;;;;;;30862:122:0::1;::::0;;;;;;-1:-1:-1;;;;;7544:32:1;;;30862:122:0::1;::::0;::::1;7526:51:1::0;7593:18;;;7586:34;7499:18;;30862:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13949:201::-:0;12936:13;:11;:13::i;:::-;-1:-1:-1;;;;;14038:22:0;::::1;14030:73;;;::::0;-1:-1:-1;;;14030:73:0;;11160:2:1;14030:73:0::1;::::0;::::1;11142:21:1::0;11199:2;11179:18;;;11172:30;11238:34;11218:18;;;11211:62;-1:-1:-1;;;11289:18:1;;;11282:36;11335:19;;14030:73:0::1;10958:402:1::0;14030:73:0::1;14114:28;14133:8;14114:18;:28::i;13215:132::-:0;13096:7;13123:6;-1:-1:-1;;;;;13123:6:0;9195:10;13279:23;13271:68;;;;-1:-1:-1;;;13271:68:0;;11567:2:1;13271:68:0;;;11549:21:1;;;11586:18;;;11579:30;11645:34;11625:18;;;11618:62;11697:18;;13271:68:0;11365:356:1;11512:118:0;10521:19;:17;:19::i;:::-;11572:7:::1;:14:::0;;-1:-1:-1;;;;11572:14:0::1;-1:-1:-1::0;;;11572:14:0::1;::::0;;11602:20:::1;11609:12;9195:10:::0;;9115:98;11609:12:::1;11602:20;::::0;-1:-1:-1;;;;;759:32:1;;;741:51;;729:2;714:18;11602:20:0::1;;;;;;;11512:118::o:0;11771:120::-;10780:16;:14;:16::i;:::-;11840:5:::1;11830:15:::0;;-1:-1:-1;;;;11830:15:0::1;::::0;;11861:22:::1;9195:10:::0;11870:12:::1;9115:98:::0;11075:108;10963:4;10987:7;-1:-1:-1;;;10987:7:0;;;;11145:9;11137:38;;;;-1:-1:-1;;;11137:38:0;;11928:2:1;11137:38:0;;;11910:21:1;11967:2;11947:18;;;11940:30;-1:-1:-1;;;11986:18:1;;;11979:46;12042:18;;11137:38:0;11726:340:1;29231:1263:0;-1:-1:-1;;;;;29378:14:0;;;;;;:7;:14;;;;;;;;29377:15;29369:55;;;;-1:-1:-1;;;29369:55:0;;12273:2:1;29369:55:0;;;12255:21:1;12312:2;12292:18;;;12285:30;12351:29;12331:18;;;12324:57;12398:18;;29369:55:0;12071:351:1;29369:55:0;29499:32;;-1:-1:-1;;12604:2:1;12600:15;;;12596:53;29499:32:0;;;12584:66:1;12666:12;;;12659:28;;;29474:12:0;;12703::1;;29499:32:0;;;;;;;;;;;;29489:43;;;;;;29474:58;;29565:44;29584:6;;29565:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26055:66:0;;-1:-1:-1;29604:4:0;;-1:-1:-1;29565:18:0;;-1:-1:-1;29565:44:0:i;:::-;29543:120;;;;-1:-1:-1;;;29543:120:0;;12928:2:1;29543:120:0;;;12910:21:1;12967:2;12947:18;;;12940:30;13006:28;12986:18;;;12979:56;13052:18;;29543:120:0;12726:350:1;29543:120:0;-1:-1:-1;;;;;29676:14:0;;;;;;:7;:14;;;;;;;;:21;;-1:-1:-1;;29676:21:0;29693:4;29676:21;;;29736:436;;;;;;;;;;25639:42;29736:436;;;;;;;;;;;;;26913:10;29736:436;;;;26965:4;29736:436;;;;27009:7;29736:436;;;;27054:11;29736:436;;;;-1:-1:-1;;;;;29736:436:0;;;;;;24634:20;29676:21;29736:436;;;;;;;;;;;;;;;;30209:42;;-1:-1:-1;;;30209:42:0;;25944;30209;;;7526:51:1;7593:18;;;7586:34;;;30209:11:0;;7499:18:1;;30209:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30285:38:0;;-1:-1:-1;;;30285:38:0;;30265:14;;25944:42;;30285:28;;:38;;30314:8;;30285:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30264:59:0;-1:-1:-1;26913:10:0;30386:15;:31;30382:105;;30434:41;;-1:-1:-1;;;30434:41:0;;30465:1;30434:41;;;10120:25:1;10161:18;;;10154:34;;;25944:42:0;;30434:30;;10093:18:1;;30434:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29358:1136;;;29231:1263;;;;:::o;14310:191::-;14384:16;14403:6;;-1:-1:-1;;;;;14420:17:0;;;-1:-1:-1;;;;;;14420:17:0;;;;;;14453:40;;14403:6;;;;;;;14453:40;;14384:16;14453:40;14373:128;14310:191;:::o;11260:108::-;10963:4;10987:7;-1:-1:-1;;;10987:7:0;;;;11319:41;;;;-1:-1:-1;;;11319:41:0;;13283:2:1;11319:41:0;;;13265:21:1;13322:2;13302:18;;;13295:30;-1:-1:-1;;;13341:18:1;;;13334:50;13401:18;;11319:41:0;13081:344:1;15633:156:0;15724:4;15777;15748:25;15761:5;15768:4;15748:12;:25::i;:::-;:33;;15633:156;-1:-1:-1;;;;15633:156:0:o;16432:296::-;16515:7;16558:4;16515:7;16573:118;16597:5;:12;16593:1;:16;16573:118;;;16646:33;16656:12;16670:5;16676:1;16670:8;;;;;;;;:::i;:::-;;;;;;;16646:9;:33::i;:::-;16631:48;-1:-1:-1;16611:3:0;;;;:::i;:::-;;;;16573:118;;;-1:-1:-1;16708:12:0;-1:-1:-1;16432:296:0;;;;;:::o;23870:149::-;23933:7;23964:1;23960;:5;:51;;24095:13;24189:15;;;24225:4;24218:15;;;24272:4;24256:21;;23960:51;;;24095:13;24189:15;;;24225:4;24218:15;;;24272:4;24256:21;;23968:20;23953:58;23870:149;-1:-1:-1;;;23870:149:0:o;14:118:1:-;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:241;193:6;246:2;234:9;225:7;221:23;217:32;214:52;;;262:1;259;252:12;214:52;301:9;288:23;320:28;342:5;320:28;:::i;803:367::-;866:8;876:6;930:3;923:4;915:6;911:17;907:27;897:55;;948:1;945;938:12;897:55;-1:-1:-1;971:20:1;;1014:18;1003:30;;1000:50;;;1046:1;1043;1036:12;1000:50;1083:4;1075:6;1071:17;1059:29;;1143:3;1136:4;1126:6;1123:1;1119:14;1111:6;1107:27;1103:38;1100:47;1097:67;;;1160:1;1157;1150:12;1097:67;803:367;;;;;:::o;1175:505::-;1270:6;1278;1286;1339:2;1327:9;1318:7;1314:23;1310:32;1307:52;;;1355:1;1352;1345:12;1307:52;1391:9;1378:23;1368:33;;1452:2;1441:9;1437:18;1424:32;1479:18;1471:6;1468:30;1465:50;;;1511:1;1508;1501:12;1465:50;1550:70;1612:7;1603:6;1592:9;1588:22;1550:70;:::i;:::-;1175:505;;1639:8;;-1:-1:-1;1524:96:1;;-1:-1:-1;;;;1175:505:1:o;1685:131::-;-1:-1:-1;;;;;1760:31:1;;1750:42;;1740:70;;1806:1;1803;1796:12;1821:640;1925:6;1933;1941;1949;2002:2;1990:9;1981:7;1977:23;1973:32;1970:52;;;2018:1;2015;2008:12;1970:52;2057:9;2044:23;2076:31;2101:5;2076:31;:::i;:::-;2126:5;-1:-1:-1;2178:2:1;2163:18;;2150:32;;-1:-1:-1;2233:2:1;2218:18;;2205:32;2260:18;2249:30;;2246:50;;;2292:1;2289;2282:12;2246:50;2331:70;2393:7;2384:6;2373:9;2369:22;2331:70;:::i;:::-;1821:640;;;;-1:-1:-1;2420:8:1;-1:-1:-1;;;;1821:640:1:o;2754:1115::-;2939:6;2947;2955;2963;2971;2979;3032:2;3020:9;3011:7;3007:23;3003:32;3000:52;;;3048:1;3045;3038:12;3000:52;3088:9;3075:23;3117:18;3158:2;3150:6;3147:14;3144:34;;;3174:1;3171;3164:12;3144:34;3213:70;3275:7;3266:6;3255:9;3251:22;3213:70;:::i;:::-;3302:8;;-1:-1:-1;3187:96:1;-1:-1:-1;3390:2:1;3375:18;;3362:32;;-1:-1:-1;3406:16:1;;;3403:36;;;3435:1;3432;3425:12;3403:36;3474:72;3538:7;3527:8;3516:9;3512:24;3474:72;:::i;:::-;3565:8;;-1:-1:-1;3448:98:1;-1:-1:-1;3653:2:1;3638:18;;3625:32;;-1:-1:-1;3669:16:1;;;3666:36;;;3698:1;3695;3688:12;3666:36;;3737:72;3801:7;3790:8;3779:9;3775:24;3737:72;:::i;:::-;2754:1115;;;;-1:-1:-1;2754:1115:1;;-1:-1:-1;2754:1115:1;;3828:8;;2754:1115;-1:-1:-1;;;2754:1115:1:o;4191:437::-;4277:6;4285;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4394:9;4381:23;4427:18;4419:6;4416:30;4413:50;;;4459:1;4456;4449:12;4413:50;4498:70;4560:7;4551:6;4540:9;4536:22;4498:70;:::i;:::-;4587:8;;4472:96;;-1:-1:-1;4191:437:1;-1:-1:-1;;;;4191:437:1:o;4633:247::-;4692:6;4745:2;4733:9;4724:7;4720:23;4716:32;4713:52;;;4761:1;4758;4751:12;4713:52;4800:9;4787:23;4819:31;4844:5;4819:31;:::i;5239:127::-;5300:10;5295:3;5291:20;5288:1;5281:31;5331:4;5328:1;5321:15;5355:4;5352:1;5345:15;5371:545;5464:4;5470:6;5530:11;5517:25;5624:2;5620:7;5609:8;5593:14;5589:29;5585:43;5565:18;5561:68;5551:96;;5643:1;5640;5633:12;5551:96;5670:33;;5722:20;;;-1:-1:-1;5765:18:1;5754:30;;5751:50;;;5797:1;5794;5787:12;5751:50;5830:4;5818:17;;-1:-1:-1;5881:1:1;5877:14;;;5861;5857:35;5847:46;;5844:66;;;5906:1;5903;5896:12;5921:127;5982:10;5977:3;5973:20;5970:1;5963:31;6013:4;6010:1;6003:15;6037:4;6034:1;6027:15;6053:135;6092:3;6113:17;;;6110:43;;6133:18;;:::i;:::-;-1:-1:-1;6180:1:1;6169:13;;6053:135::o;6193:251::-;6263:6;6316:2;6304:9;6295:7;6291:23;6287:32;6284:52;;;6332:1;6329;6322:12;6284:52;6364:9;6358:16;6383:31;6408:5;6383:31;:::i;7179:168::-;7252:9;;;7283;;7300:15;;;7294:22;;7280:37;7270:71;;7321:18;;:::i;7631:245::-;7698:6;7751:2;7739:9;7730:7;7726:23;7722:32;7719:52;;;7767:1;7764;7757:12;7719:52;7799:9;7793:16;7818:28;7840:5;7818:28;:::i;8188:1428::-;8401:13;;8383:32;;8462:4;8450:17;;;8444:24;8370:3;8355:19;;;8477:54;;8510:20;;8444:24;-1:-1:-1;;;;;3940:31:1;3928:44;;3874:104;8477:54;;8580:4;8572:6;8568:17;8562:24;8595:56;8645:4;8634:9;8630:20;8614:14;-1:-1:-1;;;;;3940:31:1;3928:44;;3874:104;8595:56;;8700:4;8692:6;8688:17;8682:24;8715:55;8764:4;8753:9;8749:20;8733:14;7957;7946:26;7934:39;;7881:98;8715:55;;8819:4;8811:6;8807:17;8801:24;8834:55;8883:4;8872:9;8868:20;8852:14;8060:6;8049:18;8037:31;;7984:90;8834:55;;8938:4;8930:6;8926:17;8920:24;8953:55;9002:4;8991:9;8987:20;8971:14;7957;7946:26;7934:39;;7881:98;8953:55;;9057:4;9049:6;9045:17;9039:24;9072:55;9121:4;9110:9;9106:20;9090:14;7957;7946:26;7934:39;;7881:98;9072:55;;9176:4;9168:6;9164:17;9158:24;9191:56;9241:4;9230:9;9226:20;9210:14;-1:-1:-1;;;;;8145:31:1;8133:44;;8079:104;9191:56;-1:-1:-1;9266:6:1;9314:15;;;9308:22;9288:18;;;9281:50;9350:6;9393:15;;;9387:22;2536:13;2529:21;9450:18;;;2517:34;9488:6;9531:15;;;9525:22;-1:-1:-1;;;;;3940:31:1;9591:18;;;;3928:44;;;;8188:1428;:::o;9621:312::-;9700:6;9708;9761:2;9749:9;9740:7;9736:23;9732:32;9729:52;;;9777:1;9774;9767:12;9729:52;9806:9;9800:16;9790:26;;9859:2;9848:9;9844:18;9838:25;9872:31;9897:5;9872:31;:::i;:::-;9922:5;9912:15;;;9621:312;;;;;:::o;10199:184::-;10269:6;10322:2;10310:9;10301:7;10297:23;10293:32;10290:52;;;10338:1;10335;10328:12;10290:52;-1:-1:-1;10361:16:1;;10199:184;-1:-1:-1;10199:184:1:o
Swarm Source
ipfs://45cb83d524af3fbcc0d4435c9d27cab2131ea3963a246a7fb1e0151069ec9f05
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.