More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 345 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 16712633 | 500 days ago | IN | 0 ETH | 0.00442033 | ||||
Stake | 16658440 | 508 days ago | IN | 0 ETH | 0.00955417 | ||||
Unstake | 16635597 | 511 days ago | IN | 0 ETH | 0.00866556 | ||||
Stake | 16445043 | 537 days ago | IN | 0 ETH | 0.00086222 | ||||
Stake | 16442493 | 538 days ago | IN | 0 ETH | 0.0007711 | ||||
Unstake | 16305820 | 557 days ago | IN | 0 ETH | 0.00297474 | ||||
Stake | 16287496 | 559 days ago | IN | 0 ETH | 0.00248931 | ||||
Stake | 16286654 | 560 days ago | IN | 0 ETH | 0.00256081 | ||||
Unstake | 16123432 | 582 days ago | IN | 0 ETH | 0.0005528 | ||||
Unstake | 16123429 | 582 days ago | IN | 0 ETH | 0.00189546 | ||||
Unstake | 16100298 | 586 days ago | IN | 0 ETH | 0.00489269 | ||||
Unstake | 16088563 | 587 days ago | IN | 0 ETH | 0.00325451 | ||||
Unstake | 16070805 | 590 days ago | IN | 0 ETH | 0.00330623 | ||||
Unstake | 16068580 | 590 days ago | IN | 0 ETH | 0.00162379 | ||||
Unstake | 16024620 | 596 days ago | IN | 0 ETH | 0.00251164 | ||||
Unstake | 16009640 | 598 days ago | IN | 0 ETH | 0.00180933 | ||||
Claim | 16009622 | 598 days ago | IN | 0 ETH | 0.00095409 | ||||
Unstake | 16008290 | 598 days ago | IN | 0 ETH | 0.00435071 | ||||
Unstake | 16007233 | 599 days ago | IN | 0 ETH | 0.00418041 | ||||
Unstake | 16006855 | 599 days ago | IN | 0 ETH | 0.00190515 | ||||
Unstake | 16006268 | 599 days ago | IN | 0 ETH | 0.01284014 | ||||
Unstake | 15981022 | 602 days ago | IN | 0 ETH | 0.00350606 | ||||
Unstake | 15977745 | 603 days ago | IN | 0 ETH | 0.00389279 | ||||
Unstake | 15974592 | 603 days ago | IN | 0 ETH | 0.00237103 | ||||
Unstake | 15967874 | 604 days ago | IN | 0 ETH | 0.00613225 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RareBearsStaking
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-06 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 be 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/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // 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/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: RareBearsStaking.sol pragma solidity 0.8.12; interface IRewardToken is IERC20 { function mint(address to, uint256 amount) external; } contract RareBearsStaking is Ownable, IERC721Receiver, ReentrancyGuard { uint public totalStaked; uint public stdRewards = 500 ether; uint public legendaryRewards = 1000 ether; uint public stakingMultiplier7Days = 1020; uint public stakingMultiplier30Days = 1080; uint public nftCount1 = 5; uint public nftCount2 = 10; uint public nftCount3 = 15; uint public nftCount4 = 20; uint public nftCount5 = 25; uint public nftCount1Reward = 102; uint public nftCount2Reward = 104; uint public nftCount3Reward = 106; uint public nftCount4Reward = 108; uint public nftCount5Reward = 110; struct Stake { uint256 tokenId; uint256 timestamp; address owner; } event NFTStaked(address owner, uint256 tokenId, uint256 value); event NFTUnstaked(address owner, uint256 tokenId, uint256 value); event Claimed(address owner, uint256 amount); ERC721Enumerable public nft; IRewardToken public token; mapping(uint256 => Stake) public vault; mapping(uint256 => bool) public legendaryNFTs; mapping(address => uint256) public userNFTCount; constructor(ERC721Enumerable _nft, IRewardToken _token) { nft = _nft; token = _token; legendaryNFTs[1] = true; legendaryNFTs[2] = true; legendaryNFTs[3] = true; legendaryNFTs[159] = true; legendaryNFTs[1161] = true; legendaryNFTs[2192] = true; } function stake(uint256[] calldata tokenIds) external nonReentrant { uint256 tokenId; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; require(nft.ownerOf(tokenId) == msg.sender, "not your token"); require(vault[tokenId].tokenId == 0, "already staked"); nft.transferFrom(msg.sender, address(this), tokenId); userNFTCount[msg.sender] += 1; totalStaked += 1; emit NFTStaked(msg.sender, tokenId, block.timestamp); vault[tokenId] = Stake({ owner: msg.sender, tokenId: tokenId, timestamp: block.timestamp }); } } function _unstakeMany(address account, uint256[] calldata tokenIds) internal { uint256 tokenId; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == msg.sender, "not an owner"); delete vault[tokenId]; nft.transferFrom(address(this), account, tokenId); userNFTCount[msg.sender] -= 1; totalStaked -= 1; emit NFTUnstaked(account, tokenId, block.timestamp); } } function claim(uint256[] calldata tokenIds) external nonReentrant { _claim(msg.sender, tokenIds, false); } function claimForAddress(address account, uint256[] calldata tokenIds) external nonReentrant { _claim(account, tokenIds, false); } function unstake(uint256[] calldata tokenIds) external nonReentrant { _claim(msg.sender, tokenIds, true); } function _claim(address account, uint256[] calldata tokenIds, bool _unstake) internal { uint256 tokenId; uint256 earned = 0; uint256 rewardmath = 0; uint256 NFTCountMultiplier = calculateCountMultiplier(account); for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == account, "not an owner"); uint256 stakedAt = staked.timestamp; uint256 daysInStaking = block.timestamp - staked.timestamp; if (legendaryNFTs[tokenId] == true) { rewardmath = calculateRewardsAmount(daysInStaking, legendaryRewards, stakedAt); } else { rewardmath = calculateRewardsAmount(daysInStaking, stdRewards, stakedAt); } earned += ((rewardmath / 100) * NFTCountMultiplier) / 100; vault[tokenId] = Stake({ owner: account, tokenId: tokenId, timestamp: block.timestamp }); } if (earned > 0) { token.mint(account, earned); } if (_unstake) { _unstakeMany(account, tokenIds); } emit Claimed(account, earned); } function earningInfo(address account, uint256[] calldata tokenIds) external view returns (uint256[1] memory info) { uint256 tokenId; uint256 earned = 0; uint256 rewardmath = 0; uint256 NFTCountMultiplier = calculateCountMultiplier(account); for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == account, "not an owner"); uint256 stakedAt = staked.timestamp; uint256 daysInStaking = block.timestamp - staked.timestamp; if (legendaryNFTs[tokenId] == true) { rewardmath = calculateRewardsAmount(daysInStaking, legendaryRewards, stakedAt); } else { rewardmath = calculateRewardsAmount(daysInStaking, stdRewards, stakedAt); } earned += ((rewardmath / 100) * NFTCountMultiplier) / 100; } if (earned > 0) { return [earned]; } } function stakedTime(address account, uint256[] calldata tokenIds) public view returns (uint256[] memory info) { uint256 tokenId; uint stakedAt; uint[] memory stakedAtArray = new uint[](tokenIds.length); for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(staked.owner == account, "not an owner"); stakedAt = staked.timestamp; stakedAtArray[i] = stakedAt; } return stakedAtArray; } function calculateCountMultiplier(address account) public view returns (uint256) { if (userNFTCount[account] >= nftCount5) { return nftCount5Reward; } else if (userNFTCount[account] >= nftCount4) { return nftCount4Reward; } else if (userNFTCount[account] >= nftCount3) { return nftCount3Reward; } else if (userNFTCount[account] >= nftCount2) { return nftCount2Reward; } else if (userNFTCount[account] >= nftCount1) { return nftCount1Reward; } else { return 100; } } function calculateRewardsAmount(uint256 _stakingDays, uint256 _rewardAmount, uint256 _stakedAt) public view returns (uint256) { uint256 rewards = 0; if (_stakingDays < 7 days) { rewards = _rewardAmount * (block.timestamp - _stakedAt) / 86400; } else if (_stakingDays > 7 days && _stakingDays < 30 days) { uint256 additionalReward = _rewardAmount * (block.timestamp - _stakedAt - 7 days) / 86400; additionalReward = (additionalReward * stakingMultiplier7Days) / 1000; rewards = (7 * _rewardAmount) + additionalReward; } else if (_stakingDays > 30 days) { uint256 additionalReward = _rewardAmount * (block.timestamp - _stakedAt - 30 days) / 86400; additionalReward = (additionalReward * stakingMultiplier30Days) / 1000; rewards = (7 * _rewardAmount) + ((23 * _rewardAmount * stakingMultiplier7Days) / 1000) + additionalReward; } return rewards; } function balanceOf(address account) public view returns (uint256) { uint256 balance = 0; uint256 supply = nft.totalSupply(); for(uint i = 1; i <= supply; i++) { if (vault[i].owner == account) { balance += 1; } } return balance; } function tokensOfOwner(address account) public view returns (uint256[] memory ownerTokens) { uint256 supply = nft.totalSupply(); uint256[] memory tmp = new uint256[](supply); uint256 index = 0; for(uint tokenId = 1; tokenId <= supply; tokenId++) { if (vault[tokenId].owner == account) { tmp[index] = vault[tokenId].tokenId; index +=1; } } uint256[] memory tokens = new uint256[](index); for(uint i = 0; i < index; i++) { tokens[i] = tmp[i]; } return tokens; } function updateStdRewards(uint256 rewardAmount) public onlyOwner { stdRewards = rewardAmount; } function updateLegendaryRewards(uint256 rewardAmount) public onlyOwner { legendaryRewards = rewardAmount; } function update7DayStakingRewards(uint256 _rewardsMultiplier) public onlyOwner { stakingMultiplier7Days = _rewardsMultiplier; } function update30DayStakingRewards(uint256 _rewardsMultiplier) public onlyOwner { stakingMultiplier30Days = _rewardsMultiplier; } function updateNftCountReward(uint256 _level, uint256 _countAmount, uint256 _countReward) public onlyOwner { if(_level == 1){ nftCount1 = _countAmount; nftCount1Reward = _countReward; }else if(_level == 2){ nftCount2 = _countAmount; nftCount2Reward = _countReward; }else if(_level == 3){ nftCount3 = _countAmount; nftCount3Reward = _countReward; }else if(_level == 4){ nftCount4 = _countAmount; nftCount4Reward = _countReward; }else if(_level == 5){ nftCount5 = _countAmount; nftCount5Reward = _countReward; } } function withdrawStakingTokens() public onlyOwner { token.transfer(msg.sender, token.balanceOf(address(this))); } function addLegNFT(uint256 _id, bool _status) public onlyOwner { legendaryNFTs[_id] = _status; } function onERC721Received( address, address from, uint256, bytes calldata ) external pure override returns (bytes4) { require(from == address(0x0), "Cannot send nfts to Vault directly"); return IERC721Receiver.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ERC721Enumerable","name":"_nft","type":"address"},{"internalType":"contract IRewardToken","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"addLegNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"calculateCountMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingDays","type":"uint256"},{"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"internalType":"uint256","name":"_stakedAt","type":"uint256"}],"name":"calculateRewardsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"earningInfo","outputs":[{"internalType":"uint256[1]","name":"info","type":"uint256[1]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"legendaryNFTs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendaryRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract ERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount1Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount2Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount3Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount4Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCount5Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakedTime","outputs":[{"internalType":"uint256[]","name":"info","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingMultiplier30Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingMultiplier7Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stdRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IRewardToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsMultiplier","type":"uint256"}],"name":"update30DayStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsMultiplier","type":"uint256"}],"name":"update7DayStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"updateLegendaryRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_level","type":"uint256"},{"internalType":"uint256","name":"_countAmount","type":"uint256"},{"internalType":"uint256","name":"_countReward","type":"uint256"}],"name":"updateNftCountReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"updateStdRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vault","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStakingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052681b1ae4d6e2ef500000600355683635c9adc5dea000006004556103fc6005556104386006556005600755600a600855600f6009556014600a556019600b556066600c556068600d55606a600e55606c600f55606e6010553480156200006957600080fd5b50604051620039bc380380620039bc83398181016040528101906200008f9190620003df565b620000af620000a36200025060201b60201c565b6200025860201b60201c565b6001808190555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601460006001815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601460006002815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601460006003815260200190815260200160002060006101000a81548160ff021916908315150217905550600160146000609f815260200190815260200160002060006101000a81548160ff021916908315150217905550600160146000610489815260200190815260200160002060006101000a81548160ff021916908315150217905550600160146000610890815260200190815260200160002060006101000a81548160ff021916908315150217905550505062000426565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200034e8262000321565b9050919050565b6000620003628262000341565b9050919050565b620003748162000355565b81146200038057600080fd5b50565b600081519050620003948162000369565b92915050565b6000620003a78262000341565b9050919050565b620003b9816200039a565b8114620003c557600080fd5b50565b600081519050620003d981620003ae565b92915050565b60008060408385031215620003f957620003f86200031c565b5b6000620004098582860162000383565b92505060206200041c85828601620003c8565b9150509250929050565b61358680620004366000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806381a36fb611610146578063c92de2ea116100c3578063f0120fc011610087578063f0120fc0146106ee578063f2fde38b1461070a578063fa2e616614610726578063fb59defb14610744578063fc0c546a14610762578063ff3bdd9a1461078057610253565b8063c92de2ea14610648578063ca6795e814610666578063d0a6dc6814610684578063d2eb7eb8146106b4578063e449f341146106d257610253565b80639495a6371161010a5780639495a637146105b657806397add1d5146105d45780639fc20bcb146105f0578063af46f3d41461060e578063c36be3571461062c57610253565b806381a36fb6146104fc578063833992c61461052e5780638462151c1461055e5780638b25a5c11461058e5780638da5cb5b1461059857610253565b8063413d0ed8116101d4578063715018a611610198578063715018a6146104585780637bd7e7ee146104625780637e75dd601461047e5780637f270667146104ae578063817b1cd2146104de57610253565b8063413d0ed8146103b457806347ccca02146103d05780636ba4c138146103ee5780636db7024d1461040a57806370a082311461042857610253565b8063150b7a021161021b578063150b7a02146102fa5780631b8512da1461032a5780631f3de2441461035a57806335f47f46146103785780633e35043f1461039657610253565b806306d08478146102585780630d4fd475146102765780630fbf0a931461029257806312dda787146102ae5780631412015c146102ca575b600080fd5b61026061079e565b60405161026d91906127ae565b60405180910390f35b610290600480360381019061028b91906127ff565b6107a4565b005b6102ac60048036038101906102a79190612891565b61082a565b005b6102c860048036038101906102c391906128de565b610c08565b005b6102e460048036038101906102df919061298f565b610d15565b6040516102f191906127ae565b60405180910390f35b610314600480360381019061030f9190612a12565b610ebb565b6040516103219190612ad5565b60405180910390f35b610344600480360381019061033f9190612af0565b610f3e565b6040516103519190612c0e565b60405180910390f35b610362611104565b60405161036f91906127ae565b60405180910390f35b61038061110a565b60405161038d91906127ae565b60405180910390f35b61039e611110565b6040516103ab91906127ae565b60405180910390f35b6103ce60048036038101906103c991906127ff565b611116565b005b6103d861119c565b6040516103e59190612c8f565b60405180910390f35b61040860048036038101906104039190612891565b6111c2565b005b610412611228565b60405161041f91906127ae565b60405180910390f35b610442600480360381019061043d919061298f565b61122e565b60405161044f91906127ae565b60405180910390f35b610460611370565b005b61047c600480360381019061047791906127ff565b6113f8565b005b61049860048036038101906104939190612af0565b61147e565b6040516104a59190612d2e565b60405180910390f35b6104c860048036038101906104c391906128de565b6116a8565b6040516104d591906127ae565b60405180910390f35b6104e661182c565b6040516104f391906127ae565b60405180910390f35b610516600480360381019061051191906127ff565b611832565b60405161052593929190612d58565b60405180910390f35b6105486004803603810190610543919061298f565b61187c565b60405161055591906127ae565b60405180910390f35b6105786004803603810190610573919061298f565b611894565b6040516105859190612c0e565b60405180910390f35b610596611afd565b005b6105a0611cb7565b6040516105ad9190612d8f565b60405180910390f35b6105be611ce0565b6040516105cb91906127ae565b60405180910390f35b6105ee60048036038101906105e99190612de2565b611ce6565b005b6105f8611d91565b60405161060591906127ae565b60405180910390f35b610616611d97565b60405161062391906127ae565b60405180910390f35b61064660048036038101906106419190612af0565b611d9d565b005b610650611e04565b60405161065d91906127ae565b60405180910390f35b61066e611e0a565b60405161067b91906127ae565b60405180910390f35b61069e600480360381019061069991906127ff565b611e10565b6040516106ab9190612e31565b60405180910390f35b6106bc611e30565b6040516106c991906127ae565b60405180910390f35b6106ec60048036038101906106e79190612891565b611e36565b005b610708600480360381019061070391906127ff565b611e9c565b005b610724600480360381019061071f919061298f565b611f22565b005b61072e61201a565b60405161073b91906127ae565b60405180910390f35b61074c612020565b60405161075991906127ae565b60405180910390f35b61076a612026565b6040516107779190612e6d565b60405180910390f35b61078861204c565b60405161079591906127ae565b60405180910390f35b60105481565b6107ac612052565b73ffffffffffffffffffffffffffffffffffffffff166107ca611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790612ee5565b60405180910390fd5b8060048190555050565b60026001541415610870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086790612f51565b60405180910390fd5b6002600181905550600080600090505b83839050811015610bfb5783838281811061089e5761089d612f71565b5b9050602002013591503373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161091991906127ae565b602060405180830381865afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612fb5565b73ffffffffffffffffffffffffffffffffffffffff16146109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a79061302e565b60405180910390fd5b6000601360008481526020019081526020016000206000015414610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a009061309a565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610a68939291906130ba565b600060405180830381600087803b158015610a8257600080fd5b505af1158015610a96573d6000803e3d6000fd5b505050506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610aea9190613120565b92505081905550600160026000828254610b049190613120565b925050819055507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d39338342604051610b3e93929190613176565b60405180910390a160405180606001604052808381526020014281526020013373ffffffffffffffffffffffffffffffffffffffff1681525060136000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080610bf3906131ad565b915050610880565b5050600180819055505050565b610c10612052565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90612ee5565b60405180910390fd5b6001831415610ca0578160078190555080600c81905550610d10565b6002831415610cbc578160088190555080600d81905550610d0f565b6003831415610cd8578160098190555080600e81905550610d0e565b6004831415610cf45781600a8190555080600f81905550610d0d565b6005831415610d0c5781600b81905550806010819055505b5b5b5b5b505050565b6000600b54601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610d69576010549050610eb6565b600a54601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610dbb57600f549050610eb6565b600954601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e0d57600e549050610eb6565b600854601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e5f57600d549050610eb6565b600754601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610eb157600c549050610eb6565b606490505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2290613268565b60405180910390fd5b63150b7a0260e01b905095945050505050565b606060008060008585905067ffffffffffffffff811115610f6257610f61613288565b5b604051908082528060200260200182016040528015610f905781602001602082028036833780820191505090505b50905060005b868690508110156110f657868682818110610fb457610fb3612f71565b5b90506020020135935060006013600086815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508873ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613303565b60405180910390fd5b80602001519350838383815181106110d6576110d5612f71565b5b6020026020010181815250505080806110ee906131ad565b915050610f96565b508093505050509392505050565b60085481565b600f5481565b60055481565b61111e612052565b73ffffffffffffffffffffffffffffffffffffffff1661113c611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612ee5565b60405180910390fd5b8060038190555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90612f51565b60405180910390fd5b600260018190555061121d338383600061205a565b600180819055505050565b60045481565b600080600090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190613338565b90506000600190505b818111611365578473ffffffffffffffffffffffffffffffffffffffff166013600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113525760018361134f9190613120565b92505b808061135d906131ad565b9150506112d1565b508192505050919050565b611378612052565b73ffffffffffffffffffffffffffffffffffffffff16611396611cb7565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390612ee5565b60405180910390fd5b6113f660006123dd565b565b611400612052565b73ffffffffffffffffffffffffffffffffffffffff1661141e611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90612ee5565b60405180910390fd5b8060058190555050565b611486612773565b6000806000905060008061149988610d15565b905060005b87879050811015611678578787828181106114bc576114bb612f71565b5b90506020020135945060006013600087815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508973ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613303565b60405180910390fd5b60008160200151905060008260200151426115de9190613365565b905060011515601460008a815260200190815260200160002060009054906101000a900460ff16151514156116215761161a81600454846116a8565b9550611631565b61162e81600354846116a8565b95505b60648560648861164191906133c8565b61164b91906133f9565b61165591906133c8565b876116609190613120565b96505050508080611670906131ad565b91505061149e565b50600083111561169c576040518060200160405280848152509450505050506116a1565b505050505b9392505050565b6000806000905062093a808510156116e6576201518083426116ca9190613365565b856116d591906133f9565b6116df91906133c8565b9050611821565b62093a80851180156116fa575062278d0085105b156117735760006201518062093a8085426117159190613365565b61171f9190613365565b8661172a91906133f9565b61173491906133c8565b90506103e86005548261174791906133f9565b61175191906133c8565b90508085600761176191906133f9565b61176b9190613120565b915050611820565b62278d0085111561181f5760006201518062278d0085426117949190613365565b61179e9190613365565b866117a991906133f9565b6117b391906133c8565b90506103e8600654826117c691906133f9565b6117d091906133c8565b9050806103e86005548760176117e691906133f9565b6117f091906133f9565b6117fa91906133c8565b86600761180791906133f9565b6118119190613120565b61181b9190613120565b9150505b5b5b809150509392505050565b60025481565b60136020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60156020528060005260406000206000915090505481565b60606000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119299190613338565b905060008167ffffffffffffffff81111561194757611946613288565b5b6040519080825280602002602001820160405280156119755781602001602082028036833780820191505090505b509050600080600190505b838111611a4a578573ffffffffffffffffffffffffffffffffffffffff166013600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a37576013600082815260200190815260200160002060000154838381518110611a1b57611a1a612f71565b5b602002602001018181525050600182611a349190613120565b91505b8080611a42906131ad565b915050611980565b5060008167ffffffffffffffff811115611a6757611a66613288565b5b604051908082528060200260200182016040528015611a955781602001602082028036833780820191505090505b50905060005b82811015611af057838181518110611ab657611ab5612f71565b5b6020026020010151828281518110611ad157611ad0612f71565b5b6020026020010181815250508080611ae8906131ad565b915050611a9b565b5080945050505050919050565b611b05612052565b73ffffffffffffffffffffffffffffffffffffffff16611b23611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090612ee5565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c139190612d8f565b602060405180830381865afa158015611c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c549190613338565b6040518363ffffffff1660e01b8152600401611c71929190613453565b6020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190613491565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611cee612052565b73ffffffffffffffffffffffffffffffffffffffff16611d0c611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990612ee5565b60405180910390fd5b806014600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b600d5481565b60026001541415611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda90612f51565b60405180910390fd5b6002600181905550611df8838383600061205a565b60018081905550505050565b60095481565b60075481565b60146020528060005260406000206000915054906101000a900460ff1681565b600b5481565b60026001541415611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390612f51565b60405180910390fd5b6002600181905550611e91338383600161205a565b600180819055505050565b611ea4612052565b73ffffffffffffffffffffffffffffffffffffffff16611ec2611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90612ee5565b60405180910390fd5b8060068190555050565b611f2a612052565b73ffffffffffffffffffffffffffffffffffffffff16611f48611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590612ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590613530565b60405180910390fd5b612017816123dd565b50565b60035481565b60065481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600033905090565b6000806000905060008061206d88610d15565b905060005b878790508110156122ee578787828181106120905761208f612f71565b5b90506020020135945060006013600087815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508973ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90613303565b60405180910390fd5b60008160200151905060008260200151426121b29190613365565b905060011515601460008a815260200190815260200160002060009054906101000a900460ff16151514156121f5576121ee81600454846116a8565b9550612205565b61220281600354846116a8565b95505b60648560648861221591906133c8565b61221f91906133f9565b61222991906133c8565b876122349190613120565b965060405180606001604052808981526020014281526020018d73ffffffffffffffffffffffffffffffffffffffff16815250601360008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505080806122e6906131ad565b915050612072565b50600083111561238857601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1989856040518363ffffffff1660e01b8152600401612355929190613453565b600060405180830381600087803b15801561236f57600080fd5b505af1158015612383573d6000803e3d6000fd5b505050505b841561239a576123998888886124a1565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a88846040516123cb929190613453565b60405180910390a15050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b8383905081101561276c578383828181106124c7576124c6612f71565b5b90506020020135915060006013600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c590613303565b60405180910390fd5b6013600084815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3088866040518463ffffffff1660e01b815260040161267a939291906130ba565b600060405180830381600087803b15801561269457600080fd5b505af11580156126a8573d6000803e3d6000fd5b505050506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126fc9190613365565b925050819055506001600260008282546127169190613365565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b86844260405161275093929190613176565b60405180910390a1508080612764906131ad565b9150506124a9565b5050505050565b6040518060200160405280600190602082028036833780820191505090505090565b6000819050919050565b6127a881612795565b82525050565b60006020820190506127c3600083018461279f565b92915050565b600080fd5b600080fd5b6127dc81612795565b81146127e757600080fd5b50565b6000813590506127f9816127d3565b92915050565b600060208284031215612815576128146127c9565b5b6000612823848285016127ea565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128515761285061282c565b5b8235905067ffffffffffffffff81111561286e5761286d612831565b5b60208301915083602082028301111561288a57612889612836565b5b9250929050565b600080602083850312156128a8576128a76127c9565b5b600083013567ffffffffffffffff8111156128c6576128c56127ce565b5b6128d28582860161283b565b92509250509250929050565b6000806000606084860312156128f7576128f66127c9565b5b6000612905868287016127ea565b9350506020612916868287016127ea565b9250506040612927868287016127ea565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061295c82612931565b9050919050565b61296c81612951565b811461297757600080fd5b50565b60008135905061298981612963565b92915050565b6000602082840312156129a5576129a46127c9565b5b60006129b38482850161297a565b91505092915050565b60008083601f8401126129d2576129d161282c565b5b8235905067ffffffffffffffff8111156129ef576129ee612831565b5b602083019150836001820283011115612a0b57612a0a612836565b5b9250929050565b600080600080600060808688031215612a2e57612a2d6127c9565b5b6000612a3c8882890161297a565b9550506020612a4d8882890161297a565b9450506040612a5e888289016127ea565b935050606086013567ffffffffffffffff811115612a7f57612a7e6127ce565b5b612a8b888289016129bc565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612acf81612a9a565b82525050565b6000602082019050612aea6000830184612ac6565b92915050565b600080600060408486031215612b0957612b086127c9565b5b6000612b178682870161297a565b935050602084013567ffffffffffffffff811115612b3857612b376127ce565b5b612b448682870161283b565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8581612795565b82525050565b6000612b978383612b7c565b60208301905092915050565b6000602082019050919050565b6000612bbb82612b50565b612bc58185612b5b565b9350612bd083612b6c565b8060005b83811015612c01578151612be88882612b8b565b9750612bf383612ba3565b925050600181019050612bd4565b5085935050505092915050565b60006020820190508181036000830152612c288184612bb0565b905092915050565b6000819050919050565b6000612c55612c50612c4b84612931565b612c30565b612931565b9050919050565b6000612c6782612c3a565b9050919050565b6000612c7982612c5c565b9050919050565b612c8981612c6e565b82525050565b6000602082019050612ca46000830184612c80565b92915050565b600060019050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b612ce081612caa565b612cea8184612cb5565b9250612cf582612cc0565b8060005b83811015612d26578151612d0d8782612b8b565b9650612d1883612cca565b925050600181019050612cf9565b505050505050565b6000602082019050612d436000830184612cd7565b92915050565b612d5281612951565b82525050565b6000606082019050612d6d600083018661279f565b612d7a602083018561279f565b612d876040830184612d49565b949350505050565b6000602082019050612da46000830184612d49565b92915050565b60008115159050919050565b612dbf81612daa565b8114612dca57600080fd5b50565b600081359050612ddc81612db6565b92915050565b60008060408385031215612df957612df86127c9565b5b6000612e07858286016127ea565b9250506020612e1885828601612dcd565b9150509250929050565b612e2b81612daa565b82525050565b6000602082019050612e466000830184612e22565b92915050565b6000612e5782612c5c565b9050919050565b612e6781612e4c565b82525050565b6000602082019050612e826000830184612e5e565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ecf602083612e88565b9150612eda82612e99565b602082019050919050565b60006020820190508181036000830152612efe81612ec2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612f3b601f83612e88565b9150612f4682612f05565b602082019050919050565b60006020820190508181036000830152612f6a81612f2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612faf81612963565b92915050565b600060208284031215612fcb57612fca6127c9565b5b6000612fd984828501612fa0565b91505092915050565b7f6e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000613018600e83612e88565b915061302382612fe2565b602082019050919050565b600060208201905081810360008301526130478161300b565b9050919050565b7f616c7265616479207374616b6564000000000000000000000000000000000000600082015250565b6000613084600e83612e88565b915061308f8261304e565b602082019050919050565b600060208201905081810360008301526130b381613077565b9050919050565b60006060820190506130cf6000830186612d49565b6130dc6020830185612d49565b6130e9604083018461279f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312b82612795565b915061313683612795565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561316b5761316a6130f1565b5b828201905092915050565b600060608201905061318b6000830186612d49565b613198602083018561279f565b6131a5604083018461279f565b949350505050565b60006131b882612795565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea6130f1565b5b600182019050919050565b7f43616e6e6f742073656e64206e66747320746f205661756c742064697265637460008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b6000613252602283612e88565b915061325d826131f6565b604082019050919050565b6000602082019050818103600083015261328181613245565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6e6f7420616e206f776e65720000000000000000000000000000000000000000600082015250565b60006132ed600c83612e88565b91506132f8826132b7565b602082019050919050565b6000602082019050818103600083015261331c816132e0565b9050919050565b600081519050613332816127d3565b92915050565b60006020828403121561334e5761334d6127c9565b5b600061335c84828501613323565b91505092915050565b600061337082612795565b915061337b83612795565b92508282101561338e5761338d6130f1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133d382612795565b91506133de83612795565b9250826133ee576133ed613399565b5b828204905092915050565b600061340482612795565b915061340f83612795565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613448576134476130f1565b5b828202905092915050565b60006040820190506134686000830185612d49565b613475602083018461279f565b9392505050565b60008151905061348b81612db6565b92915050565b6000602082840312156134a7576134a66127c9565b5b60006134b58482850161347c565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061351a602683612e88565b9150613525826134be565b604082019050919050565b600060208201905081810360008301526135498161350d565b905091905056fea2646970667358221220725b8b6eac7608b268b05fa8dc8825e4c6cf15d658789cafc17d6f03ef3c2b7e64736f6c634300080c0033000000000000000000000000c782ab25dac76565d3fdede36fcf87227c9217da000000000000000000000000faf419065c161b7324abb84f91cd4f8e85d3b34e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c806381a36fb611610146578063c92de2ea116100c3578063f0120fc011610087578063f0120fc0146106ee578063f2fde38b1461070a578063fa2e616614610726578063fb59defb14610744578063fc0c546a14610762578063ff3bdd9a1461078057610253565b8063c92de2ea14610648578063ca6795e814610666578063d0a6dc6814610684578063d2eb7eb8146106b4578063e449f341146106d257610253565b80639495a6371161010a5780639495a637146105b657806397add1d5146105d45780639fc20bcb146105f0578063af46f3d41461060e578063c36be3571461062c57610253565b806381a36fb6146104fc578063833992c61461052e5780638462151c1461055e5780638b25a5c11461058e5780638da5cb5b1461059857610253565b8063413d0ed8116101d4578063715018a611610198578063715018a6146104585780637bd7e7ee146104625780637e75dd601461047e5780637f270667146104ae578063817b1cd2146104de57610253565b8063413d0ed8146103b457806347ccca02146103d05780636ba4c138146103ee5780636db7024d1461040a57806370a082311461042857610253565b8063150b7a021161021b578063150b7a02146102fa5780631b8512da1461032a5780631f3de2441461035a57806335f47f46146103785780633e35043f1461039657610253565b806306d08478146102585780630d4fd475146102765780630fbf0a931461029257806312dda787146102ae5780631412015c146102ca575b600080fd5b61026061079e565b60405161026d91906127ae565b60405180910390f35b610290600480360381019061028b91906127ff565b6107a4565b005b6102ac60048036038101906102a79190612891565b61082a565b005b6102c860048036038101906102c391906128de565b610c08565b005b6102e460048036038101906102df919061298f565b610d15565b6040516102f191906127ae565b60405180910390f35b610314600480360381019061030f9190612a12565b610ebb565b6040516103219190612ad5565b60405180910390f35b610344600480360381019061033f9190612af0565b610f3e565b6040516103519190612c0e565b60405180910390f35b610362611104565b60405161036f91906127ae565b60405180910390f35b61038061110a565b60405161038d91906127ae565b60405180910390f35b61039e611110565b6040516103ab91906127ae565b60405180910390f35b6103ce60048036038101906103c991906127ff565b611116565b005b6103d861119c565b6040516103e59190612c8f565b60405180910390f35b61040860048036038101906104039190612891565b6111c2565b005b610412611228565b60405161041f91906127ae565b60405180910390f35b610442600480360381019061043d919061298f565b61122e565b60405161044f91906127ae565b60405180910390f35b610460611370565b005b61047c600480360381019061047791906127ff565b6113f8565b005b61049860048036038101906104939190612af0565b61147e565b6040516104a59190612d2e565b60405180910390f35b6104c860048036038101906104c391906128de565b6116a8565b6040516104d591906127ae565b60405180910390f35b6104e661182c565b6040516104f391906127ae565b60405180910390f35b610516600480360381019061051191906127ff565b611832565b60405161052593929190612d58565b60405180910390f35b6105486004803603810190610543919061298f565b61187c565b60405161055591906127ae565b60405180910390f35b6105786004803603810190610573919061298f565b611894565b6040516105859190612c0e565b60405180910390f35b610596611afd565b005b6105a0611cb7565b6040516105ad9190612d8f565b60405180910390f35b6105be611ce0565b6040516105cb91906127ae565b60405180910390f35b6105ee60048036038101906105e99190612de2565b611ce6565b005b6105f8611d91565b60405161060591906127ae565b60405180910390f35b610616611d97565b60405161062391906127ae565b60405180910390f35b61064660048036038101906106419190612af0565b611d9d565b005b610650611e04565b60405161065d91906127ae565b60405180910390f35b61066e611e0a565b60405161067b91906127ae565b60405180910390f35b61069e600480360381019061069991906127ff565b611e10565b6040516106ab9190612e31565b60405180910390f35b6106bc611e30565b6040516106c991906127ae565b60405180910390f35b6106ec60048036038101906106e79190612891565b611e36565b005b610708600480360381019061070391906127ff565b611e9c565b005b610724600480360381019061071f919061298f565b611f22565b005b61072e61201a565b60405161073b91906127ae565b60405180910390f35b61074c612020565b60405161075991906127ae565b60405180910390f35b61076a612026565b6040516107779190612e6d565b60405180910390f35b61078861204c565b60405161079591906127ae565b60405180910390f35b60105481565b6107ac612052565b73ffffffffffffffffffffffffffffffffffffffff166107ca611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790612ee5565b60405180910390fd5b8060048190555050565b60026001541415610870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086790612f51565b60405180910390fd5b6002600181905550600080600090505b83839050811015610bfb5783838281811061089e5761089d612f71565b5b9050602002013591503373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161091991906127ae565b602060405180830381865afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612fb5565b73ffffffffffffffffffffffffffffffffffffffff16146109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a79061302e565b60405180910390fd5b6000601360008481526020019081526020016000206000015414610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a009061309a565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610a68939291906130ba565b600060405180830381600087803b158015610a8257600080fd5b505af1158015610a96573d6000803e3d6000fd5b505050506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610aea9190613120565b92505081905550600160026000828254610b049190613120565b925050819055507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d39338342604051610b3e93929190613176565b60405180910390a160405180606001604052808381526020014281526020013373ffffffffffffffffffffffffffffffffffffffff1681525060136000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080610bf3906131ad565b915050610880565b5050600180819055505050565b610c10612052565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90612ee5565b60405180910390fd5b6001831415610ca0578160078190555080600c81905550610d10565b6002831415610cbc578160088190555080600d81905550610d0f565b6003831415610cd8578160098190555080600e81905550610d0e565b6004831415610cf45781600a8190555080600f81905550610d0d565b6005831415610d0c5781600b81905550806010819055505b5b5b5b5b505050565b6000600b54601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610d69576010549050610eb6565b600a54601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610dbb57600f549050610eb6565b600954601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e0d57600e549050610eb6565b600854601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e5f57600d549050610eb6565b600754601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610eb157600c549050610eb6565b606490505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2290613268565b60405180910390fd5b63150b7a0260e01b905095945050505050565b606060008060008585905067ffffffffffffffff811115610f6257610f61613288565b5b604051908082528060200260200182016040528015610f905781602001602082028036833780820191505090505b50905060005b868690508110156110f657868682818110610fb457610fb3612f71565b5b90506020020135935060006013600086815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508873ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613303565b60405180910390fd5b80602001519350838383815181106110d6576110d5612f71565b5b6020026020010181815250505080806110ee906131ad565b915050610f96565b508093505050509392505050565b60085481565b600f5481565b60055481565b61111e612052565b73ffffffffffffffffffffffffffffffffffffffff1661113c611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612ee5565b60405180910390fd5b8060038190555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90612f51565b60405180910390fd5b600260018190555061121d338383600061205a565b600180819055505050565b60045481565b600080600090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190613338565b90506000600190505b818111611365578473ffffffffffffffffffffffffffffffffffffffff166013600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113525760018361134f9190613120565b92505b808061135d906131ad565b9150506112d1565b508192505050919050565b611378612052565b73ffffffffffffffffffffffffffffffffffffffff16611396611cb7565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390612ee5565b60405180910390fd5b6113f660006123dd565b565b611400612052565b73ffffffffffffffffffffffffffffffffffffffff1661141e611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90612ee5565b60405180910390fd5b8060058190555050565b611486612773565b6000806000905060008061149988610d15565b905060005b87879050811015611678578787828181106114bc576114bb612f71565b5b90506020020135945060006013600087815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508973ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613303565b60405180910390fd5b60008160200151905060008260200151426115de9190613365565b905060011515601460008a815260200190815260200160002060009054906101000a900460ff16151514156116215761161a81600454846116a8565b9550611631565b61162e81600354846116a8565b95505b60648560648861164191906133c8565b61164b91906133f9565b61165591906133c8565b876116609190613120565b96505050508080611670906131ad565b91505061149e565b50600083111561169c576040518060200160405280848152509450505050506116a1565b505050505b9392505050565b6000806000905062093a808510156116e6576201518083426116ca9190613365565b856116d591906133f9565b6116df91906133c8565b9050611821565b62093a80851180156116fa575062278d0085105b156117735760006201518062093a8085426117159190613365565b61171f9190613365565b8661172a91906133f9565b61173491906133c8565b90506103e86005548261174791906133f9565b61175191906133c8565b90508085600761176191906133f9565b61176b9190613120565b915050611820565b62278d0085111561181f5760006201518062278d0085426117949190613365565b61179e9190613365565b866117a991906133f9565b6117b391906133c8565b90506103e8600654826117c691906133f9565b6117d091906133c8565b9050806103e86005548760176117e691906133f9565b6117f091906133f9565b6117fa91906133c8565b86600761180791906133f9565b6118119190613120565b61181b9190613120565b9150505b5b5b809150509392505050565b60025481565b60136020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60156020528060005260406000206000915090505481565b60606000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119299190613338565b905060008167ffffffffffffffff81111561194757611946613288565b5b6040519080825280602002602001820160405280156119755781602001602082028036833780820191505090505b509050600080600190505b838111611a4a578573ffffffffffffffffffffffffffffffffffffffff166013600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a37576013600082815260200190815260200160002060000154838381518110611a1b57611a1a612f71565b5b602002602001018181525050600182611a349190613120565b91505b8080611a42906131ad565b915050611980565b5060008167ffffffffffffffff811115611a6757611a66613288565b5b604051908082528060200260200182016040528015611a955781602001602082028036833780820191505090505b50905060005b82811015611af057838181518110611ab657611ab5612f71565b5b6020026020010151828281518110611ad157611ad0612f71565b5b6020026020010181815250508080611ae8906131ad565b915050611a9b565b5080945050505050919050565b611b05612052565b73ffffffffffffffffffffffffffffffffffffffff16611b23611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090612ee5565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c139190612d8f565b602060405180830381865afa158015611c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c549190613338565b6040518363ffffffff1660e01b8152600401611c71929190613453565b6020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190613491565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611cee612052565b73ffffffffffffffffffffffffffffffffffffffff16611d0c611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990612ee5565b60405180910390fd5b806014600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b600d5481565b60026001541415611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda90612f51565b60405180910390fd5b6002600181905550611df8838383600061205a565b60018081905550505050565b60095481565b60075481565b60146020528060005260406000206000915054906101000a900460ff1681565b600b5481565b60026001541415611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390612f51565b60405180910390fd5b6002600181905550611e91338383600161205a565b600180819055505050565b611ea4612052565b73ffffffffffffffffffffffffffffffffffffffff16611ec2611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90612ee5565b60405180910390fd5b8060068190555050565b611f2a612052565b73ffffffffffffffffffffffffffffffffffffffff16611f48611cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590612ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590613530565b60405180910390fd5b612017816123dd565b50565b60035481565b60065481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600033905090565b6000806000905060008061206d88610d15565b905060005b878790508110156122ee578787828181106120905761208f612f71565b5b90506020020135945060006013600087815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508973ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90613303565b60405180910390fd5b60008160200151905060008260200151426121b29190613365565b905060011515601460008a815260200190815260200160002060009054906101000a900460ff16151514156121f5576121ee81600454846116a8565b9550612205565b61220281600354846116a8565b95505b60648560648861221591906133c8565b61221f91906133f9565b61222991906133c8565b876122349190613120565b965060405180606001604052808981526020014281526020018d73ffffffffffffffffffffffffffffffffffffffff16815250601360008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505080806122e6906131ad565b915050612072565b50600083111561238857601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1989856040518363ffffffff1660e01b8152600401612355929190613453565b600060405180830381600087803b15801561236f57600080fd5b505af1158015612383573d6000803e3d6000fd5b505050505b841561239a576123998888886124a1565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a88846040516123cb929190613453565b60405180910390a15050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b8383905081101561276c578383828181106124c7576124c6612f71565b5b90506020020135915060006013600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c590613303565b60405180910390fd5b6013600084815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3088866040518463ffffffff1660e01b815260040161267a939291906130ba565b600060405180830381600087803b15801561269457600080fd5b505af11580156126a8573d6000803e3d6000fd5b505050506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126fc9190613365565b925050819055506001600260008282546127169190613365565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b86844260405161275093929190613176565b60405180910390a1508080612764906131ad565b9150506124a9565b5050505050565b6040518060200160405280600190602082028036833780820191505090505090565b6000819050919050565b6127a881612795565b82525050565b60006020820190506127c3600083018461279f565b92915050565b600080fd5b600080fd5b6127dc81612795565b81146127e757600080fd5b50565b6000813590506127f9816127d3565b92915050565b600060208284031215612815576128146127c9565b5b6000612823848285016127ea565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128515761285061282c565b5b8235905067ffffffffffffffff81111561286e5761286d612831565b5b60208301915083602082028301111561288a57612889612836565b5b9250929050565b600080602083850312156128a8576128a76127c9565b5b600083013567ffffffffffffffff8111156128c6576128c56127ce565b5b6128d28582860161283b565b92509250509250929050565b6000806000606084860312156128f7576128f66127c9565b5b6000612905868287016127ea565b9350506020612916868287016127ea565b9250506040612927868287016127ea565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061295c82612931565b9050919050565b61296c81612951565b811461297757600080fd5b50565b60008135905061298981612963565b92915050565b6000602082840312156129a5576129a46127c9565b5b60006129b38482850161297a565b91505092915050565b60008083601f8401126129d2576129d161282c565b5b8235905067ffffffffffffffff8111156129ef576129ee612831565b5b602083019150836001820283011115612a0b57612a0a612836565b5b9250929050565b600080600080600060808688031215612a2e57612a2d6127c9565b5b6000612a3c8882890161297a565b9550506020612a4d8882890161297a565b9450506040612a5e888289016127ea565b935050606086013567ffffffffffffffff811115612a7f57612a7e6127ce565b5b612a8b888289016129bc565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612acf81612a9a565b82525050565b6000602082019050612aea6000830184612ac6565b92915050565b600080600060408486031215612b0957612b086127c9565b5b6000612b178682870161297a565b935050602084013567ffffffffffffffff811115612b3857612b376127ce565b5b612b448682870161283b565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8581612795565b82525050565b6000612b978383612b7c565b60208301905092915050565b6000602082019050919050565b6000612bbb82612b50565b612bc58185612b5b565b9350612bd083612b6c565b8060005b83811015612c01578151612be88882612b8b565b9750612bf383612ba3565b925050600181019050612bd4565b5085935050505092915050565b60006020820190508181036000830152612c288184612bb0565b905092915050565b6000819050919050565b6000612c55612c50612c4b84612931565b612c30565b612931565b9050919050565b6000612c6782612c3a565b9050919050565b6000612c7982612c5c565b9050919050565b612c8981612c6e565b82525050565b6000602082019050612ca46000830184612c80565b92915050565b600060019050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b612ce081612caa565b612cea8184612cb5565b9250612cf582612cc0565b8060005b83811015612d26578151612d0d8782612b8b565b9650612d1883612cca565b925050600181019050612cf9565b505050505050565b6000602082019050612d436000830184612cd7565b92915050565b612d5281612951565b82525050565b6000606082019050612d6d600083018661279f565b612d7a602083018561279f565b612d876040830184612d49565b949350505050565b6000602082019050612da46000830184612d49565b92915050565b60008115159050919050565b612dbf81612daa565b8114612dca57600080fd5b50565b600081359050612ddc81612db6565b92915050565b60008060408385031215612df957612df86127c9565b5b6000612e07858286016127ea565b9250506020612e1885828601612dcd565b9150509250929050565b612e2b81612daa565b82525050565b6000602082019050612e466000830184612e22565b92915050565b6000612e5782612c5c565b9050919050565b612e6781612e4c565b82525050565b6000602082019050612e826000830184612e5e565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ecf602083612e88565b9150612eda82612e99565b602082019050919050565b60006020820190508181036000830152612efe81612ec2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612f3b601f83612e88565b9150612f4682612f05565b602082019050919050565b60006020820190508181036000830152612f6a81612f2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612faf81612963565b92915050565b600060208284031215612fcb57612fca6127c9565b5b6000612fd984828501612fa0565b91505092915050565b7f6e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000613018600e83612e88565b915061302382612fe2565b602082019050919050565b600060208201905081810360008301526130478161300b565b9050919050565b7f616c7265616479207374616b6564000000000000000000000000000000000000600082015250565b6000613084600e83612e88565b915061308f8261304e565b602082019050919050565b600060208201905081810360008301526130b381613077565b9050919050565b60006060820190506130cf6000830186612d49565b6130dc6020830185612d49565b6130e9604083018461279f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312b82612795565b915061313683612795565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561316b5761316a6130f1565b5b828201905092915050565b600060608201905061318b6000830186612d49565b613198602083018561279f565b6131a5604083018461279f565b949350505050565b60006131b882612795565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea6130f1565b5b600182019050919050565b7f43616e6e6f742073656e64206e66747320746f205661756c742064697265637460008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b6000613252602283612e88565b915061325d826131f6565b604082019050919050565b6000602082019050818103600083015261328181613245565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6e6f7420616e206f776e65720000000000000000000000000000000000000000600082015250565b60006132ed600c83612e88565b91506132f8826132b7565b602082019050919050565b6000602082019050818103600083015261331c816132e0565b9050919050565b600081519050613332816127d3565b92915050565b60006020828403121561334e5761334d6127c9565b5b600061335c84828501613323565b91505092915050565b600061337082612795565b915061337b83612795565b92508282101561338e5761338d6130f1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133d382612795565b91506133de83612795565b9250826133ee576133ed613399565b5b828204905092915050565b600061340482612795565b915061340f83612795565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613448576134476130f1565b5b828202905092915050565b60006040820190506134686000830185612d49565b613475602083018461279f565b9392505050565b60008151905061348b81612db6565b92915050565b6000602082840312156134a7576134a66127c9565b5b60006134b58482850161347c565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061351a602683612e88565b9150613525826134be565b604082019050919050565b600060208201905081810360008301526135498161350d565b905091905056fea2646970667358221220725b8b6eac7608b268b05fa8dc8825e4c6cf15d658789cafc17d6f03ef3c2b7e64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c782ab25dac76565d3fdede36fcf87227c9217da000000000000000000000000faf419065c161b7324abb84f91cd4f8e85d3b34e
-----Decoded View---------------
Arg [0] : _nft (address): 0xC782Ab25DAc76565d3fdede36Fcf87227c9217da
Arg [1] : _token (address): 0xfaF419065C161B7324abB84F91cd4F8e85D3b34E
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c782ab25dac76565d3fdede36fcf87227c9217da
Arg [1] : 000000000000000000000000faf419065c161b7324abb84f91cd4f8e85d3b34e
Deployed Bytecode Sourcemap
53899:9656:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54489:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61984:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55313:661;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62395:614;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59488:583;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63254:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58972:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54213:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54451:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54090:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61873:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54807:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56494:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54044:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61035:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10401:103;;;:::i;:::-;;62107:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58037:929;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60077:952;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53977:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54871:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;54964:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61321:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63015:121;;;:::i;:::-;;9750:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54275:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63142:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54337:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54375;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56616:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54244:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54183:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54914:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54306:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56762:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62250:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10659:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54005:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54136:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54839:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54413:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54489;;;;:::o;61984:117::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62083:12:::1;62064:16;:31;;;;61984:117:::0;:::o;55313:661::-;1845:1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;55386:15:::1;55415:6:::0;55424:1:::1;55415:10;;55410:559;55431:8;;:15;;55427:1;:19;55410:559;;;55474:8;;55483:1;55474:11;;;;;;;:::i;:::-;;;;;;;;55464:21;;55528:10;55504:34;;:3;;;;;;;;;;;:11;;;55516:7;55504:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;55496:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55602:1;55576:5;:14;55582:7;55576:14;;;;;;;;;;;:22;;;:27;55568:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55633:3;;;;;;;;;;;:16;;;55650:10;55670:4;55677:7;55633:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55724:1;55696:12;:24;55709:10;55696:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;55751:1;55736:11;;:16;;;;;;;:::i;:::-;;;;;;;;55768:47;55778:10;55790:7;55799:15;55768:47;;;;;;;;:::i;:::-;;;;;;;;55843:116;;;;;;;;55901:7;55843:116;;;;55932:15;55843:116;;;;55869:10;55843:116;;;;::::0;55826:5:::1;:14;55832:7;55826:14;;;;;;;;;;;:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55448:3;;;;;:::i;:::-;;;;55410:559;;;;55379:595;1801:1:::0;2755:7;:22;;;;55313:661;;:::o;62395:614::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62522:1:::1;62512:6;:11;62509:495;;;62545:12;62533:9;:24;;;;62584:12;62566:15;:30;;;;62509:495;;;62622:1;62612:6;:11;62609:395;;;62645:12;62633:9;:24;;;;62684:12;62666:15;:30;;;;62609:395;;;62722:1;62712:6;:11;62709:295;;;62745:12;62733:9;:24;;;;62784:12;62766:15;:30;;;;62709:295;;;62822:1;62812:6;:11;62809:195;;;62845:12;62833:9;:24;;;;62884:12;62866:15;:30;;;;62809:195;;;62922:1;62912:6;:11;62909:95;;;62945:12;62933:9;:24;;;;62984:12;62966:15;:30;;;;62909:95;62809:195;62709:295;62609:395;62509:495;62395:614:::0;;;:::o;59488:583::-;59560:7;59607:9;;59582:12;:21;59595:7;59582:21;;;;;;;;;;;;;;;;:34;59578:488;;59638:15;;59631:22;;;;59578:488;59698:9;;59673:12;:21;59686:7;59673:21;;;;;;;;;;;;;;;;:34;59669:397;;59729:15;;59722:22;;;;59669:397;59789:9;;59764:12;:21;59777:7;59764:21;;;;;;;;;;;;;;;;:34;59760:306;;59820:15;;59813:22;;;;59760:306;59880:9;;59855:12;:21;59868:7;59855:21;;;;;;;;;;;;;;;;:34;59851:215;;59911:15;;59904:22;;;;59851:215;59971:9;;59946:12;:21;59959:7;59946:21;;;;;;;;;;;;;;;;:34;59942:124;;60002:15;;59995:22;;;;59942:124;60053:3;60046:10;;59488:583;;;;:::o;63254:298::-;63403:6;63444:3;63428:20;;:4;:20;;;63420:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63503:41;;;63496:48;;63254:298;;;;;;;:::o;58972:510::-;59059:21;59089:15;59111:13;59131:27;59172:8;;:15;;59161:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59131:57;;59200:6;59195:255;59216:8;;:15;;59212:1;:19;59195:255;;;59257:8;;59266:1;59257:11;;;;;;;:::i;:::-;;;;;;;;59247:21;;59277:19;59299:5;:14;59305:7;59299:14;;;;;;;;;;;59277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59346:7;59330:23;;:6;:12;;;:23;;;59322:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59390:6;:16;;;59379:27;;59434:8;59415:13;59429:1;59415:16;;;;;;;;:::i;:::-;;;;;;;:27;;;;;59238:212;59233:3;;;;;:::i;:::-;;;;59195:255;;;;59463:13;59456:20;;;;;58972:510;;;;;:::o;54213:26::-;;;;:::o;54451:33::-;;;;:::o;54090:41::-;;;;:::o;61873:105::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61960:12:::1;61947:10;:25;;;;61873:105:::0;:::o;54807:27::-;;;;;;;;;;;;;:::o;56494:116::-;1845:1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;56569:35:::1;56576:10;56588:8;;56598:5;56569:6;:35::i;:::-;1801:1:::0;2755:7;:22;;;;56494:116;;:::o;54044:41::-;;;;:::o;61035:280::-;61092:7;61108:15;61126:1;61108:19;;61134:14;61151:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61134:34;;61179:6;61188:1;61179:10;;61175:114;61196:6;61191:1;:11;61175:114;;61240:7;61222:25;;:5;:8;61228:1;61222:8;;;;;;;;;;;:14;;;;;;;;;;;;:25;;;61218:64;;;61271:1;61260:12;;;;;:::i;:::-;;;61218:64;61204:3;;;;;:::i;:::-;;;;61175:114;;;;61302:7;61295:14;;;;61035:280;;;:::o;10401:103::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10466:30:::1;10493:1;10466:18;:30::i;:::-;10401:103::o:0;62107:137::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62220:18:::1;62195:22;:43;;;;62107:137:::0;:::o;58037:929::-;58127:22;;:::i;:::-;58158:15;58180:14;58197:1;58180:18;;58205;58234:26;58263:33;58288:7;58263:24;:33::i;:::-;58234:62;;58308:6;58303:602;58324:8;;:15;;58320:1;:19;58303:602;;;58365:8;;58374:1;58365:11;;;;;;;:::i;:::-;;;;;;;;58355:21;;58385:19;58407:5;:14;58413:7;58407:14;;;;;;;;;;;58385:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58454:7;58438:23;;:6;:12;;;:23;;;58430:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58487:16;58506:6;:16;;;58487:35;;58531:21;58573:6;:16;;;58555:15;:34;;;;:::i;:::-;58531:58;;58628:4;58602:30;;:13;:22;58616:7;58602:22;;;;;;;;;;;;;;;;;;;;;:30;;;58598:234;;;58658:65;58681:13;58696:16;;58714:8;58658:22;:65::i;:::-;58645:78;;58598:234;;;58763:59;58786:13;58801:10;;58813:8;58763:22;:59::i;:::-;58750:72;;58598:234;58894:3;58872:18;58865:3;58852:10;:16;;;;:::i;:::-;58851:39;;;;:::i;:::-;58850:47;;;;:::i;:::-;58840:57;;;;;:::i;:::-;;;58346:559;;;58341:3;;;;;:::i;:::-;;;;58303:602;;;;58924:1;58915:6;:10;58911:50;;;58938:15;;;;;;;;58946:6;58938:15;;;;;;;;;;;58911:50;58151:815;;;;58037:929;;;;;;:::o;60077:952::-;60194:7;60212:15;60230:1;60212:19;;60259:6;60244:12;:21;60240:761;;;60336:5;60323:9;60305:15;:27;;;;:::i;:::-;60288:13;:45;;;;:::i;:::-;:53;;;;:::i;:::-;60278:63;;60240:761;;;60376:6;60361:12;:21;:47;;;;;60401:7;60386:12;:22;60361:47;60357:644;;;60421:24;60505:5;60495:6;60483:9;60465:15;:27;;;;:::i;:::-;:36;;;;:::i;:::-;60448:13;:54;;;;:::i;:::-;:62;;;;:::i;:::-;60421:89;;60586:4;60560:22;;60541:16;:41;;;;:::i;:::-;60540:50;;;;:::i;:::-;60521:69;;60633:16;60616:13;60612:1;:17;;;;:::i;:::-;60611:38;;;;:::i;:::-;60601:48;;60410:249;60357:644;;;60684:7;60669:12;:22;60665:336;;;60704:24;60789:5;60778:7;60766:9;60748:15;:27;;;;:::i;:::-;:37;;;;:::i;:::-;60731:13;:55;;;;:::i;:::-;:63;;;;:::i;:::-;60704:90;;60871:4;60844:23;;60825:16;:42;;;;:::i;:::-;60824:51;;;;:::i;:::-;60805:70;;60975:16;60967:4;60941:22;;60925:13;60920:2;:18;;;;:::i;:::-;:43;;;;:::i;:::-;60919:52;;;;:::i;:::-;60901:13;60897:1;:17;;;;:::i;:::-;60896:76;;;;:::i;:::-;:95;;;;:::i;:::-;60886:105;;60693:308;60665:336;60357:644;60240:761;61016:7;61009:14;;;60077:952;;;;;:::o;53977:23::-;;;;:::o;54871:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54964:47::-;;;;;;;;;;;;;;;;;:::o;61321:546::-;61382:28;61419:14;61436:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61419:34;;61460:20;61497:6;61483:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61460:44;;61511:13;61539:12;61554:1;61539:16;;61535:181;61568:6;61557:7;:17;61535:181;;61624:7;61600:31;;:5;:14;61606:7;61600:14;;;;;;;;;;;:20;;;;;;;;;;;;:31;;;61596:113;;;61657:5;:14;61663:7;61657:14;;;;;;;;;;;:22;;;61644:3;61648:5;61644:10;;;;;;;;:::i;:::-;;;;;;;:35;;;;;61698:1;61690:9;;;;;:::i;:::-;;;61596:113;61576:9;;;;;:::i;:::-;;;;61535:181;;;;61722:23;61762:5;61748:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61722:46;;61779:6;61775:67;61795:5;61791:1;:9;61775:67;;;61828:3;61832:1;61828:6;;;;;;;;:::i;:::-;;;;;;;;61816;61823:1;61816:9;;;;;;;;:::i;:::-;;;;;;;:18;;;;;61802:3;;;;;:::i;:::-;;;;61775:67;;;;61855:6;61848:13;;;;;;61321:546;;;:::o;63015:121::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63072:5:::1;;;;;;;;;;;:14;;;63087:10;63099:5;;;;;;;;;;;:15;;;63123:4;63099:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63072:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63015:121::o:0;9750:87::-;9796:7;9823:6;;;;;;;;;;;9816:13;;9750:87;:::o;54275:26::-;;;;:::o;63142:106::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63235:7:::1;63214:13;:18;63228:3;63214:18;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;63142:106:::0;;:::o;54337:33::-;;;;:::o;54375:::-;;;;:::o;56616:140::-;1845:1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;56718:32:::1;56725:7;56734:8;;56744:5;56718:6;:32::i;:::-;1801:1:::0;2755:7;:22;;;;56616:140;;;:::o;54244:26::-;;;;:::o;54183:25::-;;;;:::o;54914:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;54306:26::-;;;;:::o;56762:117::-;1845:1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;56839:34:::1;56846:10;56858:8;;56868:4;56839:6;:34::i;:::-;1801:1:::0;2755:7;:22;;;;56762:117;;:::o;62250:139::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62365:18:::1;62339:23;:44;;;;62250:139:::0;:::o;10659:201::-;9981:12;:10;:12::i;:::-;9970:23;;:7;:5;:7::i;:::-;:23;;;9962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10768:1:::1;10748:22;;:8;:22;;;;10740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10824:28;10843:8;10824:18;:28::i;:::-;10659:201:::0;:::o;54005:34::-;;;;:::o;54136:42::-;;;;:::o;54839:25::-;;;;;;;;;;;;;:::o;54413:33::-;;;;:::o;8474:98::-;8527:7;8554:10;8547:17;;8474:98;:::o;56885:1146::-;56978:15;57000:14;57017:1;57000:18;;57025;57054:26;57083:33;57108:7;57083:24;:33::i;:::-;57054:62;;57128:6;57123:733;57144:8;;:15;;57140:1;:19;57123:733;;;57185:8;;57194:1;57185:11;;;;;;;:::i;:::-;;;;;;;;57175:21;;57205:19;57227:5;:14;57233:7;57227:14;;;;;;;;;;;57205:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57274:7;57258:23;;:6;:12;;;:23;;;57250:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57307:16;57326:6;:16;;;57307:35;;57351:21;57393:6;:16;;;57375:15;:34;;;;:::i;:::-;57351:58;;57448:4;57422:30;;:13;:22;57436:7;57422:22;;;;;;;;;;;;;;;;;;;;;:30;;;57418:234;;;57478:65;57501:13;57516:16;;57534:8;57478:22;:65::i;:::-;57465:78;;57418:234;;;57583:59;57606:13;57621:10;;57633:8;57583:22;:59::i;:::-;57570:72;;57418:234;57714:3;57692:18;57685:3;57672:10;:16;;;;:::i;:::-;57671:39;;;;:::i;:::-;57670:47;;;;:::i;:::-;57660:57;;;;;:::i;:::-;;;57743:105;;;;;;;;57794:7;57743:105;;;;57823:15;57743:105;;;;57767:7;57743:105;;;;;57726:5;:14;57732:7;57726:14;;;;;;;;;;;:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57166:690;;;57161:3;;;;;:::i;:::-;;;;57123:733;;;;57875:1;57866:6;:10;57862:60;;;57887:5;;;;;;;;;;;:10;;;57898:7;57907:6;57887:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57862:60;57932:8;57928:62;;;57951:31;57964:7;57973:8;;57951:12;:31::i;:::-;57928:62;58001:24;58009:7;58018:6;58001:24;;;;;;;:::i;:::-;;;;;;;;56971:1060;;;;56885:1146;;;;:::o;11020:191::-;11094:16;11113:6;;;;;;;;;;;11094:25;;11139:8;11130:6;;:17;;;;;;;;;;;;;;;;;;11194:8;11163:40;;11184:8;11163:40;;;;;;;;;;;;11083:128;11020:191;:::o;55980:508::-;56064:15;56091:6;56100:1;56091:10;;56086:397;56107:8;;:15;;56103:1;:19;56086:397;;;56148:8;;56157:1;56148:11;;;;;;;:::i;:::-;;;;;;;;56138:21;;56168:19;56190:5;:14;56196:7;56190:14;;;;;;;;;;;56168:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56237:10;56221:26;;:6;:12;;;:26;;;56213:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56280:5;:14;56286:7;56280:14;;;;;;;;;;;;56273:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56303:3;;;;;;;;;;;:16;;;56328:4;56335:7;56344;56303:49;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56389:1;56361:12;:24;56374:10;56361:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;56414:1;56399:11;;:16;;;;;;;:::i;:::-;;;;;;;;56429:46;56441:7;56450;56459:15;56429:46;;;;;;;;:::i;:::-;;;;;;;;56129:354;56124:3;;;;;:::i;:::-;;;;56086:397;;;;56057:431;55980:508;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:117::-;1486:1;1483;1476:12;1500:117;1609:1;1606;1599:12;1623:117;1732:1;1729;1722:12;1763:568;1836:8;1846:6;1896:3;1889:4;1881:6;1877:17;1873:27;1863:122;;1904:79;;:::i;:::-;1863:122;2017:6;2004:20;1994:30;;2047:18;2039:6;2036:30;2033:117;;;2069:79;;:::i;:::-;2033:117;2183:4;2175:6;2171:17;2159:29;;2237:3;2229:4;2221:6;2217:17;2207:8;2203:32;2200:41;2197:128;;;2244:79;;:::i;:::-;2197:128;1763:568;;;;;:::o;2337:559::-;2423:6;2431;2480:2;2468:9;2459:7;2455:23;2451:32;2448:119;;;2486:79;;:::i;:::-;2448:119;2634:1;2623:9;2619:17;2606:31;2664:18;2656:6;2653:30;2650:117;;;2686:79;;:::i;:::-;2650:117;2799:80;2871:7;2862:6;2851:9;2847:22;2799:80;:::i;:::-;2781:98;;;;2577:312;2337:559;;;;;:::o;2902:619::-;2979:6;2987;2995;3044:2;3032:9;3023:7;3019:23;3015:32;3012:119;;;3050:79;;:::i;:::-;3012:119;3170:1;3195:53;3240:7;3231:6;3220:9;3216:22;3195:53;:::i;:::-;3185:63;;3141:117;3297:2;3323:53;3368:7;3359:6;3348:9;3344:22;3323:53;:::i;:::-;3313:63;;3268:118;3425:2;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3396:118;2902:619;;;;;:::o;3527:126::-;3564:7;3604:42;3597:5;3593:54;3582:65;;3527:126;;;:::o;3659:96::-;3696:7;3725:24;3743:5;3725:24;:::i;:::-;3714:35;;3659:96;;;:::o;3761:122::-;3834:24;3852:5;3834:24;:::i;:::-;3827:5;3824:35;3814:63;;3873:1;3870;3863:12;3814:63;3761:122;:::o;3889:139::-;3935:5;3973:6;3960:20;3951:29;;3989:33;4016:5;3989:33;:::i;:::-;3889:139;;;;:::o;4034:329::-;4093:6;4142:2;4130:9;4121:7;4117:23;4113:32;4110:119;;;4148:79;;:::i;:::-;4110:119;4268:1;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4239:117;4034:329;;;;:::o;4382:552::-;4439:8;4449:6;4499:3;4492:4;4484:6;4480:17;4476:27;4466:122;;4507:79;;:::i;:::-;4466:122;4620:6;4607:20;4597:30;;4650:18;4642:6;4639:30;4636:117;;;4672:79;;:::i;:::-;4636:117;4786:4;4778:6;4774:17;4762:29;;4840:3;4832:4;4824:6;4820:17;4810:8;4806:32;4803:41;4800:128;;;4847:79;;:::i;:::-;4800:128;4382:552;;;;;:::o;4940:963::-;5037:6;5045;5053;5061;5069;5118:3;5106:9;5097:7;5093:23;5089:33;5086:120;;;5125:79;;:::i;:::-;5086:120;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5500:2;5526:53;5571:7;5562:6;5551:9;5547:22;5526:53;:::i;:::-;5516:63;;5471:118;5656:2;5645:9;5641:18;5628:32;5687:18;5679:6;5676:30;5673:117;;;5709:79;;:::i;:::-;5673:117;5822:64;5878:7;5869:6;5858:9;5854:22;5822:64;:::i;:::-;5804:82;;;;5599:297;4940:963;;;;;;;;:::o;5909:149::-;5945:7;5985:66;5978:5;5974:78;5963:89;;5909:149;;;:::o;6064:115::-;6149:23;6166:5;6149:23;:::i;:::-;6144:3;6137:36;6064:115;;:::o;6185:218::-;6276:4;6314:2;6303:9;6299:18;6291:26;;6327:69;6393:1;6382:9;6378:17;6369:6;6327:69;:::i;:::-;6185:218;;;;:::o;6409:704::-;6504:6;6512;6520;6569:2;6557:9;6548:7;6544:23;6540:32;6537:119;;;6575:79;;:::i;:::-;6537:119;6695:1;6720:53;6765:7;6756:6;6745:9;6741:22;6720:53;:::i;:::-;6710:63;;6666:117;6850:2;6839:9;6835:18;6822:32;6881:18;6873:6;6870:30;6867:117;;;6903:79;;:::i;:::-;6867:117;7016:80;7088:7;7079:6;7068:9;7064:22;7016:80;:::i;:::-;6998:98;;;;6793:313;6409:704;;;;;:::o;7119:114::-;7186:6;7220:5;7214:12;7204:22;;7119:114;;;:::o;7239:184::-;7338:11;7372:6;7367:3;7360:19;7412:4;7407:3;7403:14;7388:29;;7239:184;;;;:::o;7429:132::-;7496:4;7519:3;7511:11;;7549:4;7544:3;7540:14;7532:22;;7429:132;;;:::o;7567:108::-;7644:24;7662:5;7644:24;:::i;:::-;7639:3;7632:37;7567:108;;:::o;7681:179::-;7750:10;7771:46;7813:3;7805:6;7771:46;:::i;:::-;7849:4;7844:3;7840:14;7826:28;;7681:179;;;;:::o;7866:113::-;7936:4;7968;7963:3;7959:14;7951:22;;7866:113;;;:::o;8015:732::-;8134:3;8163:54;8211:5;8163:54;:::i;:::-;8233:86;8312:6;8307:3;8233:86;:::i;:::-;8226:93;;8343:56;8393:5;8343:56;:::i;:::-;8422:7;8453:1;8438:284;8463:6;8460:1;8457:13;8438:284;;;8539:6;8533:13;8566:63;8625:3;8610:13;8566:63;:::i;:::-;8559:70;;8652:60;8705:6;8652:60;:::i;:::-;8642:70;;8498:224;8485:1;8482;8478:9;8473:14;;8438:284;;;8442:14;8738:3;8731:10;;8139:608;;;8015:732;;;;:::o;8753:373::-;8896:4;8934:2;8923:9;8919:18;8911:26;;8983:9;8977:4;8973:20;8969:1;8958:9;8954:17;8947:47;9011:108;9114:4;9105:6;9011:108;:::i;:::-;9003:116;;8753:373;;;;:::o;9132:60::-;9160:3;9181:5;9174:12;;9132:60;;;:::o;9198:142::-;9248:9;9281:53;9299:34;9308:24;9326:5;9308:24;:::i;:::-;9299:34;:::i;:::-;9281:53;:::i;:::-;9268:66;;9198:142;;;:::o;9346:126::-;9396:9;9429:37;9460:5;9429:37;:::i;:::-;9416:50;;9346:126;;;:::o;9478:151::-;9553:9;9586:37;9617:5;9586:37;:::i;:::-;9573:50;;9478:151;;;:::o;9635:181::-;9747:62;9803:5;9747:62;:::i;:::-;9742:3;9735:75;9635:181;;:::o;9822:272::-;9940:4;9978:2;9967:9;9963:18;9955:26;;9991:96;10084:1;10073:9;10069:17;10060:6;9991:96;:::i;:::-;9822:272;;;;:::o;10100:104::-;10165:6;10193:4;10183:14;;10100:104;;;:::o;10210:143::-;10307:11;10344:3;10329:18;;10210:143;;;;:::o;10359:98::-;10424:4;10447:3;10439:11;;10359:98;;;:::o;10463:111::-;10531:4;10563;10558:3;10554:14;10546:22;;10463:111;;;:::o;10612:694::-;10748:52;10794:5;10748:52;:::i;:::-;10816:84;10893:6;10888:3;10816:84;:::i;:::-;10809:91;;10924:54;10972:5;10924:54;:::i;:::-;11001:7;11032:1;11017:282;11042:6;11039:1;11036:13;11017:282;;;11118:6;11112:13;11145:63;11204:3;11189:13;11145:63;:::i;:::-;11138:70;;11231:58;11282:6;11231:58;:::i;:::-;11221:68;;11077:222;11064:1;11061;11057:9;11052:14;;11017:282;;;11021:14;10724:582;;;10612:694;;:::o;11312:314::-;11451:4;11489:2;11478:9;11474:18;11466:26;;11502:117;11616:1;11605:9;11601:17;11592:6;11502:117;:::i;:::-;11312:314;;;;:::o;11632:118::-;11719:24;11737:5;11719:24;:::i;:::-;11714:3;11707:37;11632:118;;:::o;11756:442::-;11905:4;11943:2;11932:9;11928:18;11920:26;;11956:71;12024:1;12013:9;12009:17;12000:6;11956:71;:::i;:::-;12037:72;12105:2;12094:9;12090:18;12081:6;12037:72;:::i;:::-;12119;12187:2;12176:9;12172:18;12163:6;12119:72;:::i;:::-;11756:442;;;;;;:::o;12204:222::-;12297:4;12335:2;12324:9;12320:18;12312:26;;12348:71;12416:1;12405:9;12401:17;12392:6;12348:71;:::i;:::-;12204:222;;;;:::o;12432:90::-;12466:7;12509:5;12502:13;12495:21;12484:32;;12432:90;;;:::o;12528:116::-;12598:21;12613:5;12598:21;:::i;:::-;12591:5;12588:32;12578:60;;12634:1;12631;12624:12;12578:60;12528:116;:::o;12650:133::-;12693:5;12731:6;12718:20;12709:29;;12747:30;12771:5;12747:30;:::i;:::-;12650:133;;;;:::o;12789:468::-;12854:6;12862;12911:2;12899:9;12890:7;12886:23;12882:32;12879:119;;;12917:79;;:::i;:::-;12879:119;13037:1;13062:53;13107:7;13098:6;13087:9;13083:22;13062:53;:::i;:::-;13052:63;;13008:117;13164:2;13190:50;13232:7;13223:6;13212:9;13208:22;13190:50;:::i;:::-;13180:60;;13135:115;12789:468;;;;;:::o;13263:109::-;13344:21;13359:5;13344:21;:::i;:::-;13339:3;13332:34;13263:109;;:::o;13378:210::-;13465:4;13503:2;13492:9;13488:18;13480:26;;13516:65;13578:1;13567:9;13563:17;13554:6;13516:65;:::i;:::-;13378:210;;;;:::o;13594:147::-;13665:9;13698:37;13729:5;13698:37;:::i;:::-;13685:50;;13594:147;;;:::o;13747:173::-;13855:58;13907:5;13855:58;:::i;:::-;13850:3;13843:71;13747:173;;:::o;13926:264::-;14040:4;14078:2;14067:9;14063:18;14055:26;;14091:92;14180:1;14169:9;14165:17;14156:6;14091:92;:::i;:::-;13926:264;;;;:::o;14196:169::-;14280:11;14314:6;14309:3;14302:19;14354:4;14349:3;14345:14;14330:29;;14196:169;;;;:::o;14371:182::-;14511:34;14507:1;14499:6;14495:14;14488:58;14371:182;:::o;14559:366::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:419::-;15097:4;15135:2;15124:9;15120:18;15112:26;;15184:9;15178:4;15174:20;15170:1;15159:9;15155:17;15148:47;15212:131;15338:4;15212:131;:::i;:::-;15204:139;;14931:419;;;:::o;15356:181::-;15496:33;15492:1;15484:6;15480:14;15473:57;15356:181;:::o;15543:366::-;15685:3;15706:67;15770:2;15765:3;15706:67;:::i;:::-;15699:74;;15782:93;15871:3;15782:93;:::i;:::-;15900:2;15895:3;15891:12;15884:19;;15543:366;;;:::o;15915:419::-;16081:4;16119:2;16108:9;16104:18;16096:26;;16168:9;16162:4;16158:20;16154:1;16143:9;16139:17;16132:47;16196:131;16322:4;16196:131;:::i;:::-;16188:139;;15915:419;;;:::o;16340:180::-;16388:77;16385:1;16378:88;16485:4;16482:1;16475:15;16509:4;16506:1;16499:15;16526:143;16583:5;16614:6;16608:13;16599:22;;16630:33;16657:5;16630:33;:::i;:::-;16526:143;;;;:::o;16675:351::-;16745:6;16794:2;16782:9;16773:7;16769:23;16765:32;16762:119;;;16800:79;;:::i;:::-;16762:119;16920:1;16945:64;17001:7;16992:6;16981:9;16977:22;16945:64;:::i;:::-;16935:74;;16891:128;16675:351;;;;:::o;17032:164::-;17172:16;17168:1;17160:6;17156:14;17149:40;17032:164;:::o;17202:366::-;17344:3;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17441:93;17530:3;17441:93;:::i;:::-;17559:2;17554:3;17550:12;17543:19;;17202:366;;;:::o;17574:419::-;17740:4;17778:2;17767:9;17763:18;17755:26;;17827:9;17821:4;17817:20;17813:1;17802:9;17798:17;17791:47;17855:131;17981:4;17855:131;:::i;:::-;17847:139;;17574:419;;;:::o;17999:164::-;18139:16;18135:1;18127:6;18123:14;18116:40;17999:164;:::o;18169:366::-;18311:3;18332:67;18396:2;18391:3;18332:67;:::i;:::-;18325:74;;18408:93;18497:3;18408:93;:::i;:::-;18526:2;18521:3;18517:12;18510:19;;18169:366;;;:::o;18541:419::-;18707:4;18745:2;18734:9;18730:18;18722:26;;18794:9;18788:4;18784:20;18780:1;18769:9;18765:17;18758:47;18822:131;18948:4;18822:131;:::i;:::-;18814:139;;18541:419;;;:::o;18966:442::-;19115:4;19153:2;19142:9;19138:18;19130:26;;19166:71;19234:1;19223:9;19219:17;19210:6;19166:71;:::i;:::-;19247:72;19315:2;19304:9;19300:18;19291:6;19247:72;:::i;:::-;19329;19397:2;19386:9;19382:18;19373:6;19329:72;:::i;:::-;18966:442;;;;;;:::o;19414:180::-;19462:77;19459:1;19452:88;19559:4;19556:1;19549:15;19583:4;19580:1;19573:15;19600:305;19640:3;19659:20;19677:1;19659:20;:::i;:::-;19654:25;;19693:20;19711:1;19693:20;:::i;:::-;19688:25;;19847:1;19779:66;19775:74;19772:1;19769:81;19766:107;;;19853:18;;:::i;:::-;19766:107;19897:1;19894;19890:9;19883:16;;19600:305;;;;:::o;19911:442::-;20060:4;20098:2;20087:9;20083:18;20075:26;;20111:71;20179:1;20168:9;20164:17;20155:6;20111:71;:::i;:::-;20192:72;20260:2;20249:9;20245:18;20236:6;20192:72;:::i;:::-;20274;20342:2;20331:9;20327:18;20318:6;20274:72;:::i;:::-;19911:442;;;;;;:::o;20359:233::-;20398:3;20421:24;20439:5;20421:24;:::i;:::-;20412:33;;20467:66;20460:5;20457:77;20454:103;;;20537:18;;:::i;:::-;20454:103;20584:1;20577:5;20573:13;20566:20;;20359:233;;;:::o;20598:221::-;20738:34;20734:1;20726:6;20722:14;20715:58;20807:4;20802:2;20794:6;20790:15;20783:29;20598:221;:::o;20825:366::-;20967:3;20988:67;21052:2;21047:3;20988:67;:::i;:::-;20981:74;;21064:93;21153:3;21064:93;:::i;:::-;21182:2;21177:3;21173:12;21166:19;;20825:366;;;:::o;21197:419::-;21363:4;21401:2;21390:9;21386:18;21378:26;;21450:9;21444:4;21440:20;21436:1;21425:9;21421:17;21414:47;21478:131;21604:4;21478:131;:::i;:::-;21470:139;;21197:419;;;:::o;21622:180::-;21670:77;21667:1;21660:88;21767:4;21764:1;21757:15;21791:4;21788:1;21781:15;21808:162;21948:14;21944:1;21936:6;21932:14;21925:38;21808:162;:::o;21976:366::-;22118:3;22139:67;22203:2;22198:3;22139:67;:::i;:::-;22132:74;;22215:93;22304:3;22215:93;:::i;:::-;22333:2;22328:3;22324:12;22317:19;;21976:366;;;:::o;22348:419::-;22514:4;22552:2;22541:9;22537:18;22529:26;;22601:9;22595:4;22591:20;22587:1;22576:9;22572:17;22565:47;22629:131;22755:4;22629:131;:::i;:::-;22621:139;;22348:419;;;:::o;22773:143::-;22830:5;22861:6;22855:13;22846:22;;22877:33;22904:5;22877:33;:::i;:::-;22773:143;;;;:::o;22922:351::-;22992:6;23041:2;23029:9;23020:7;23016:23;23012:32;23009:119;;;23047:79;;:::i;:::-;23009:119;23167:1;23192:64;23248:7;23239:6;23228:9;23224:22;23192:64;:::i;:::-;23182:74;;23138:128;22922:351;;;;:::o;23279:191::-;23319:4;23339:20;23357:1;23339:20;:::i;:::-;23334:25;;23373:20;23391:1;23373:20;:::i;:::-;23368:25;;23412:1;23409;23406:8;23403:34;;;23417:18;;:::i;:::-;23403:34;23462:1;23459;23455:9;23447:17;;23279:191;;;;:::o;23476:180::-;23524:77;23521:1;23514:88;23621:4;23618:1;23611:15;23645:4;23642:1;23635:15;23662:185;23702:1;23719:20;23737:1;23719:20;:::i;:::-;23714:25;;23753:20;23771:1;23753:20;:::i;:::-;23748:25;;23792:1;23782:35;;23797:18;;:::i;:::-;23782:35;23839:1;23836;23832:9;23827:14;;23662:185;;;;:::o;23853:348::-;23893:7;23916:20;23934:1;23916:20;:::i;:::-;23911:25;;23950:20;23968:1;23950:20;:::i;:::-;23945:25;;24138:1;24070:66;24066:74;24063:1;24060:81;24055:1;24048:9;24041:17;24037:105;24034:131;;;24145:18;;:::i;:::-;24034:131;24193:1;24190;24186:9;24175:20;;23853:348;;;;:::o;24207:332::-;24328:4;24366:2;24355:9;24351:18;24343:26;;24379:71;24447:1;24436:9;24432:17;24423:6;24379:71;:::i;:::-;24460:72;24528:2;24517:9;24513:18;24504:6;24460:72;:::i;:::-;24207:332;;;;;:::o;24545:137::-;24599:5;24630:6;24624:13;24615:22;;24646:30;24670:5;24646:30;:::i;:::-;24545:137;;;;:::o;24688:345::-;24755:6;24804:2;24792:9;24783:7;24779:23;24775:32;24772:119;;;24810:79;;:::i;:::-;24772:119;24930:1;24955:61;25008:7;24999:6;24988:9;24984:22;24955:61;:::i;:::-;24945:71;;24901:125;24688:345;;;;:::o;25039:225::-;25179:34;25175:1;25167:6;25163:14;25156:58;25248:8;25243:2;25235:6;25231:15;25224:33;25039:225;:::o;25270:366::-;25412:3;25433:67;25497:2;25492:3;25433:67;:::i;:::-;25426:74;;25509:93;25598:3;25509:93;:::i;:::-;25627:2;25622:3;25618:12;25611:19;;25270:366;;;:::o;25642:419::-;25808:4;25846:2;25835:9;25831:18;25823:26;;25895:9;25889:4;25885:20;25881:1;25870:9;25866:17;25859:47;25923:131;26049:4;25923:131;:::i;:::-;25915:139;;25642:419;;;:::o
Swarm Source
ipfs://725b8b6eac7608b268b05fa8dc8825e4c6cf15d658789cafc17d6f03ef3c2b7e
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.