More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,382 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Batch Unstake NF... | 20803602 | 14 days ago | IN | 0 ETH | 0.00122503 | ||||
Batch Unstake NF... | 20803561 | 14 days ago | IN | 0 ETH | 0.0010978 | ||||
Batch Unstake NF... | 20803516 | 14 days ago | IN | 0 ETH | 0.00065483 | ||||
Batch Stake NFT | 20789268 | 16 days ago | IN | 0 ETH | 0.00046676 | ||||
Unstake NFT | 20472343 | 60 days ago | IN | 0 ETH | 0.0001367 | ||||
Batch Unstake NF... | 20443465 | 64 days ago | IN | 0 ETH | 0.0000662 | ||||
Batch Unstake NF... | 20292485 | 85 days ago | IN | 0 ETH | 0.00017846 | ||||
Batch Unstake NF... | 20292480 | 85 days ago | IN | 0 ETH | 0.0000686 | ||||
Batch Unstake NF... | 20282808 | 86 days ago | IN | 0 ETH | 0.00141414 | ||||
Batch Unstake NF... | 20276586 | 87 days ago | IN | 0 ETH | 0.00162935 | ||||
Batch Unstake NF... | 20194248 | 99 days ago | IN | 0 ETH | 0.00083541 | ||||
Batch Unstake NF... | 20182498 | 100 days ago | IN | 0 ETH | 0.00188666 | ||||
Batch Unstake NF... | 20153695 | 104 days ago | IN | 0 ETH | 0.00113907 | ||||
Batch Unstake NF... | 20153679 | 104 days ago | IN | 0 ETH | 0.00264349 | ||||
Batch Unstake NF... | 20153650 | 104 days ago | IN | 0 ETH | 0.00143761 | ||||
Batch Unstake NF... | 20150626 | 105 days ago | IN | 0 ETH | 0.00047855 | ||||
Batch Unstake NF... | 20150594 | 105 days ago | IN | 0 ETH | 0.00041095 | ||||
Batch Unstake NF... | 20150558 | 105 days ago | IN | 0 ETH | 0.00044077 | ||||
Batch Unstake NF... | 20150529 | 105 days ago | IN | 0 ETH | 0.00086967 | ||||
Batch Unstake NF... | 20150521 | 105 days ago | IN | 0 ETH | 0.0006066 | ||||
Batch Unstake NF... | 20150505 | 105 days ago | IN | 0 ETH | 0.00058932 | ||||
Batch Unstake NF... | 20129570 | 108 days ago | IN | 0 ETH | 0.00014427 | ||||
Batch Unstake NF... | 20113161 | 110 days ago | IN | 0 ETH | 0.00084456 | ||||
Unstake NFT | 20101006 | 112 days ago | IN | 0 ETH | 0.00019185 | ||||
Unstake NFT | 20051547 | 119 days ago | IN | 0 ETH | 0.00036701 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Staking
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-09 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/EternalsStaking.sol pragma solidity ^0.8.11; contract Staking is ERC721Holder, Ownable { using EnumerableSet for EnumerableSet.UintSet; using SafeMath for uint256; struct Staker { EnumerableSet.UintSet tokenIds; uint256 amount; } struct StakedNft { uint256 timestamp; uint256 stakedTime; uint256 lockedTime; } struct Collection { IERC721 NFT; uint256 lockTime; mapping(address => Staker) Stakers; mapping(uint256 => StakedNft) StakedNfts; mapping(uint256 => address) StakerAddresses; } Collection[] public nftPools; constructor() {} event Stake(address indexed owner, uint256 id, uint256 time); event Unstake(address indexed owner, uint256 id, uint256 time); function stakeNFT(uint256 _tokenId, uint256 _poolId) public { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; require(pool.NFT.balanceOf(msg.sender) >= 1, "Insufficient NFTs"); require(pool.NFT.ownerOf(_tokenId) == msg.sender, "NFT not owned"); pool.Stakers[msg.sender].amount = pool.Stakers[msg.sender].amount.add(1); pool.Stakers[msg.sender].tokenIds.add(_tokenId); StakedNft storage stakedNft = pool.StakedNfts[_tokenId]; stakedNft.lockedTime = block.timestamp.add(pool.lockTime); stakedNft.timestamp = block.timestamp; stakedNft.stakedTime = block.timestamp; pool.StakerAddresses[_tokenId] = msg.sender; pool.NFT.safeTransferFrom(msg.sender, address(this), _tokenId); emit Stake(msg.sender, _tokenId, block.timestamp); } function batchStakeNFT(uint256[] memory _tokenIds, uint256 _poolId) public { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; require(pool.NFT.balanceOf(msg.sender) >= _tokenIds.length, "Insufficient NFTs"); for(uint i = 0; i < _tokenIds.length; i++) { require(pool.NFT.ownerOf(_tokenIds[i]) == msg.sender, "NFT not owned"); pool.Stakers[msg.sender].amount = pool.Stakers[msg.sender].amount.add(1); pool.Stakers[msg.sender].tokenIds.add(_tokenIds[i]); StakedNft storage stakedNft = pool.StakedNfts[_tokenIds[i]]; stakedNft.lockedTime = block.timestamp.add(pool.lockTime); stakedNft.timestamp = block.timestamp; stakedNft.stakedTime = block.timestamp; pool.StakerAddresses[_tokenIds[i]] = msg.sender; pool.NFT.safeTransferFrom(msg.sender, address(this), _tokenIds[i]); emit Stake(msg.sender, _tokenIds[i], block.timestamp); } } function unstakeNFT(uint256 _tokenId, uint256 _poolId) public { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; require(block.timestamp >= pool.StakedNfts[_tokenId].lockedTime, "NFT locked for withdrawal"); require(pool.Stakers[msg.sender].amount > 0, "No staked NFTs"); require(pool.StakerAddresses[_tokenId] == msg.sender, "Token not owned"); pool.Stakers[msg.sender].amount = pool.Stakers[msg.sender].amount.sub(1); pool.StakerAddresses[_tokenId] = address(0); pool.Stakers[msg.sender].tokenIds.remove(_tokenId); pool.NFT.safeTransferFrom(address(this), msg.sender, _tokenId); emit Unstake(msg.sender, _tokenId, block.timestamp); } function batchUnstakeNFT(uint256[] memory _tokenIds, uint256 _poolId) public { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; require(pool.Stakers[msg.sender].amount >= _tokenIds.length, "Not enough staked NFTs"); for (uint i = 0; i < _tokenIds.length; i++) { if(pool.StakerAddresses[_tokenIds[i]] == msg.sender && block.timestamp >= pool.StakedNfts[_tokenIds[i]].lockedTime) { pool.Stakers[msg.sender].amount = pool.Stakers[msg.sender].amount.sub(1); pool.StakerAddresses[_tokenIds[i]] = address(0); pool.Stakers[msg.sender].tokenIds.remove(_tokenIds[i]); pool.NFT.safeTransferFrom(address(this), msg.sender, _tokenIds[i]); emit Unstake(msg.sender, _tokenIds[i], block.timestamp); } } } function claimRewards(uint256 _tokenId, uint256 _poolId) public { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; require(pool.Stakers[msg.sender].amount > 0, "No staked NFTs"); require(pool.StakerAddresses[_tokenId] == msg.sender, "Token not owned"); pool.StakedNfts[_tokenId].timestamp = block.timestamp; } function addPool(address _nftAddress, uint256 _lockTime) external onlyOwner { Collection storage newCollection = nftPools.push(); newCollection.NFT = IERC721(_nftAddress); newCollection.lockTime = _lockTime; } function getPool(uint256 _poolId) public view returns(IERC721, uint256) { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; return (pool.NFT, pool.lockTime); } function getStakedNft(uint256 _tokenId, uint256 _poolId) public view returns(uint256, uint256, uint256) { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; StakedNft storage stakedNft = pool.StakedNfts[_tokenId]; return (stakedNft.timestamp, stakedNft.lockedTime, stakedNft.stakedTime); } function getStakerInfo(address _stakerAddress, uint256 _poolId) public view returns(uint256, uint256[] memory) { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; Staker storage staker = pool.Stakers[_stakerAddress]; uint256[] memory stakedTokenIds = new uint256[](staker.tokenIds.length()); for(uint i = 0; i < staker.tokenIds.length(); i++){ stakedTokenIds[i] = staker.tokenIds.at(i); } return (staker.amount, stakedTokenIds); } function getStakedTokenOwner(uint256 _tokenId, uint256 _poolId) public view returns(address) { require(_poolId < nftPools.length, "Pool does not exist!"); Collection storage pool = nftPools[_poolId]; return pool.StakerAddresses[_tokenId]; } function getPoolSize() public view returns(uint256) { return nftPools.length; } }
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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_lockTime","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"batchStakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"batchUnstakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getPool","outputs":[{"internalType":"contract IERC721","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStakedNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStakedTokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStakerInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftPools","outputs":[{"internalType":"contract IERC721","name":"NFT","type":"address"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"stakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"unstakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6119fc8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063ce74f8a811610066578063ce74f8a81461024a578063e101487814610278578063e295ddca1461028b578063f2fde38b1461029e57600080fd5b8063715018a6146101fd5780637f5941b4146102055780638da5cb5b146102265780638da7be7b1461023757600080fd5b806332a9caba116100d357806332a9caba146101af5780634ecb98e3146101c457806351cecc80146101d7578063594dd432146101ea57600080fd5b8063068bcd8d14610105578063150b7a021461013c57806323845e4b14610173578063313fb65814610184575b600080fd5b610118610113366004611614565b6102b1565b604080516001600160a01b0390931683526020830191909152015b60405180910390f35b61015a61014a366004611689565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610133565b600154604051908152602001610133565b61019761019236600461174d565b610322565b6040516001600160a01b039091168152602001610133565b6101c26101bd36600461176f565b61038e565b005b6101c26101d236600461174d565b610412565b6101c26101e536600461174d565b610677565b6101c26101f836600461174d565b61095d565b6101c2610a64565b61021861021336600461176f565b610a78565b60405161013392919061179b565b6000546001600160a01b0316610197565b6101c26102453660046117e9565b610b8b565b61025d61025836600461174d565b610ea2565b60408051938452602084019290925290820152606001610133565b610118610286366004611614565b610f1b565b6101c26102993660046117e9565b610f53565b6101c26102ac366004611895565b611338565b600154600090819083106102e05760405162461bcd60e51b81526004016102d7906118b2565b60405180910390fd5b6000600184815481106102f5576102f56118e0565b6000918252602090912060059091020180546001909101546001600160a01b039091169590945092505050565b60015460009082106103465760405162461bcd60e51b81526004016102d7906118b2565b60006001838154811061035b5761035b6118e0565b60009182526020808320878452600460059093020191909101905260409020546001600160a01b03169150505b92915050565b6103966113b1565b6001805480820182556000919091526005027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6810180546001600160a01b039094166001600160a01b0319909416939093179092557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf790910155565b60015481106104335760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610448576104486118e0565b90600052602060002090600502019050806003016000848152602001908152602001600020600201544210156104c05760405162461bcd60e51b815260206004820152601960248201527f4e4654206c6f636b656420666f72207769746864726177616c0000000000000060448201526064016102d7565b3360009081526002808301602052604090912001546105125760405162461bcd60e51b815260206004820152600e60248201526d4e6f207374616b6564204e46547360901b60448201526064016102d7565b60008381526004820160205260409020546001600160a01b0316331461056c5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd081bdddb9959608a1b60448201526064016102d7565b33600090815260028083016020526040909120015461058c90600161140b565b3360008181526002808501602081815260408085209384019690965588845260048701815294832080546001600160a01b03191690559290915291526105d2908461141e565b508054604051632142170760e11b81526001600160a01b03909116906342842e0e90610606903090339088906004016118f6565b600060405180830381600087803b15801561062057600080fd5b505af1158015610634573d6000803e3d6000fd5b5050604080518681524260208201523393507ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb28092500160405180910390a2505050565b60015481106106985760405162461bcd60e51b81526004016102d7906118b2565b6000600182815481106106ad576106ad6118e0565b6000918252602090912060059091020180546040516370a0823160e01b81523360048201529192506001916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561070a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072e919061191a565b10156107705760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74204e46547360781b60448201526064016102d7565b80546040516331a9108f60e11b81526004810185905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611933565b6001600160a01b0316146108225760405162461bcd60e51b815260206004820152600d60248201526c139195081b9bdd081bdddb9959609a1b60448201526064016102d7565b33600090815260028083016020526040909120015461084290600161142a565b33600090815260028084016020526040909120908101919091556108669084611436565b5060008381526003820160205260409020600182015461088790429061142a565b60028201554280825560018201556000848152600480840160205260409182902080546001600160a01b0319163390811790915584549251632142170760e11b81526001600160a01b0393909316926342842e0e926108eb929130918a91016118f6565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b5050604080518781524260208201523393507f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b692500160405180910390a250505050565b600154811061097e5760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610993576109936118e0565b600091825260208083203384526002600590930201828101909152604090922001549091506109f55760405162461bcd60e51b815260206004820152600e60248201526d4e6f207374616b6564204e46547360901b60448201526064016102d7565b60008381526004820160205260409020546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd081bdddb9959608a1b60448201526064016102d7565b60009283526003016020525060409020429055565b610a6c6113b1565b610a766000611442565b565b6001546000906060908310610a9f5760405162461bcd60e51b81526004016102d7906118b2565b600060018481548110610ab457610ab46118e0565b600091825260208083206001600160a01b0389168452600260059093020191820190526040822090925090610ae882611492565b67ffffffffffffffff811115610b0057610b00611642565b604051908082528060200260200182016040528015610b29578160200160208202803683370190505b50905060005b610b3883611492565b811015610b7857610b49838261149c565b828281518110610b5b57610b5b6118e0565b602090810291909101015280610b7081611966565b915050610b2f565b5060029091015493509150509250929050565b6001548110610bac5760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610bc157610bc16118e0565b906000526020600020906005020190508251816002016000336001600160a01b03166001600160a01b03168152602001908152602001600020600201541015610c455760405162461bcd60e51b81526020600482015260166024820152754e6f7420656e6f756768207374616b6564204e46547360501b60448201526064016102d7565b60005b8351811015610e9c57336001600160a01b0316826004016000868481518110610c7357610c736118e0565b6020908102919091018101518252810191909152604001600020546001600160a01b0316148015610cd55750816003016000858381518110610cb757610cb76118e0565b60200260200101518152602001908152602001600020600201544210155b15610e8a57336000908152600280840160205260409091200154610cfa90600161140b565b3360009081526002808501602052604082200191909155845160048401908290879085908110610d2c57610d2c6118e0565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d9f848281518110610d7b57610d7b6118e0565b6020908102919091018101513360009081526002860190925260409091209061141e565b50815484516001600160a01b03909116906342842e0e9030903390889086908110610dcc57610dcc6118e0565b60200260200101516040518463ffffffff1660e01b8152600401610df2939291906118f6565b600060405180830381600087803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b50505050336001600160a01b03167ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280858381518110610e6157610e616118e0565b602002602001015142604051610e81929190918252602082015260400190565b60405180910390a25b80610e9481611966565b915050610c48565b50505050565b60008060006001805490508410610ecb5760405162461bcd60e51b81526004016102d7906118b2565b600060018581548110610ee057610ee06118e0565b600091825260208083209883526005919091029097016003019096525050604090932080546002820154600190920154909591945092509050565b60018181548110610f2b57600080fd5b6000918252602090912060059091020180546001909101546001600160a01b03909116915082565b6001548110610f745760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610f8957610f896118e0565b60009182526020909120845160059092020180546040516370a0823160e01b81523360048201529193506001600160a01b0316906370a0823190602401602060405180830381865afa158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611007919061191a565b10156110495760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74204e46547360781b60448201526064016102d7565b60005b8351811015610e9c578154845133916001600160a01b031690636352211e9087908590811061107d5761107d6118e0565b60200260200101516040518263ffffffff1660e01b81526004016110a391815260200190565b602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190611933565b6001600160a01b03161461112a5760405162461bcd60e51b815260206004820152600d60248201526c139195081b9bdd081bdddb9959609a1b60448201526064016102d7565b33600090815260028084016020526040909120015461114a90600161142a565b336000908152600280850160205260409091200155835161119b90859083908110611177576111776118e0565b60209081029190910181015133600090815260028601909252604090912090611436565b5060008260030160008684815181106111b6576111b66118e0565b6020026020010151815260200190815260200160002090506111e583600101544261142a90919063ffffffff16565b6002820155428082556001820155845133906004850190600090889086908110611211576112116118e0565b602090810291909101810151825281019190915260400160002080546001600160a01b0319166001600160a01b03928316179055835486519116906342842e0e9033903090899087908110611268576112686118e0565b60200260200101516040518463ffffffff1660e01b815260040161128e939291906118f6565b600060405180830381600087803b1580156112a857600080fd5b505af11580156112bc573d6000803e3d6000fd5b50505050336001600160a01b03167f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b68684815181106112fd576112fd6118e0565b60200260200101514260405161131d929190918252602082015260400190565b60405180910390a2508061133081611966565b91505061104c565b6113406113b1565b6001600160a01b0381166113a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102d7565b6113ae81611442565b50565b6000546001600160a01b03163314610a765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102d7565b60006114178284611981565b9392505050565b600061141783836114a8565b60006114178284611998565b6000611417838361159b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610388825490565b600061141783836115ea565b600081815260018301602052604081205480156115915760006114cc600183611981565b85549091506000906114e090600190611981565b9050818114611545576000866000018281548110611500576115006118e0565b9060005260206000200154905080876000018481548110611523576115236118e0565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611556576115566119b0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610388565b6000915050610388565b60008181526001830160205260408120546115e257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610388565b506000610388565b6000826000018281548110611601576116016118e0565b9060005260206000200154905092915050565b60006020828403121561162657600080fd5b5035919050565b6001600160a01b03811681146113ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168157611681611642565b604052919050565b6000806000806080858703121561169f57600080fd5b84356116aa8161162d565b93506020858101356116bb8161162d565b935060408601359250606086013567ffffffffffffffff808211156116df57600080fd5b818801915088601f8301126116f357600080fd5b81358181111561170557611705611642565b611717601f8201601f19168501611658565b9150808252898482850101111561172d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561176057600080fd5b50508035926020909101359150565b6000806040838503121561178257600080fd5b823561178d8161162d565b946020939093013593505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156117dc578451835293830193918301916001016117c0565b5090979650505050505050565b600080604083850312156117fc57600080fd5b823567ffffffffffffffff8082111561181457600080fd5b818501915085601f83011261182857600080fd5b813560208282111561183c5761183c611642565b8160051b925061184d818401611658565b828152928401810192818101908985111561186757600080fd5b948201945b848610156118855785358252948201949082019061186c565b9997909101359750505050505050565b6000602082840312156118a757600080fd5b81356114178161162d565b602080825260149082015273506f6f6c20646f6573206e6f742065786973742160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81516114178161162d565b634e487b7160e01b600052601160045260246000fd5b600060001982141561197a5761197a611950565b5060010190565b60008282101561199357611993611950565b500390565b600082198211156119ab576119ab611950565b500190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220039dc89baf1a4c4704d7f66323ca3d53418eeeb099dca262fa2899002ead030264736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063ce74f8a811610066578063ce74f8a81461024a578063e101487814610278578063e295ddca1461028b578063f2fde38b1461029e57600080fd5b8063715018a6146101fd5780637f5941b4146102055780638da5cb5b146102265780638da7be7b1461023757600080fd5b806332a9caba116100d357806332a9caba146101af5780634ecb98e3146101c457806351cecc80146101d7578063594dd432146101ea57600080fd5b8063068bcd8d14610105578063150b7a021461013c57806323845e4b14610173578063313fb65814610184575b600080fd5b610118610113366004611614565b6102b1565b604080516001600160a01b0390931683526020830191909152015b60405180910390f35b61015a61014a366004611689565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610133565b600154604051908152602001610133565b61019761019236600461174d565b610322565b6040516001600160a01b039091168152602001610133565b6101c26101bd36600461176f565b61038e565b005b6101c26101d236600461174d565b610412565b6101c26101e536600461174d565b610677565b6101c26101f836600461174d565b61095d565b6101c2610a64565b61021861021336600461176f565b610a78565b60405161013392919061179b565b6000546001600160a01b0316610197565b6101c26102453660046117e9565b610b8b565b61025d61025836600461174d565b610ea2565b60408051938452602084019290925290820152606001610133565b610118610286366004611614565b610f1b565b6101c26102993660046117e9565b610f53565b6101c26102ac366004611895565b611338565b600154600090819083106102e05760405162461bcd60e51b81526004016102d7906118b2565b60405180910390fd5b6000600184815481106102f5576102f56118e0565b6000918252602090912060059091020180546001909101546001600160a01b039091169590945092505050565b60015460009082106103465760405162461bcd60e51b81526004016102d7906118b2565b60006001838154811061035b5761035b6118e0565b60009182526020808320878452600460059093020191909101905260409020546001600160a01b03169150505b92915050565b6103966113b1565b6001805480820182556000919091526005027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6810180546001600160a01b039094166001600160a01b0319909416939093179092557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf790910155565b60015481106104335760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610448576104486118e0565b90600052602060002090600502019050806003016000848152602001908152602001600020600201544210156104c05760405162461bcd60e51b815260206004820152601960248201527f4e4654206c6f636b656420666f72207769746864726177616c0000000000000060448201526064016102d7565b3360009081526002808301602052604090912001546105125760405162461bcd60e51b815260206004820152600e60248201526d4e6f207374616b6564204e46547360901b60448201526064016102d7565b60008381526004820160205260409020546001600160a01b0316331461056c5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd081bdddb9959608a1b60448201526064016102d7565b33600090815260028083016020526040909120015461058c90600161140b565b3360008181526002808501602081815260408085209384019690965588845260048701815294832080546001600160a01b03191690559290915291526105d2908461141e565b508054604051632142170760e11b81526001600160a01b03909116906342842e0e90610606903090339088906004016118f6565b600060405180830381600087803b15801561062057600080fd5b505af1158015610634573d6000803e3d6000fd5b5050604080518681524260208201523393507ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb28092500160405180910390a2505050565b60015481106106985760405162461bcd60e51b81526004016102d7906118b2565b6000600182815481106106ad576106ad6118e0565b6000918252602090912060059091020180546040516370a0823160e01b81523360048201529192506001916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561070a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072e919061191a565b10156107705760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74204e46547360781b60448201526064016102d7565b80546040516331a9108f60e11b81526004810185905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611933565b6001600160a01b0316146108225760405162461bcd60e51b815260206004820152600d60248201526c139195081b9bdd081bdddb9959609a1b60448201526064016102d7565b33600090815260028083016020526040909120015461084290600161142a565b33600090815260028084016020526040909120908101919091556108669084611436565b5060008381526003820160205260409020600182015461088790429061142a565b60028201554280825560018201556000848152600480840160205260409182902080546001600160a01b0319163390811790915584549251632142170760e11b81526001600160a01b0393909316926342842e0e926108eb929130918a91016118f6565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b5050604080518781524260208201523393507f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b692500160405180910390a250505050565b600154811061097e5760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610993576109936118e0565b600091825260208083203384526002600590930201828101909152604090922001549091506109f55760405162461bcd60e51b815260206004820152600e60248201526d4e6f207374616b6564204e46547360901b60448201526064016102d7565b60008381526004820160205260409020546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd081bdddb9959608a1b60448201526064016102d7565b60009283526003016020525060409020429055565b610a6c6113b1565b610a766000611442565b565b6001546000906060908310610a9f5760405162461bcd60e51b81526004016102d7906118b2565b600060018481548110610ab457610ab46118e0565b600091825260208083206001600160a01b0389168452600260059093020191820190526040822090925090610ae882611492565b67ffffffffffffffff811115610b0057610b00611642565b604051908082528060200260200182016040528015610b29578160200160208202803683370190505b50905060005b610b3883611492565b811015610b7857610b49838261149c565b828281518110610b5b57610b5b6118e0565b602090810291909101015280610b7081611966565b915050610b2f565b5060029091015493509150509250929050565b6001548110610bac5760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610bc157610bc16118e0565b906000526020600020906005020190508251816002016000336001600160a01b03166001600160a01b03168152602001908152602001600020600201541015610c455760405162461bcd60e51b81526020600482015260166024820152754e6f7420656e6f756768207374616b6564204e46547360501b60448201526064016102d7565b60005b8351811015610e9c57336001600160a01b0316826004016000868481518110610c7357610c736118e0565b6020908102919091018101518252810191909152604001600020546001600160a01b0316148015610cd55750816003016000858381518110610cb757610cb76118e0565b60200260200101518152602001908152602001600020600201544210155b15610e8a57336000908152600280840160205260409091200154610cfa90600161140b565b3360009081526002808501602052604082200191909155845160048401908290879085908110610d2c57610d2c6118e0565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d9f848281518110610d7b57610d7b6118e0565b6020908102919091018101513360009081526002860190925260409091209061141e565b50815484516001600160a01b03909116906342842e0e9030903390889086908110610dcc57610dcc6118e0565b60200260200101516040518463ffffffff1660e01b8152600401610df2939291906118f6565b600060405180830381600087803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b50505050336001600160a01b03167ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280858381518110610e6157610e616118e0565b602002602001015142604051610e81929190918252602082015260400190565b60405180910390a25b80610e9481611966565b915050610c48565b50505050565b60008060006001805490508410610ecb5760405162461bcd60e51b81526004016102d7906118b2565b600060018581548110610ee057610ee06118e0565b600091825260208083209883526005919091029097016003019096525050604090932080546002820154600190920154909591945092509050565b60018181548110610f2b57600080fd5b6000918252602090912060059091020180546001909101546001600160a01b03909116915082565b6001548110610f745760405162461bcd60e51b81526004016102d7906118b2565b600060018281548110610f8957610f896118e0565b60009182526020909120845160059092020180546040516370a0823160e01b81523360048201529193506001600160a01b0316906370a0823190602401602060405180830381865afa158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611007919061191a565b10156110495760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74204e46547360781b60448201526064016102d7565b60005b8351811015610e9c578154845133916001600160a01b031690636352211e9087908590811061107d5761107d6118e0565b60200260200101516040518263ffffffff1660e01b81526004016110a391815260200190565b602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190611933565b6001600160a01b03161461112a5760405162461bcd60e51b815260206004820152600d60248201526c139195081b9bdd081bdddb9959609a1b60448201526064016102d7565b33600090815260028084016020526040909120015461114a90600161142a565b336000908152600280850160205260409091200155835161119b90859083908110611177576111776118e0565b60209081029190910181015133600090815260028601909252604090912090611436565b5060008260030160008684815181106111b6576111b66118e0565b6020026020010151815260200190815260200160002090506111e583600101544261142a90919063ffffffff16565b6002820155428082556001820155845133906004850190600090889086908110611211576112116118e0565b602090810291909101810151825281019190915260400160002080546001600160a01b0319166001600160a01b03928316179055835486519116906342842e0e9033903090899087908110611268576112686118e0565b60200260200101516040518463ffffffff1660e01b815260040161128e939291906118f6565b600060405180830381600087803b1580156112a857600080fd5b505af11580156112bc573d6000803e3d6000fd5b50505050336001600160a01b03167f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b68684815181106112fd576112fd6118e0565b60200260200101514260405161131d929190918252602082015260400190565b60405180910390a2508061133081611966565b91505061104c565b6113406113b1565b6001600160a01b0381166113a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102d7565b6113ae81611442565b50565b6000546001600160a01b03163314610a765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102d7565b60006114178284611981565b9392505050565b600061141783836114a8565b60006114178284611998565b6000611417838361159b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610388825490565b600061141783836115ea565b600081815260018301602052604081205480156115915760006114cc600183611981565b85549091506000906114e090600190611981565b9050818114611545576000866000018281548110611500576115006118e0565b9060005260206000200154905080876000018481548110611523576115236118e0565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611556576115566119b0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610388565b6000915050610388565b60008181526001830160205260408120546115e257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610388565b506000610388565b6000826000018281548110611601576116016118e0565b9060005260206000200154905092915050565b60006020828403121561162657600080fd5b5035919050565b6001600160a01b03811681146113ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168157611681611642565b604052919050565b6000806000806080858703121561169f57600080fd5b84356116aa8161162d565b93506020858101356116bb8161162d565b935060408601359250606086013567ffffffffffffffff808211156116df57600080fd5b818801915088601f8301126116f357600080fd5b81358181111561170557611705611642565b611717601f8201601f19168501611658565b9150808252898482850101111561172d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561176057600080fd5b50508035926020909101359150565b6000806040838503121561178257600080fd5b823561178d8161162d565b946020939093013593505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156117dc578451835293830193918301916001016117c0565b5090979650505050505050565b600080604083850312156117fc57600080fd5b823567ffffffffffffffff8082111561181457600080fd5b818501915085601f83011261182857600080fd5b813560208282111561183c5761183c611642565b8160051b925061184d818401611658565b828152928401810192818101908985111561186757600080fd5b948201945b848610156118855785358252948201949082019061186c565b9997909101359750505050505050565b6000602082840312156118a757600080fd5b81356114178161162d565b602080825260149082015273506f6f6c20646f6573206e6f742065786973742160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561192c57600080fd5b5051919050565b60006020828403121561194557600080fd5b81516114178161162d565b634e487b7160e01b600052601160045260246000fd5b600060001982141561197a5761197a611950565b5060010190565b60008282101561199357611993611950565b500390565b600082198211156119ab576119ab611950565b500190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220039dc89baf1a4c4704d7f66323ca3d53418eeeb099dca262fa2899002ead030264736f6c634300080b0033
Deployed Bytecode Sourcemap
31417:6784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36601:246;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;407:32:1;;;389:51;;471:2;456:18;;449:34;;;;362:18;36601:246:0;;;;;;;;21735:207;;;;;;:::i;:::-;-1:-1:-1;;;21735:207:0;;;;;;;;;;-1:-1:-1;;;;;;2317:33:1;;;2299:52;;2287:2;2272:18;21735:207:0;2155:202:1;38105:93:0;38175:8;:15;38105:93;;2508:25:1;;;2496:2;2481:18;38105:93:0;2362:177:1;37825:272:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2961:32:1;;;2943:51;;2931:2;2916:18;37825:272:0;2797:203:1;36352:241:0;;;;;;:::i;:::-;;:::i;:::-;;34199:792;;;;;;:::i;:::-;;:::i;32200:913::-;;;;;;:::i;:::-;;:::i;35919:425::-;;;;;;:::i;:::-;;:::i;30516:103::-;;;:::i;37247:570::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;29868:87::-;29914:7;29941:6;-1:-1:-1;;;;;29941:6:0;29868:87;;34999:912;;;;;;:::i;:::-;;:::i;36855:384::-;;;;;;:::i;:::-;;:::i;:::-;;;;5256:25:1;;;5312:2;5297:18;;5290:34;;;;5340:18;;;5333:34;5244:2;5229:18;36855:384:0;5054:319:1;32001:28:0;;;;;;:::i;:::-;;:::i;33121:1070::-;;;;;;:::i;:::-;;:::i;30774:201::-;;;;;;:::i;:::-;;:::i;36601:246::-;36702:8;:15;36655:7;;;;36692:25;;36684:58;;;;-1:-1:-1;;;36684:58:0;;;;;;;:::i;:::-;;;;;;;;;36753:23;36779:8;36788:7;36779:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;36815:8;;;36825:13;;;;-1:-1:-1;;;;;36815:8:0;;;;36825:13;;-1:-1:-1;36601:246:0;-1:-1:-1;;;36601:246:0:o;37825:272::-;37947:8;:15;37909:7;;37937:25;;37929:58;;;;-1:-1:-1;;;37929:58:0;;;;;;;:::i;:::-;37998:23;38024:8;38033:7;38024:17;;;;;;;;:::i;:::-;;;;;;;;;38059:30;;;:20;38024:17;;;;;38059:20;;;;:30;;;;;;-1:-1:-1;;;;;38059:30:0;;-1:-1:-1;;37825:272:0;;;;;:::o;36352:241::-;29754:13;:11;:13::i;:::-;36474:8:::1;:15:::0;;;;::::1;::::0;;36439:32:::1;36474:15:::0;;;;::::1;;::::0;;::::1;36500:40:::0;;-1:-1:-1;;;;;36500:40:0;;::::1;-1:-1:-1::0;;;;;;36500:40:0;;::::1;::::0;;;::::1;::::0;;;36551:22;;;;:34;36352:241::o;34199:792::-;34290:8;:15;34280:25;;34272:58;;;;-1:-1:-1;;;34272:58:0;;;;;;;:::i;:::-;34341:23;34367:8;34376:7;34367:17;;;;;;;;:::i;:::-;;;;;;;;;;;34341:43;;34422:4;:15;;:25;34438:8;34422:25;;;;;;;;;;;:36;;;34403:15;:55;;34395:93;;;;-1:-1:-1;;;34395:93:0;;6313:2:1;34395:93:0;;;6295:21:1;6352:2;6332:18;;;6325:30;6391:27;6371:18;;;6364:55;6436:18;;34395:93:0;6111:349:1;34395:93:0;34520:10;34541:1;34507:24;;;:12;;;;:24;;;;;;:31;;34499:62;;;;-1:-1:-1;;;34499:62:0;;6667:2:1;34499:62:0;;;6649:21:1;6706:2;6686:18;;;6679:30;-1:-1:-1;;;6725:18:1;;;6718:44;6779:18;;34499:62:0;6465:338:1;34499:62:0;34580:30;;;;:20;;;:30;;;;;;-1:-1:-1;;;;;34580:30:0;34614:10;34580:44;34572:72;;;;-1:-1:-1;;;34572:72:0;;7010:2:1;34572:72:0;;;6992:21:1;7049:2;7029:18;;;7022:30;-1:-1:-1;;;7068:18:1;;;7061:45;7123:18;;34572:72:0;6808:339:1;34572:72:0;34704:10;34691:24;;;;:12;;;;:24;;;;;;:31;;:38;;34727:1;34691:35;:38::i;:::-;34670:10;34657:24;;;;:12;;;;:24;;;;;;;;:31;;;:72;;;;34740:30;;;:20;;;:30;;;;;:43;;-1:-1:-1;;;;;;34740:43:0;;;34794:24;;;;;;:50;;34761:8;34794:40;:50::i;:::-;-1:-1:-1;34857:8:0;;:62;;-1:-1:-1;;;34857:62:0;;-1:-1:-1;;;;;34857:8:0;;;;:25;;:62;;34891:4;;34898:10;;34910:8;;34857:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34937:46:0;;;7706:25:1;;;34967:15:0;7762:2:1;7747:18;;7740:34;34945:10:0;;-1:-1:-1;34937:46:0;;-1:-1:-1;7679:18:1;34937:46:0;;;;;;;34261:730;34199:792;;:::o;32200:913::-;32289:8;:15;32279:25;;32271:58;;;;-1:-1:-1;;;32271:58:0;;;;;;;:::i;:::-;32340:23;32366:8;32375:7;32366:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;32402:8;;:30;;-1:-1:-1;;;32402:30:0;;32421:10;32402:30;;;2943:51:1;32366:17:0;;-1:-1:-1;32436:1:0;;-1:-1:-1;;;;;32402:8:0;;;;:18;;2916::1;;32402:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;32394:65;;;;-1:-1:-1;;;32394:65:0;;8176:2:1;32394:65:0;;;8158:21:1;8215:2;8195:18;;;8188:30;-1:-1:-1;;;8234:18:1;;;8227:47;8291:18;;32394:65:0;7974:341:1;32394:65:0;32478:8;;:26;;-1:-1:-1;;;32478:26:0;;;;;2508:25:1;;;32508:10:0;;-1:-1:-1;;;;;32478:8:0;;:16;;2481:18:1;;32478:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32478:40:0;;32470:66;;;;-1:-1:-1;;;32470:66:0;;8778:2:1;32470:66:0;;;8760:21:1;8817:2;8797:18;;;8790:30;-1:-1:-1;;;8836:18:1;;;8829:43;8889:18;;32470:66:0;8576:337:1;32470:66:0;32596:10;32583:24;;;;:12;;;;:24;;;;;;:31;;:38;;32619:1;32583:35;:38::i;:::-;32562:10;32549:24;;;;:12;;;;:24;;;;;;:31;;;:72;;;;32632:47;;32670:8;32632:37;:47::i;:::-;-1:-1:-1;32692:27:0;32722:25;;;:15;;;:25;;;;;32801:13;;;;32781:34;;:15;;:19;:34::i;:::-;32758:20;;;:57;32848:15;32826:37;;;32874:20;;;:38;32826:19;32925:30;;;:20;;;;:30;;;;;;;:43;;-1:-1:-1;;;;;;32925:43:0;32958:10;32925:43;;;;;;32981:8;;:62;;-1:-1:-1;;;32981:62:0;;-1:-1:-1;;;;;32981:8:0;;;;;:25;;:62;;32958:10;33027:4;;32946:8;;32981:62;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33061:44:0;;;7706:25:1;;;33089:15:0;7762:2:1;7747:18;;7740:34;33067:10:0;;-1:-1:-1;33061:44:0;;-1:-1:-1;7679:18:1;33061:44:0;;;;;;;32260:853;;32200:913;;:::o;35919:425::-;36012:8;:15;36002:25;;35994:58;;;;-1:-1:-1;;;35994:58:0;;;;;;;:::i;:::-;36063:23;36089:8;36098:7;36089:17;;;;;;;;:::i;:::-;;;;;;;;;36138:10;36125:24;;:12;36089:17;;;;;36125:12;;;:24;;;;;;;:31;;36089:17;;-1:-1:-1;36117:62:0;;;;-1:-1:-1;;;36117:62:0;;6667:2:1;36117:62:0;;;6649:21:1;6706:2;6686:18;;;6679:30;-1:-1:-1;;;6725:18:1;;;6718:44;6779:18;;36117:62:0;6465:338:1;36117:62:0;36198:30;;;;:20;;;:30;;;;;;-1:-1:-1;;;;;36198:30:0;36232:10;36198:44;36190:72;;;;-1:-1:-1;;;36190:72:0;;7010:2:1;36190:72:0;;;6992:21:1;7049:2;7029:18;;;7022:30;-1:-1:-1;;;7068:18:1;;;7061:45;7123:18;;36190:72:0;6808:339:1;36190:72:0;36275:25;;;;:15;;:25;;-1:-1:-1;36275:25:0;;;36313:15;36275:53;;35919:425::o;30516:103::-;29754:13;:11;:13::i;:::-;30581:30:::1;30608:1;30581:18;:30::i;:::-;30516:103::o:0;37247:570::-;37387:8;:15;37331:7;;37340:16;;37377:25;;37369:58;;;;-1:-1:-1;;;37369:58:0;;;;;;;:::i;:::-;37438:23;37464:8;37473:7;37464:17;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;37516:28:0;;;;:12;37464:17;;;;;37516:12;;;:28;;;;;37464:17;;-1:-1:-1;37516:28:0;37605:24;37516:28;37605:22;:24::i;:::-;37591:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37591:39:0;;37557:73;;37645:6;37641:118;37661:24;:6;:22;:24::i;:::-;37657:1;:28;37641:118;;;37726:21;:6;37745:1;37726:18;:21::i;:::-;37706:14;37721:1;37706:17;;;;;;;;:::i;:::-;;;;;;;;;;:41;37687:3;;;;:::i;:::-;;;;37641:118;;;-1:-1:-1;37779:13:0;;;;;;-1:-1:-1;37794:14:0;-1:-1:-1;;37247:570:0;;;;;:::o;34999:912::-;35105:8;:15;35095:25;;35087:58;;;;-1:-1:-1;;;35087:58:0;;;;;;;:::i;:::-;35156:23;35182:8;35191:7;35182:17;;;;;;;;:::i;:::-;;;;;;;;;;;35156:43;;35253:9;:16;35218:4;:12;;:24;35231:10;-1:-1:-1;;;;;35218:24:0;-1:-1:-1;;;;;35218:24:0;;;;;;;;;;;;:31;;;:51;;35210:86;;;;-1:-1:-1;;;35210:86:0;;9392:2:1;35210:86:0;;;9374:21:1;9431:2;9411:18;;;9404:30;-1:-1:-1;;;9450:18:1;;;9443:52;9512:18;;35210:86:0;9190:346:1;35210:86:0;35314:6;35309:595;35330:9;:16;35326:1;:20;35309:595;;;35409:10;-1:-1:-1;;;;;35371:48:0;:4;:20;;:34;35392:9;35402:1;35392:12;;;;;;;;:::i;:::-;;;;;;;;;;;;35371:34;;;;;;;;;;-1:-1:-1;35371:34:0;;-1:-1:-1;;;;;35371:34:0;:48;:111;;;;;35442:4;:15;;:29;35458:9;35468:1;35458:12;;;;;;;;:::i;:::-;;;;;;;35442:29;;;;;;;;;;;:40;;;35423:15;:59;;35371:111;35368:525;;;35550:10;35537:24;;;;:12;;;;:24;;;;;;:31;;:38;;35573:1;35537:35;:38::i;:::-;35516:10;35503:24;;;;:12;;;;:24;;;;;:31;:72;;;;35615:12;;35594:20;;;;35503:24;;35615:9;;35625:1;;35615:12;;;;;;:::i;:::-;;;;;;;35594:34;;;;;;;;;;;;:47;;;;;-1:-1:-1;;;;;35594:47:0;;;;;-1:-1:-1;;;;;35594:47:0;;;;;;35660:54;35701:9;35711:1;35701:12;;;;;;;;:::i;:::-;;;;;;;;;;;;35673:10;35660:24;;;;:12;;;:24;;;;;;;;:40;:54::i;:::-;-1:-1:-1;35735:8:0;;35788:12;;-1:-1:-1;;;;;35735:8:0;;;;:25;;35769:4;;35776:10;;35788:9;;35798:1;;35788:12;;;;;;:::i;:::-;;;;;;;35735:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35835:10;-1:-1:-1;;;;;35827:50:0;;35847:9;35857:1;35847:12;;;;;;;;:::i;:::-;;;;;;;35861:15;35827:50;;;;;;7706:25:1;;;7762:2;7747:18;;7740:34;7694:2;7679:18;;7532:248;35827:50:0;;;;;;;;35368:525;35348:3;;;;:::i;:::-;;;;35309:595;;;;35076:835;34999:912;;:::o;36855:384::-;36932:7;36941;36950;36988:8;:15;;;;36978:7;:25;36970:58;;;;-1:-1:-1;;;36970:58:0;;;;;;;:::i;:::-;37039:23;37065:8;37074:7;37065:17;;;;;;;;:::i;:::-;;;;;;;;;37123:25;;;37065:17;;;;;;;;37123:15;;:25;;;-1:-1:-1;;37123:25:0;;;;37167:19;;37188:20;;;;37210;;;;;37167:19;;37188:20;;-1:-1:-1;37210:20:0;-1:-1:-1;36855:384:0;-1:-1:-1;36855:384:0:o;32001:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32001:28:0;;;;-1:-1:-1;32001:28:0;:::o;33121:1070::-;33225:8;:15;33215:25;;33207:58;;;;-1:-1:-1;;;33207:58:0;;;;;;;:::i;:::-;33276:23;33302:8;33311:7;33302:17;;;;;;;;:::i;:::-;;;;;;;;;33372:16;;33302:17;;;;;33338:8;;:30;;-1:-1:-1;;;33338:30:0;;33357:10;33338:30;;;2943:51:1;33302:17:0;;-1:-1:-1;;;;;;33338:8:0;;:18;;2916::1;;33338:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;33330:80;;;;-1:-1:-1;;;33330:80:0;;8176:2:1;33330:80:0;;;8158:21:1;8215:2;8195:18;;;8188:30;-1:-1:-1;;;8234:18:1;;;8227:47;8291:18;;33330:80:0;7974:341:1;33330:80:0;33427:6;33423:761;33443:9;:16;33439:1;:20;33423:761;;;33489:8;;33506:12;;33523:10;;-1:-1:-1;;;;;33489:8:0;;:16;;33506:9;;33516:1;;33506:12;;;;;;:::i;:::-;;;;;;;33489:30;;;;;;;;;;;;;2508:25:1;;2496:2;2481:18;;2362:177;33489:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33489:44:0;;33481:70;;;;-1:-1:-1;;;33481:70:0;;8778:2:1;33481:70:0;;;8760:21:1;8817:2;8797:18;;;8790:30;-1:-1:-1;;;8836:18:1;;;8829:43;8889:18;;33481:70:0;8576:337:1;33481:70:0;33613:10;33600:24;;;;:12;;;;:24;;;;;;:31;;:38;;33636:1;33600:35;:38::i;:::-;33579:10;33566:24;;;;:12;;;;:24;;;;;;:31;:72;33691:12;;33653:51;;33691:9;;33701:1;;33691:12;;;;;;:::i;:::-;;;;;;;;;;;;33666:10;33653:24;;;;:12;;;:24;;;;;;;;:37;:51::i;:::-;;33721:27;33751:4;:15;;:29;33767:9;33777:1;33767:12;;;;;;;;:::i;:::-;;;;;;;33751:29;;;;;;;;;;;33721:59;;33818:34;33838:4;:13;;;33818:15;:19;;:34;;;;:::i;:::-;33795:20;;;:57;33889:15;33867:37;;;33919:20;;;:38;33995:12;;34011:10;;33974:20;;;;33867:19;;33995:9;;34005:1;;33995:12;;;;;;:::i;:::-;;;;;;;;;;;;33974:34;;;;;;;;;;-1:-1:-1;33974:34:0;:47;;-1:-1:-1;;;;;;33974:47:0;-1:-1:-1;;;;;33974:47:0;;;;;;34036:8;;34089:12;;34036:8;;;:25;;34062:10;;34082:4;;34089:12;;34099:1;;34089:12;;;;;;:::i;:::-;;;;;;;34036:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34130:10;-1:-1:-1;;;;;34124:48:0;;34142:9;34152:1;34142:12;;;;;;;;:::i;:::-;;;;;;;34156:15;34124:48;;;;;;7706:25:1;;;7762:2;7747:18;;7740:34;7694:2;7679:18;;7532:248;34124:48:0;;;;;;;;-1:-1:-1;33461:3:0;;;;:::i;:::-;;;;33423:761;;30774:201;29754:13;:11;:13::i;:::-;-1:-1:-1;;;;;30863:22:0;::::1;30855:73;;;::::0;-1:-1:-1;;;30855:73:0;;9743:2:1;30855:73:0::1;::::0;::::1;9725:21:1::0;9782:2;9762:18;;;9755:30;9821:34;9801:18;;;9794:62;-1:-1:-1;;;9872:18:1;;;9865:36;9918:19;;30855:73:0::1;9541:402:1::0;30855:73:0::1;30939:28;30958:8;30939:18;:28::i;:::-;30774:201:::0;:::o;30033:132::-;29914:7;29941:6;-1:-1:-1;;;;;29941:6:0;28499:10;30097:23;30089:68;;;;-1:-1:-1;;;30089:68:0;;10150:2:1;30089:68:0;;;10132:21:1;;;10169:18;;;10162:30;10228:34;10208:18;;;10201:62;10280:18;;30089:68:0;9948:356:1;3296:98:0;3354:7;3381:5;3385:1;3381;:5;:::i;:::-;3374:12;3296:98;-1:-1:-1;;;3296:98:0:o;18143:137::-;18213:4;18237:35;18245:3;18265:5;18237:7;:35::i;2915:98::-;2973:7;3000:5;3004:1;3000;:5;:::i;17836:131::-;17903:4;17927:32;17932:3;17952:5;17927:4;:32::i;31135:191::-;31209:16;31228:6;;-1:-1:-1;;;;;31245:17:0;;;-1:-1:-1;;;;;;31245:17:0;;;;;;31278:40;;31228:6;;;;;;;31278:40;;31209:16;31278:40;31198:128;31135:191;:::o;18598:114::-;18658:7;18685:19;18693:3;11583:18;;11500:109;19066:137;19137:7;19172:22;19176:3;19188:5;19172:3;:22::i;9779:1420::-;9845:4;9984:19;;;:12;;;:19;;;;;;10020:15;;10016:1176;;10395:21;10419:14;10432:1;10419:10;:14;:::i;:::-;10468:18;;10395:38;;-1:-1:-1;10448:17:0;;10468:22;;10489:1;;10468:22;:::i;:::-;10448:42;;10524:13;10511:9;:26;10507:405;;10558:17;10578:3;:11;;10590:9;10578:22;;;;;;;;:::i;:::-;;;;;;;;;10558:42;;10732:9;10703:3;:11;;10715:13;10703:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;10817:23;;;:12;;;:23;;;;;:36;;;10507:405;10993:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11088:3;:12;;:19;11101:5;11088:19;;;;;;;;;;;11081:26;;;11131:4;11124:11;;;;;;;10016:1176;11175:5;11168:12;;;;;9189:414;9252:4;11382:19;;;:12;;;:19;;;;;;9269:327;;-1:-1:-1;9312:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;9495:18;;9473:19;;;:12;;;:19;;;;;;:40;;;;9528:11;;9269:327;-1:-1:-1;9579:5:0;9572:12;;11963:120;12030:7;12057:3;:11;;12069:5;12057:18;;;;;;;;:::i;:::-;;;;;;;;;12050:25;;11963:120;;;;:::o;14:180:1:-;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:1;;14:180;-1:-1:-1;14:180:1:o;494:131::-;-1:-1:-1;;;;;569:31:1;;559:42;;549:70;;615:1;612;605:12;630:127;691:10;686:3;682:20;679:1;672:31;722:4;719:1;712:15;746:4;743:1;736:15;762:275;833:2;827:9;898:2;879:13;;-1:-1:-1;;875:27:1;863:40;;933:18;918:34;;954:22;;;915:62;912:88;;;980:18;;:::i;:::-;1016:2;1009:22;762:275;;-1:-1:-1;762:275:1:o;1042:1108::-;1137:6;1145;1153;1161;1214:3;1202:9;1193:7;1189:23;1185:33;1182:53;;;1231:1;1228;1221:12;1182:53;1270:9;1257:23;1289:31;1314:5;1289:31;:::i;:::-;1339:5;-1:-1:-1;1363:2:1;1402:18;;;1389:32;1430:33;1389:32;1430:33;:::i;:::-;1482:7;-1:-1:-1;1536:2:1;1521:18;;1508:32;;-1:-1:-1;1591:2:1;1576:18;;1563:32;1614:18;1644:14;;;1641:34;;;1671:1;1668;1661:12;1641:34;1709:6;1698:9;1694:22;1684:32;;1754:7;1747:4;1743:2;1739:13;1735:27;1725:55;;1776:1;1773;1766:12;1725:55;1812:2;1799:16;1834:2;1830;1827:10;1824:36;;;1840:18;;:::i;:::-;1882:53;1925:2;1906:13;;-1:-1:-1;;1902:27:1;1898:36;;1882:53;:::i;:::-;1869:66;;1958:2;1951:5;1944:17;1998:7;1993:2;1988;1984;1980:11;1976:20;1973:33;1970:53;;;2019:1;2016;2009:12;1970:53;2074:2;2069;2065;2061:11;2056:2;2049:5;2045:14;2032:45;2118:1;2113:2;2108;2101:5;2097:14;2093:23;2086:34;;2139:5;2129:15;;;;;1042:1108;;;;;;;:::o;2544:248::-;2612:6;2620;2673:2;2661:9;2652:7;2648:23;2644:32;2641:52;;;2689:1;2686;2679:12;2641:52;-1:-1:-1;;2712:23:1;;;2782:2;2767:18;;;2754:32;;-1:-1:-1;2544:248:1:o;3005:315::-;3073:6;3081;3134:2;3122:9;3113:7;3109:23;3105:32;3102:52;;;3150:1;3147;3140:12;3102:52;3189:9;3176:23;3208:31;3233:5;3208:31;:::i;:::-;3258:5;3310:2;3295:18;;;;3282:32;;-1:-1:-1;;;3005:315:1:o;3325:703::-;3495:4;3543:2;3532:9;3528:18;3573:6;3562:9;3555:25;3599:2;3637;3632;3621:9;3617:18;3610:30;3660:6;3695;3689:13;3726:6;3718;3711:22;3764:2;3753:9;3749:18;3742:25;;3802:2;3794:6;3790:15;3776:29;;3823:1;3833:169;3847:6;3844:1;3841:13;3833:169;;;3908:13;;3896:26;;3977:15;;;;3942:12;;;;3869:1;3862:9;3833:169;;;-1:-1:-1;4019:3:1;;3325:703;-1:-1:-1;;;;;;;3325:703:1:o;4033:1016::-;4126:6;4134;4187:2;4175:9;4166:7;4162:23;4158:32;4155:52;;;4203:1;4200;4193:12;4155:52;4243:9;4230:23;4272:18;4313:2;4305:6;4302:14;4299:34;;;4329:1;4326;4319:12;4299:34;4367:6;4356:9;4352:22;4342:32;;4412:7;4405:4;4401:2;4397:13;4393:27;4383:55;;4434:1;4431;4424:12;4383:55;4470:2;4457:16;4492:4;4515:2;4511;4508:10;4505:36;;;4521:18;;:::i;:::-;4567:2;4564:1;4560:10;4550:20;;4590:28;4614:2;4610;4606:11;4590:28;:::i;:::-;4652:15;;;4722:11;;;4718:20;;;4683:12;;;;4750:19;;;4747:39;;;4782:1;4779;4772:12;4747:39;4806:11;;;;4826:142;4842:6;4837:3;4834:15;4826:142;;;4908:17;;4896:30;;4859:12;;;;4946;;;;4826:142;;;4987:5;5024:18;;;;5011:32;;-1:-1:-1;;;;;;;4033:1016:1:o;5378:247::-;5437:6;5490:2;5478:9;5469:7;5465:23;5461:32;5458:52;;;5506:1;5503;5496:12;5458:52;5545:9;5532:23;5564:31;5589:5;5564:31;:::i;5630:344::-;5832:2;5814:21;;;5871:2;5851:18;;;5844:30;-1:-1:-1;;;5905:2:1;5890:18;;5883:50;5965:2;5950:18;;5630:344::o;5979:127::-;6040:10;6035:3;6031:20;6028:1;6021:31;6071:4;6068:1;6061:15;6095:4;6092:1;6085:15;7152:375;-1:-1:-1;;;;;7410:15:1;;;7392:34;;7462:15;;;;7457:2;7442:18;;7435:43;7509:2;7494:18;;7487:34;;;;7342:2;7327:18;;7152:375::o;7785:184::-;7855:6;7908:2;7896:9;7887:7;7883:23;7879:32;7876:52;;;7924:1;7921;7914:12;7876:52;-1:-1:-1;7947:16:1;;7785:184;-1:-1:-1;7785:184:1:o;8320:251::-;8390:6;8443:2;8431:9;8422:7;8418:23;8414:32;8411:52;;;8459:1;8456;8449:12;8411:52;8491:9;8485:16;8510:31;8535:5;8510:31;:::i;8918:127::-;8979:10;8974:3;8970:20;8967:1;8960:31;9010:4;9007:1;9000:15;9034:4;9031:1;9024:15;9050:135;9089:3;-1:-1:-1;;9110:17:1;;9107:43;;;9130:18;;:::i;:::-;-1:-1:-1;9177:1:1;9166:13;;9050:135::o;10309:125::-;10349:4;10377:1;10374;10371:8;10368:34;;;10382:18;;:::i;:::-;-1:-1:-1;10419:9:1;;10309:125::o;10439:128::-;10479:3;10510:1;10506:6;10503:1;10500:13;10497:39;;;10516:18;;:::i;:::-;-1:-1:-1;10552:9:1;;10439:128::o;10572:127::-;10633:10;10628:3;10624:20;10621:1;10614:31;10664:4;10661:1;10654:15;10688:4;10685:1;10678:15
Swarm Source
ipfs://039dc89baf1a4c4704d7f66323ca3d53418eeeb099dca262fa2899002ead0302
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.