Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 114 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 16418560 | 774 days ago | IN | 0 ETH | 0.00042534 | ||||
Claim | 16407967 | 775 days ago | IN | 0 ETH | 0.00242432 | ||||
Claim | 16130573 | 814 days ago | IN | 0 ETH | 0.00035293 | ||||
Claim | 16130565 | 814 days ago | IN | 0 ETH | 0.00035943 | ||||
Stake | 16124908 | 815 days ago | IN | 0 ETH | 0.0009405 | ||||
Stake | 16018683 | 830 days ago | IN | 0 ETH | 0.00193408 | ||||
Stake | 15998291 | 832 days ago | IN | 0 ETH | 0.00054117 | ||||
Claim | 15892409 | 847 days ago | IN | 0 ETH | 0.00214965 | ||||
Stake | 15888345 | 848 days ago | IN | 0 ETH | 0.00083035 | ||||
Claim | 15887006 | 848 days ago | IN | 0 ETH | 0.04615733 | ||||
Claim | 15882687 | 849 days ago | IN | 0 ETH | 0.00029864 | ||||
Stake | 15880933 | 849 days ago | IN | 0 ETH | 0.00076123 | ||||
Claim | 15880645 | 849 days ago | IN | 0 ETH | 0.00713719 | ||||
Claim | 15880237 | 849 days ago | IN | 0 ETH | 0.00233269 | ||||
Claim | 15876948 | 849 days ago | IN | 0 ETH | 0.01441551 | ||||
Claim | 15876744 | 849 days ago | IN | 0 ETH | 0.00047005 | ||||
Claim | 15876710 | 849 days ago | IN | 0 ETH | 0.00048168 | ||||
Claim | 15872663 | 850 days ago | IN | 0 ETH | 0.00510063 | ||||
Claim | 15867861 | 851 days ago | IN | 0 ETH | 0.01535243 | ||||
Claim | 15866736 | 851 days ago | IN | 0 ETH | 0.00183573 | ||||
Claim | 15864863 | 851 days ago | IN | 0 ETH | 0.00228155 | ||||
Claim | 15864665 | 851 days ago | IN | 0 ETH | 0.00513299 | ||||
Claim | 15864462 | 851 days ago | IN | 0 ETH | 0.01092769 | ||||
Claim | 15864453 | 851 days ago | IN | 0 ETH | 0.00850126 | ||||
Claim | 15864175 | 851 days ago | IN | 0 ETH | 0.00252363 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BatangethNFTStaking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-07 */ /** *Submitted for verification at Etherscan.io on 2022-09-02 */ // SPDX-License-Identifier: MIT //*********************************************************************// //*********************************************************************// // // ________ ________ _________ ________ ________ ________ _______ _________ ___ ___ // |\ __ \|\ __ \|\___ ___\\ __ \|\ ___ \|\ ____\ |\ ___ \|\___ ___\\ \|\ \ // \ \ \|\ /\ \ \|\ \|___ \ \_\ \ \|\ \ \ \\ \ \ \ \___| \ \ __/\|___ \ \_\ \ \\\ \ // \ \ __ \ \ __ \ \ \ \ \ \ __ \ \ \\ \ \ \ \ ___ \ \ \_|/__ \ \ \ \ \ __ \ // \ \ \|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \ \ \ \|\ \ \ \ \_|\ \ \ \ \ \ \ \ \ \ // \ \_______\ \__\ \__\ \ \__\ \ \__\ \__\ \__\\ \__\ \_______\ \ \_______\ \ \__\ \ \__\ \__\ // \|_______|\|__|\|__| \|__| \|__|\|__|\|__| \|__|\|_______| \|_______| \|__| \|__|\|__| // // // // //*********************************************************************// //*********************************************************************// // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // 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; } } // 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); } // 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; } } // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // 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); } // 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); } // 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); } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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) { 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. * This is an internal function that does not check if the sender is authorized to operate on the token. * * 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 delete _tokenApprovals[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 delete _tokenApprovals[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 an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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 {} } // 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(); } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // 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); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) 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, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } pragma solidity ^0.8.0; contract BETHRewards is ERC20, ERC20Burnable, Ownable { mapping(address => bool) controllers; constructor() ERC20("BARYA", "BARYA") { } function mint(address to, uint256 amount) external { require(controllers[msg.sender], "Only controllers can mint"); _mint(to, amount); } function burnFrom(address account, uint256 amount) public override { if (controllers[msg.sender]) { _burn(account, amount); } else { super.burnFrom(account, amount); } } function addController(address controller) external onlyOwner { controllers[controller] = true; } function removeController(address controller) external onlyOwner { controllers[controller] = false; } } pragma solidity ^0.8.0; contract BatangethNFTStaking is Ownable, IERC721Receiver { uint256 public totalStaked; uint256 public reward = 400 ether; uint48 public timeLock = 10 minutes; // struct to store a stake's token, owner, and earning values struct Stake { uint24 tokenId; uint48 timestamp; uint48 timestamp_unstake; } event NFTStaked(uint256 tokenId, uint256 value, uint256 value2); event NFTUnstaked(uint256 tokenId, uint256 value, uint256 value2); event Claimed(address owner, uint256 amount); // reference to the Block NFT contract ERC721Enumerable nft; BETHRewards token; // maps tokenId to stake mapping(uint256 => Stake) public vault; constructor(ERC721Enumerable _nft, BETHRewards _token) { nft = _nft; token = _token; } function stake(uint256[] calldata tokenIds) external { uint256 tokenId; totalStaked += tokenIds.length; 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'); emit NFTStaked(tokenId, block.timestamp, block.timestamp + timeLock); vault[tokenId] = Stake({ tokenId: uint24(tokenId), timestamp: uint48(block.timestamp), timestamp_unstake: uint48(block.timestamp + timeLock) }); } } function _unstakeMany(address account,uint256[] calldata tokenIds) internal { uint256 tokenId; totalStaked -= tokenIds.length; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(nft.ownerOf(tokenId) == account, "not an owner"); require(block.timestamp >= staked.timestamp_unstake, "lock-in period not passed"); delete vault[tokenId]; emit NFTUnstaked(tokenId, block.timestamp, staked.timestamp_unstake); } } function claim(uint256[] calldata tokenIds) external { _claim(msg.sender, tokenIds, false); } function claimForAddress(address account, uint256[] calldata tokenIds) external { _claim(account, tokenIds, false); } function unstake(uint256[] calldata tokenIds) external { _claim(msg.sender, tokenIds, true); } function _claim(address account, uint256[] calldata tokenIds, bool _unstake) internal { uint256 tokenId; uint256 earned = 0; uint256 rewardmath = 0; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(nft.ownerOf(tokenId) == msg.sender, "not your token"); uint256 stakedAt = staked.timestamp; rewardmath = reward * (block.timestamp - stakedAt) / 86400 ; uint256 a_earned = rewardmath / 100; earned += a_earned; vault[tokenId] = Stake({ tokenId: uint24(tokenId), timestamp: uint48(block.timestamp), timestamp_unstake: uint48(staked.timestamp_unstake) }); } if (earned > 0) { token.mint(account, earned); } if (_unstake) { _unstakeMany(account, tokenIds); } emit Claimed(account, earned); } function setReward(uint256 _newReward) public onlyOwner { reward = (_newReward * 100) * (1 ether); } function setTimeLock(uint48 _newTimeLock) public onlyOwner { timeLock = _newTimeLock * (1 minutes); } function earningInfo(address account, uint256[] calldata tokenIds) external view returns (uint256[1] memory info) { uint256 tokenId; uint256 earned = 0; uint256 rewardmath = 0; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(nft.ownerOf(tokenId) == account, "not an owner"); uint256 stakedAt = staked.timestamp; rewardmath = reward * (block.timestamp - stakedAt) / 86400; uint256 a_earned = rewardmath / 100; earned += a_earned; } if (earned > 0) { return [earned]; } } function StakedInfo(address account, uint256[] calldata tokenIds) external view returns (uint256[1] memory info) { uint256 tokenId; uint256 earned = 0; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; Stake memory staked = vault[tokenId]; require(nft.ownerOf(tokenId) == account, "not an owner"); uint256 unstakedAt = staked.timestamp_unstake; earned = unstakedAt; } if (earned > 0) { return [earned]; } } // should never be used inside of transaction because of gas fee function balanceOf(address account) public view returns (uint256) { uint256 balance = 0; uint256 supply = nft.totalSupply(); for(uint i = 1; i <= supply; i++) { if (nft.ownerOf(i) == account && vault[i].tokenId > 0) { balance += 1; } } return balance; } // should never be used inside of transaction because of gas fee 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 (nft.ownerOf(tokenId) == account && vault[tokenId].tokenId > 0) { 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 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
Contract ABI
API[{"inputs":[{"internalType":"contract ERC721Enumerable","name":"_nft","type":"address"},{"internalType":"contract BETHRewards","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value2","type":"uint256"}],"name":"NFTStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value2","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":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"StakedInfo","outputs":[{"internalType":"uint256[1]","name":"info","type":"uint256[1]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"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":[],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newReward","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"_newTimeLock","type":"uint48"}],"name":"setTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"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":"","type":"uint256"}],"name":"vault","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"uint48","name":"timestamp","type":"uint48"},{"internalType":"uint48","name":"timestamp_unstake","type":"uint48"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526815af1d78b58c400000600255610258600360006101000a81548165ffffffffffff021916908365ffffffffffff1602179055503480156200004557600080fd5b5060405162002ba538038062002ba583398181016040528101906200006b91906200020f565b6200008b6200007f6200011560201b60201c565b6200011d60201b60201c565b81600360066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620002eb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001f281620002b7565b92915050565b6000815190506200020981620002d1565b92915050565b60008060408385031215620002295762000228620002b2565b5b60006200023985828601620001f8565b92505060206200024c85828601620001e1565b9150509250929050565b6000620002638262000292565b9050919050565b6000620002778262000256565b9050919050565b60006200028b8262000256565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002c2816200026a565b8114620002ce57600080fd5b50565b620002dc816200027e565b8114620002e857600080fd5b50565b6128aa80620002fb6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063817b1cd2116100a25780639b790295116100715780639b790295146102e1578063c36be35714610311578063d085835a1461032d578063e449f3411461034b578063f2fde38b1461036757610116565b8063817b1cd21461024357806381a36fb6146102615780638462151c146102935780638da5cb5b146102c357610116565b80634c950b0d116100e95780634c950b0d146101a15780636ba4c138146101bd57806370a08231146101d9578063715018a6146102095780637e75dd601461021357610116565b80630fbf0a931461011b578063150b7a0214610137578063228cb73314610167578063293be45614610185575b600080fd5b61013560048036038101906101309190611de9565b610383565b005b610151600480360381019061014c9190611d01565b6106b3565b60405161015e9190612169565b60405180910390f35b61016f610736565b60405161017c919061229b565b60405180910390f35b61019f600480360381019061019a9190611e36565b61073c565b005b6101bb60048036038101906101b69190611e90565b61076d565b005b6101d760048036038101906101d29190611de9565b6107a9565b005b6101f360048036038101906101ee9190611ca7565b6107ba565b604051610200919061229b565b60405180910390f35b6102116109b5565b005b61022d60048036038101906102289190611d89565b6109c9565b60405161023a919061212c565b60405180910390f35b61024b610c55565b604051610258919061229b565b60405180910390f35b61027b60048036038101906102769190611e36565b610c5b565b60405161028a93929190612264565b60405180910390f35b6102ad60048036038101906102a89190611ca7565b610cb8565b6040516102ba9190612147565b60405180910390f35b6102cb610fee565b6040516102d891906120e8565b60405180910390f35b6102fb60048036038101906102f69190611d89565b611017565b604051610308919061212c565b60405180910390f35b61032b60048036038101906103269190611d89565b61125a565b005b61033561126c565b6040516103429190612324565b60405180910390f35b61036560048036038101906103609190611de9565b611284565b005b610381600480360381019061037c9190611ca7565b611295565b005b6000828290506001600082825461039a91906123b6565b9250508190555060005b838390508110156106ad578383828181106103c2576103c161264d565b5b9050602002013591503373ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161043d919061229b565b60206040518083038186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048d9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146104e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104da906121a4565b60405180910390fd5b60006005600084815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054790612244565b60405180910390fd5b7fc9375dbc02806970b9b531d5e2df376cba874ce8b2bb36bc7644ae16272719218242600360009054906101000a900465ffffffffffff1665ffffffffffff164261059b91906123b6565b6040516105aa939291906122b6565b60405180910390a160405180606001604052808362ffffff1681526020014265ffffffffffff168152602001600360009054906101000a900465ffffffffffff1665ffffffffffff16426105fe91906123b6565b65ffffffffffff168152506005600084815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505080806106a5906125a6565b9150506103a4565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90612224565b60405180910390fd5b63150b7a0260e01b905095945050505050565b60025481565b610744611319565b670de0b6b3a764000060648261075a919061243d565b610764919061243d565b60028190555050565b610775611319565b603c816107829190612497565b600360006101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b6107b63383836000611397565b5050565b600080600090506000600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561082b57600080fd5b505afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611e63565b90506000600190505b8181116109aa578473ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108e5919061229b565b60206040518083038186803b1580156108fd57600080fd5b505afa158015610911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109359190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16148015610982575060006005600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16115b156109975760018361099491906123b6565b92505b80806109a2906125a6565b91505061086c565b508192505050919050565b6109bd611319565b6109c760006117a0565b565b6109d1611b70565b600080600090506000805b86869050811015610c27578686828181106109fa576109f961264d565b5b9050602002013593506000600560008681526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508873ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401610b12919061229b565b60206040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906121e4565b60405180910390fd5b6000816020015165ffffffffffff169050620151808142610bd991906124d7565b600254610be6919061243d565b610bf0919061240c565b93506000606485610c01919061240c565b90508086610c0f91906123b6565b95505050508080610c1f906125a6565b9150506109dc565b506000821115610c4a576040518060200160405280838152509350505050610c4e565b5050505b9392505050565b60015481565b60056020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900465ffffffffffff16908060000160099054906101000a900465ffffffffffff16905083565b60606000600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190611e63565b905060008167ffffffffffffffff811115610d7a57610d7961267c565b5b604051908082528060200260200182016040528015610da85781602001602082028036833780820191505090505b509050600080600190505b838111610f3b578573ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610e2c919061229b565b60206040518083038186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16148015610ec9575060006005600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16115b15610f28576005600082815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16838381518110610f0c57610f0b61264d565b5b602002602001018181525050600182610f2591906123b6565b91505b8080610f33906125a6565b915050610db3565b5060008167ffffffffffffffff811115610f5857610f5761267c565b5b604051908082528060200260200182016040528015610f865781602001602082028036833780820191505090505b50905060005b82811015610fe157838181518110610fa757610fa661264d565b5b6020026020010151828281518110610fc257610fc161264d565b5b6020026020010181815250508080610fd9906125a6565b915050610f8c565b5080945050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61101f611b70565b6000806000905060005b8585905081101561122e578585828181106110475761104661264d565b5b9050602002013592506000600560008581526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508773ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b815260040161115f919061229b565b60206040518083038186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111af9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906121e4565b60405180910390fd5b6000816040015165ffffffffffff16905080935050508080611226906125a6565b915050611029565b5060008111156112505760405180602001604052808281525092505050611253565b50505b9392505050565b6112678383836000611397565b505050565b600360009054906101000a900465ffffffffffff1681565b6112913383836001611397565b5050565b61129d611319565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490612184565b60405180910390fd5b611316816117a0565b50565b611321611864565b73ffffffffffffffffffffffffffffffffffffffff1661133f610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906121c4565b60405180910390fd5b565b600080600090506000805b868690508110156116b2578686828181106113c0576113bf61264d565b5b9050602002013593506000600560008681526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090503373ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b81526004016114d8919061229b565b60206040518083038186803b1580156114f057600080fd5b505afa158015611504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115289190611cd4565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906121a4565b60405180910390fd5b6000816020015165ffffffffffff16905062015180814261159f91906124d7565b6002546115ac919061243d565b6115b6919061240c565b935060006064856115c7919061240c565b905080866115d591906123b6565b955060405180606001604052808862ffffff1681526020014265ffffffffffff168152602001846040015165ffffffffffff168152506005600089815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505050505080806116aa906125a6565b9150506113a2565b50600082111561174c57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1988846040518363ffffffff1660e01b8152600401611719929190612103565b600060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b505050505b831561175e5761175d87878761186c565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a878360405161178f929190612103565b60405180910390a150505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000828290506001600082825461188391906124d7565b9250508190555060005b83839050811015611b69578383828181106118ab576118aa61264d565b5b9050602002013591506000600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508573ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016119c3919061229b565b60206040518083038186803b1580156119db57600080fd5b505afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a60906121e4565b60405180910390fd5b806040015165ffffffffffff16421015611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90612204565b60405180910390fd5b60056000848152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549065ffffffffffff02191690556000820160096101000a81549065ffffffffffff021916905550507fc308b34ed764063dbba9ef751325a41e48401feb9ea7e913765d14bd51b9309783428360400151604051611b4d939291906122ed565b60405180910390a1508080611b61906125a6565b91505061188d565b5050505050565b6040518060200160405280600190602082028036833780820191505090505090565b600081359050611ba18161282f565b92915050565b600081519050611bb68161282f565b92915050565b60008083601f840112611bd257611bd16126b0565b5b8235905067ffffffffffffffff811115611bef57611bee6126ab565b5b602083019150836020820283011115611c0b57611c0a6126b5565b5b9250929050565b60008083601f840112611c2857611c276126b0565b5b8235905067ffffffffffffffff811115611c4557611c446126ab565b5b602083019150836001820283011115611c6157611c606126b5565b5b9250929050565b600081359050611c7781612846565b92915050565b600081519050611c8c81612846565b92915050565b600081359050611ca18161285d565b92915050565b600060208284031215611cbd57611cbc6126bf565b5b6000611ccb84828501611b92565b91505092915050565b600060208284031215611cea57611ce96126bf565b5b6000611cf884828501611ba7565b91505092915050565b600080600080600060808688031215611d1d57611d1c6126bf565b5b6000611d2b88828901611b92565b9550506020611d3c88828901611b92565b9450506040611d4d88828901611c68565b935050606086013567ffffffffffffffff811115611d6e57611d6d6126ba565b5b611d7a88828901611c12565b92509250509295509295909350565b600080600060408486031215611da257611da16126bf565b5b6000611db086828701611b92565b935050602084013567ffffffffffffffff811115611dd157611dd06126ba565b5b611ddd86828701611bbc565b92509250509250925092565b60008060208385031215611e0057611dff6126bf565b5b600083013567ffffffffffffffff811115611e1e57611e1d6126ba565b5b611e2a85828601611bbc565b92509250509250929050565b600060208284031215611e4c57611e4b6126bf565b5b6000611e5a84828501611c68565b91505092915050565b600060208284031215611e7957611e786126bf565b5b6000611e8784828501611c7d565b91505092915050565b600060208284031215611ea657611ea56126bf565b5b6000611eb484828501611c92565b91505092915050565b6000611ec983836120ac565b60208301905092915050565b611ede8161250b565b82525050565b611eed81612359565b611ef78184612389565b9250611f028261233f565b8060005b83811015611f33578151611f1a8782611ebd565b9650611f258361236f565b925050600181019050611f06565b505050505050565b6000611f4682612364565b611f508185612394565b9350611f5b83612349565b8060005b83811015611f8c578151611f738882611ebd565b9750611f7e8361237c565b925050600181019050611f5f565b5085935050505092915050565b611fa28161251d565b82525050565b6000611fb56026836123a5565b9150611fc0826126c4565b604082019050919050565b6000611fd8600e836123a5565b9150611fe382612713565b602082019050919050565b6000611ffb6020836123a5565b91506120068261273c565b602082019050919050565b600061201e600c836123a5565b915061202982612765565b602082019050919050565b60006120416019836123a5565b915061204c8261278e565b602082019050919050565b60006120646022836123a5565b915061206f826127b7565b604082019050919050565b6000612087600e836123a5565b915061209282612806565b602082019050919050565b6120a681612569565b82525050565b6120b581612578565b82525050565b6120c481612578565b82525050565b6120d381612594565b82525050565b6120e281612582565b82525050565b60006020820190506120fd6000830184611ed5565b92915050565b60006040820190506121186000830185611ed5565b61212560208301846120bb565b9392505050565b60006020820190506121416000830184611ee4565b92915050565b600060208201905081810360008301526121618184611f3b565b905092915050565b600060208201905061217e6000830184611f99565b92915050565b6000602082019050818103600083015261219d81611fa8565b9050919050565b600060208201905081810360008301526121bd81611fcb565b9050919050565b600060208201905081810360008301526121dd81611fee565b9050919050565b600060208201905081810360008301526121fd81612011565b9050919050565b6000602082019050818103600083015261221d81612034565b9050919050565b6000602082019050818103600083015261223d81612057565b9050919050565b6000602082019050818103600083015261225d8161207a565b9050919050565b6000606082019050612279600083018661209d565b61228660208301856120d9565b61229360408301846120d9565b949350505050565b60006020820190506122b060008301846120bb565b92915050565b60006060820190506122cb60008301866120bb565b6122d860208301856120bb565b6122e560408301846120bb565b949350505050565b600060608201905061230260008301866120bb565b61230f60208301856120bb565b61231c60408301846120ca565b949350505050565b600060208201905061233960008301846120d9565b92915050565b6000819050919050565b6000819050602082019050919050565b600060019050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006123c182612578565b91506123cc83612578565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612401576124006125ef565b5b828201905092915050565b600061241782612578565b915061242283612578565b9250826124325761243161261e565b5b828204905092915050565b600061244882612578565b915061245383612578565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561248c5761248b6125ef565b5b828202905092915050565b60006124a282612582565b91506124ad83612582565b92508165ffffffffffff04831182151516156124cc576124cb6125ef565b5b828202905092915050565b60006124e282612578565b91506124ed83612578565b925082821015612500576124ff6125ef565b5b828203905092915050565b600061251682612549565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600065ffffffffffff82169050919050565b600061259f82612582565b9050919050565b60006125b182612578565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156125e4576125e36125ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e6f7420616e206f776e65720000000000000000000000000000000000000000600082015250565b7f6c6f636b2d696e20706572696f64206e6f742070617373656400000000000000600082015250565b7f43616e6e6f742073656e64206e66747320746f205661756c742064697265637460008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c7265616479207374616b6564000000000000000000000000000000000000600082015250565b6128388161250b565b811461284357600080fd5b50565b61284f81612578565b811461285a57600080fd5b50565b61286681612582565b811461287157600080fd5b5056fea2646970667358221220024664c5154441f0252e144258bddd8a579e4cb8e30f25ef4c6069feae400af564736f6c63430008070033000000000000000000000000a5c4d73c118661c3939ccae67132207668feec3f000000000000000000000000873683653dbcac5727a2b79822629b4f1c37b4c4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063817b1cd2116100a25780639b790295116100715780639b790295146102e1578063c36be35714610311578063d085835a1461032d578063e449f3411461034b578063f2fde38b1461036757610116565b8063817b1cd21461024357806381a36fb6146102615780638462151c146102935780638da5cb5b146102c357610116565b80634c950b0d116100e95780634c950b0d146101a15780636ba4c138146101bd57806370a08231146101d9578063715018a6146102095780637e75dd601461021357610116565b80630fbf0a931461011b578063150b7a0214610137578063228cb73314610167578063293be45614610185575b600080fd5b61013560048036038101906101309190611de9565b610383565b005b610151600480360381019061014c9190611d01565b6106b3565b60405161015e9190612169565b60405180910390f35b61016f610736565b60405161017c919061229b565b60405180910390f35b61019f600480360381019061019a9190611e36565b61073c565b005b6101bb60048036038101906101b69190611e90565b61076d565b005b6101d760048036038101906101d29190611de9565b6107a9565b005b6101f360048036038101906101ee9190611ca7565b6107ba565b604051610200919061229b565b60405180910390f35b6102116109b5565b005b61022d60048036038101906102289190611d89565b6109c9565b60405161023a919061212c565b60405180910390f35b61024b610c55565b604051610258919061229b565b60405180910390f35b61027b60048036038101906102769190611e36565b610c5b565b60405161028a93929190612264565b60405180910390f35b6102ad60048036038101906102a89190611ca7565b610cb8565b6040516102ba9190612147565b60405180910390f35b6102cb610fee565b6040516102d891906120e8565b60405180910390f35b6102fb60048036038101906102f69190611d89565b611017565b604051610308919061212c565b60405180910390f35b61032b60048036038101906103269190611d89565b61125a565b005b61033561126c565b6040516103429190612324565b60405180910390f35b61036560048036038101906103609190611de9565b611284565b005b610381600480360381019061037c9190611ca7565b611295565b005b6000828290506001600082825461039a91906123b6565b9250508190555060005b838390508110156106ad578383828181106103c2576103c161264d565b5b9050602002013591503373ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161043d919061229b565b60206040518083038186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048d9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146104e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104da906121a4565b60405180910390fd5b60006005600084815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054790612244565b60405180910390fd5b7fc9375dbc02806970b9b531d5e2df376cba874ce8b2bb36bc7644ae16272719218242600360009054906101000a900465ffffffffffff1665ffffffffffff164261059b91906123b6565b6040516105aa939291906122b6565b60405180910390a160405180606001604052808362ffffff1681526020014265ffffffffffff168152602001600360009054906101000a900465ffffffffffff1665ffffffffffff16426105fe91906123b6565b65ffffffffffff168152506005600084815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505080806106a5906125a6565b9150506103a4565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90612224565b60405180910390fd5b63150b7a0260e01b905095945050505050565b60025481565b610744611319565b670de0b6b3a764000060648261075a919061243d565b610764919061243d565b60028190555050565b610775611319565b603c816107829190612497565b600360006101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b6107b63383836000611397565b5050565b600080600090506000600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561082b57600080fd5b505afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611e63565b90506000600190505b8181116109aa578473ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108e5919061229b565b60206040518083038186803b1580156108fd57600080fd5b505afa158015610911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109359190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16148015610982575060006005600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16115b156109975760018361099491906123b6565b92505b80806109a2906125a6565b91505061086c565b508192505050919050565b6109bd611319565b6109c760006117a0565b565b6109d1611b70565b600080600090506000805b86869050811015610c27578686828181106109fa576109f961264d565b5b9050602002013593506000600560008681526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508873ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401610b12919061229b565b60206040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906121e4565b60405180910390fd5b6000816020015165ffffffffffff169050620151808142610bd991906124d7565b600254610be6919061243d565b610bf0919061240c565b93506000606485610c01919061240c565b90508086610c0f91906123b6565b95505050508080610c1f906125a6565b9150506109dc565b506000821115610c4a576040518060200160405280838152509350505050610c4e565b5050505b9392505050565b60015481565b60056020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900465ffffffffffff16908060000160099054906101000a900465ffffffffffff16905083565b60606000600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190611e63565b905060008167ffffffffffffffff811115610d7a57610d7961267c565b5b604051908082528060200260200182016040528015610da85781602001602082028036833780820191505090505b509050600080600190505b838111610f3b578573ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610e2c919061229b565b60206040518083038186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff16148015610ec9575060006005600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16115b15610f28576005600082815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16838381518110610f0c57610f0b61264d565b5b602002602001018181525050600182610f2591906123b6565b91505b8080610f33906125a6565b915050610db3565b5060008167ffffffffffffffff811115610f5857610f5761267c565b5b604051908082528060200260200182016040528015610f865781602001602082028036833780820191505090505b50905060005b82811015610fe157838181518110610fa757610fa661264d565b5b6020026020010151828281518110610fc257610fc161264d565b5b6020026020010181815250508080610fd9906125a6565b915050610f8c565b5080945050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61101f611b70565b6000806000905060005b8585905081101561122e578585828181106110475761104661264d565b5b9050602002013592506000600560008581526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508773ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b815260040161115f919061229b565b60206040518083038186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111af9190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906121e4565b60405180910390fd5b6000816040015165ffffffffffff16905080935050508080611226906125a6565b915050611029565b5060008111156112505760405180602001604052808281525092505050611253565b50505b9392505050565b6112678383836000611397565b505050565b600360009054906101000a900465ffffffffffff1681565b6112913383836001611397565b5050565b61129d611319565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490612184565b60405180910390fd5b611316816117a0565b50565b611321611864565b73ffffffffffffffffffffffffffffffffffffffff1661133f610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906121c4565b60405180910390fd5b565b600080600090506000805b868690508110156116b2578686828181106113c0576113bf61264d565b5b9050602002013593506000600560008681526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090503373ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b81526004016114d8919061229b565b60206040518083038186803b1580156114f057600080fd5b505afa158015611504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115289190611cd4565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906121a4565b60405180910390fd5b6000816020015165ffffffffffff16905062015180814261159f91906124d7565b6002546115ac919061243d565b6115b6919061240c565b935060006064856115c7919061240c565b905080866115d591906123b6565b955060405180606001604052808862ffffff1681526020014265ffffffffffff168152602001846040015165ffffffffffff168152506005600089815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548165ffffffffffff021916908365ffffffffffff16021790555060408201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505050505080806116aa906125a6565b9150506113a2565b50600082111561174c57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1988846040518363ffffffff1660e01b8152600401611719929190612103565b600060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b505050505b831561175e5761175d87878761186c565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a878360405161178f929190612103565b60405180910390a150505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000828290506001600082825461188391906124d7565b9250508190555060005b83839050811015611b69578383828181106118ab576118aa61264d565b5b9050602002013591506000600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160099054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090508573ffffffffffffffffffffffffffffffffffffffff16600360069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016119c3919061229b565b60206040518083038186803b1580156119db57600080fd5b505afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a60906121e4565b60405180910390fd5b806040015165ffffffffffff16421015611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90612204565b60405180910390fd5b60056000848152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549065ffffffffffff02191690556000820160096101000a81549065ffffffffffff021916905550507fc308b34ed764063dbba9ef751325a41e48401feb9ea7e913765d14bd51b9309783428360400151604051611b4d939291906122ed565b60405180910390a1508080611b61906125a6565b91505061188d565b5050505050565b6040518060200160405280600190602082028036833780820191505090505090565b600081359050611ba18161282f565b92915050565b600081519050611bb68161282f565b92915050565b60008083601f840112611bd257611bd16126b0565b5b8235905067ffffffffffffffff811115611bef57611bee6126ab565b5b602083019150836020820283011115611c0b57611c0a6126b5565b5b9250929050565b60008083601f840112611c2857611c276126b0565b5b8235905067ffffffffffffffff811115611c4557611c446126ab565b5b602083019150836001820283011115611c6157611c606126b5565b5b9250929050565b600081359050611c7781612846565b92915050565b600081519050611c8c81612846565b92915050565b600081359050611ca18161285d565b92915050565b600060208284031215611cbd57611cbc6126bf565b5b6000611ccb84828501611b92565b91505092915050565b600060208284031215611cea57611ce96126bf565b5b6000611cf884828501611ba7565b91505092915050565b600080600080600060808688031215611d1d57611d1c6126bf565b5b6000611d2b88828901611b92565b9550506020611d3c88828901611b92565b9450506040611d4d88828901611c68565b935050606086013567ffffffffffffffff811115611d6e57611d6d6126ba565b5b611d7a88828901611c12565b92509250509295509295909350565b600080600060408486031215611da257611da16126bf565b5b6000611db086828701611b92565b935050602084013567ffffffffffffffff811115611dd157611dd06126ba565b5b611ddd86828701611bbc565b92509250509250925092565b60008060208385031215611e0057611dff6126bf565b5b600083013567ffffffffffffffff811115611e1e57611e1d6126ba565b5b611e2a85828601611bbc565b92509250509250929050565b600060208284031215611e4c57611e4b6126bf565b5b6000611e5a84828501611c68565b91505092915050565b600060208284031215611e7957611e786126bf565b5b6000611e8784828501611c7d565b91505092915050565b600060208284031215611ea657611ea56126bf565b5b6000611eb484828501611c92565b91505092915050565b6000611ec983836120ac565b60208301905092915050565b611ede8161250b565b82525050565b611eed81612359565b611ef78184612389565b9250611f028261233f565b8060005b83811015611f33578151611f1a8782611ebd565b9650611f258361236f565b925050600181019050611f06565b505050505050565b6000611f4682612364565b611f508185612394565b9350611f5b83612349565b8060005b83811015611f8c578151611f738882611ebd565b9750611f7e8361237c565b925050600181019050611f5f565b5085935050505092915050565b611fa28161251d565b82525050565b6000611fb56026836123a5565b9150611fc0826126c4565b604082019050919050565b6000611fd8600e836123a5565b9150611fe382612713565b602082019050919050565b6000611ffb6020836123a5565b91506120068261273c565b602082019050919050565b600061201e600c836123a5565b915061202982612765565b602082019050919050565b60006120416019836123a5565b915061204c8261278e565b602082019050919050565b60006120646022836123a5565b915061206f826127b7565b604082019050919050565b6000612087600e836123a5565b915061209282612806565b602082019050919050565b6120a681612569565b82525050565b6120b581612578565b82525050565b6120c481612578565b82525050565b6120d381612594565b82525050565b6120e281612582565b82525050565b60006020820190506120fd6000830184611ed5565b92915050565b60006040820190506121186000830185611ed5565b61212560208301846120bb565b9392505050565b60006020820190506121416000830184611ee4565b92915050565b600060208201905081810360008301526121618184611f3b565b905092915050565b600060208201905061217e6000830184611f99565b92915050565b6000602082019050818103600083015261219d81611fa8565b9050919050565b600060208201905081810360008301526121bd81611fcb565b9050919050565b600060208201905081810360008301526121dd81611fee565b9050919050565b600060208201905081810360008301526121fd81612011565b9050919050565b6000602082019050818103600083015261221d81612034565b9050919050565b6000602082019050818103600083015261223d81612057565b9050919050565b6000602082019050818103600083015261225d8161207a565b9050919050565b6000606082019050612279600083018661209d565b61228660208301856120d9565b61229360408301846120d9565b949350505050565b60006020820190506122b060008301846120bb565b92915050565b60006060820190506122cb60008301866120bb565b6122d860208301856120bb565b6122e560408301846120bb565b949350505050565b600060608201905061230260008301866120bb565b61230f60208301856120bb565b61231c60408301846120ca565b949350505050565b600060208201905061233960008301846120d9565b92915050565b6000819050919050565b6000819050602082019050919050565b600060019050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006123c182612578565b91506123cc83612578565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612401576124006125ef565b5b828201905092915050565b600061241782612578565b915061242283612578565b9250826124325761243161261e565b5b828204905092915050565b600061244882612578565b915061245383612578565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561248c5761248b6125ef565b5b828202905092915050565b60006124a282612582565b91506124ad83612582565b92508165ffffffffffff04831182151516156124cc576124cb6125ef565b5b828202905092915050565b60006124e282612578565b91506124ed83612578565b925082821015612500576124ff6125ef565b5b828203905092915050565b600061251682612549565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600065ffffffffffff82169050919050565b600061259f82612582565b9050919050565b60006125b182612578565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156125e4576125e36125ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e6f7420616e206f776e65720000000000000000000000000000000000000000600082015250565b7f6c6f636b2d696e20706572696f64206e6f742070617373656400000000000000600082015250565b7f43616e6e6f742073656e64206e66747320746f205661756c742064697265637460008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c7265616479207374616b6564000000000000000000000000000000000000600082015250565b6128388161250b565b811461284357600080fd5b50565b61284f81612578565b811461285a57600080fd5b50565b61286681612582565b811461287157600080fd5b5056fea2646970667358221220024664c5154441f0252e144258bddd8a579e4cb8e30f25ef4c6069feae400af564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5c4d73c118661c3939ccae67132207668feec3f000000000000000000000000873683653dbcac5727a2b79822629b4f1c37b4c4
-----Decoded View---------------
Arg [0] : _nft (address): 0xa5C4d73C118661C3939CcAe67132207668FEec3f
Arg [1] : _token (address): 0x873683653dbCAC5727A2B79822629B4F1C37b4c4
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5c4d73c118661c3939ccae67132207668feec3f
Arg [1] : 000000000000000000000000873683653dbcac5727a2b79822629b4f1c37b4c4
Deployed Bytecode Sourcemap
66462:6517:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67316:655;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72670:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66561:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69999:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70121:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68580:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71602:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47002:103;;;:::i;:::-;;70244:709;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66528:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67150:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;72022:640;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46354:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70961:563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68695:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66601:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68834:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47260:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67316:655;67380:15;67421:8;;:15;;67406:11;;:30;;;;;;;:::i;:::-;;;;;;;;67452:6;67447:517;67468:8;;:15;;67464:1;:19;67447:517;;;67511:8;;67520:1;67511:11;;;;;;;:::i;:::-;;;;;;;;67501:21;;67565:10;67541:34;;:3;;;;;;;;;;;:11;;;67553:7;67541:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;67533:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;67639:1;67613:5;:14;67619:7;67613:14;;;;;;;;;;;:22;;;;;;;;;;;;:27;;;67605:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67677:63;67687:7;67696:15;67731:8;;;;;;;;;;;67713:26;;:15;:26;;;;:::i;:::-;67677:63;;;;;;;;:::i;:::-;;;;;;;;67778:174;;;;;;;;67815:7;67778:174;;;;;;67856:15;67778:174;;;;;;67931:8;;;;;;;;;;;67913:26;;:15;:26;;;;:::i;:::-;67778:174;;;;;67761:5;:14;67767:7;67761:14;;;;;;;;;;;:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67485:3;;;;;:::i;:::-;;;;67447:517;;;;67369:602;67316:655;;:::o;72670:302::-;72819:6;72862:3;72846:20;;:4;:20;;;72838:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;72923:41;;;72916:48;;72670:302;;;;;;;:::o;66561:33::-;;;;:::o;69999:114::-;46240:13;:11;:13::i;:::-;70097:7:::1;70089:3;70076:10;:16;;;;:::i;:::-;70075:30;;;;:::i;:::-;70066:6;:39;;;;69999:114:::0;:::o;70121:115::-;46240:13;:11;:13::i;:::-;70218:9:::1;70202:12;:26;;;;:::i;:::-;70191:8;;:37;;;;;;;;;;;;;;;;;;70121:115:::0;:::o;68580:107::-;68644:35;68651:10;68663:8;;68673:5;68644:6;:35::i;:::-;68580:107;;:::o;71602:342::-;71659:7;71679:15;71697:1;71679:19;;71709:14;71726:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71709:34;;71758:6;71767:1;71758:10;;71754:158;71775:6;71770:1;:11;71754:158;;71825:7;71807:25;;:3;;;;;;;;;;;:11;;;71819:1;71807:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;;;:49;;;;;71855:1;71836:5;:8;71842:1;71836:8;;;;;;;;;;;:16;;;;;;;;;;;;:20;;;71807:49;71803:98;;;71884:1;71873:12;;;;;:::i;:::-;;;71803:98;71783:3;;;;;:::i;:::-;;;;71754:158;;;;71929:7;71922:14;;;;71602:342;;;:::o;47002:103::-;46240:13;:11;:13::i;:::-;47067:30:::1;47094:1;47067:18;:30::i;:::-;47002:103::o:0;70244:709::-;70334:22;;:::i;:::-;70369:15;70395:14;70412:1;70395:18;;70424;70464:6;70459:419;70480:8;;:15;;70476:1;:19;70459:419;;;70527:8;;70536:1;70527:11;;;;;;;:::i;:::-;;;;;;;;70517:21;;70553:19;70575:5;:14;70581:7;70575:14;;;;;;;;;;;70553:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70636:7;70612:31;;:3;;;;;;;;;;;:11;;;70624:7;70612:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;70604:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;70675:16;70694:6;:16;;;70675:35;;;;70778:5;70766:8;70748:15;:26;;;;:::i;:::-;70738:6;;:37;;;;:::i;:::-;:45;;;;:::i;:::-;70725:58;;70798:16;70830:3;70817:10;:16;;;;:::i;:::-;70798:35;;70858:8;70848:18;;;;;:::i;:::-;;;70502:376;;;70497:3;;;;;:::i;:::-;;;;70459:419;;;;70901:1;70892:6;:10;70888:58;;;70919:15;;;;;;;;70927:6;70919:15;;;;;;;;;;70888:58;70358:595;;;70244:709;;;;;;:::o;66528:26::-;;;;:::o;67150:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72022:640::-;72083:28;72124:14;72141:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72124:34;;72169:20;72206:6;72192:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72169:44;;72224:13;72256:12;72271:1;72256:16;;72252:235;72285:6;72274:7;:17;72252:235;;72347:7;72323:31;;:3;;;;;;;;;;;:11;;;72335:7;72323:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;:61;;;;;72383:1;72358:5;:14;72364:7;72358:14;;;;;;;;;;;:22;;;;;;;;;;;;:26;;;72323:61;72319:157;;;72414:5;:14;72420:7;72414:14;;;;;;;;;;;:22;;;;;;;;;;;;72401:35;;:3;72405:5;72401:10;;;;;;;;:::i;:::-;;;;;;;:35;;;;;72459:1;72451:9;;;;;:::i;:::-;;;72319:157;72293:9;;;;;:::i;:::-;;;;72252:235;;;;72497:23;72537:5;72523:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72497:46;;72558:6;72554:77;72574:5;72570:1;:9;72554:77;;;72613:3;72617:1;72613:6;;;;;;;;:::i;:::-;;;;;;;;72601;72608:1;72601:9;;;;;;;;:::i;:::-;;;;;;;:18;;;;;72581:3;;;;;:::i;:::-;;;;72554:77;;;;72648:6;72641:13;;;;;;72022:640;;;:::o;46354:87::-;46400:7;46427:6;;;;;;;;;;;46420:13;;46354:87;:::o;70961:563::-;71050:22;;:::i;:::-;71085:15;71111:14;71128:1;71111:18;;71147:6;71142:307;71163:8;;:15;;71159:1;:19;71142:307;;;71210:8;;71219:1;71210:11;;;;;;;:::i;:::-;;;;;;;;71200:21;;71236:19;71258:5;:14;71264:7;71258:14;;;;;;;;;;;71236:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71319:7;71295:31;;:3;;;;;;;;;;;:11;;;71307:7;71295:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;71287:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;71358:18;71379:6;:24;;;71358:45;;;;71427:10;71418:19;;71185:264;;71180:3;;;;;:::i;:::-;;;;71142:307;;;;71472:1;71463:6;:10;71459:58;;;71490:15;;;;;;;;71498:6;71490:15;;;;;;;;;71459:58;71074:450;;70961:563;;;;;;:::o;68695:131::-;68786:32;68793:7;68802:8;;68812:5;68786:6;:32::i;:::-;68695:131;;;:::o;66601:35::-;;;;;;;;;;;;;:::o;68834:108::-;68900:34;68907:10;68919:8;;68929:4;68900:6;:34::i;:::-;68834:108;;:::o;47260:201::-;46240:13;:11;:13::i;:::-;47369:1:::1;47349:22;;:8;:22;;;;47341:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47425:28;47444:8;47425:18;:28::i;:::-;47260:201:::0;:::o;46519:132::-;46594:12;:10;:12::i;:::-;46583:23;;:7;:5;:7::i;:::-;:23;;;46575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46519:132::o;68950:1041::-;69047:15;69073:14;69090:1;69073:18;;69102;69142:6;69137:645;69158:8;;:15;;69154:1;:19;69137:645;;;69205:8;;69214:1;69205:11;;;;;;;:::i;:::-;;;;;;;;69195:21;;69231:19;69253:5;:14;69259:7;69253:14;;;;;;;;;;;69231:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69314:10;69290:34;;:3;;;;;;;;;;;:11;;;69302:7;69290:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;69282:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69358:16;69377:6;:16;;;69358:35;;;;69461:5;69449:8;69431:15;:26;;;;:::i;:::-;69421:6;;:37;;;;:::i;:::-;:45;;;;:::i;:::-;69408:58;;69482:16;69514:3;69501:10;:16;;;;:::i;:::-;69482:35;;69542:8;69532:18;;;;;:::i;:::-;;;69582:188;;;;;;;;69623:7;69582:188;;;;;;69668:15;69582:188;;;;;;69729:6;:24;;;69582:188;;;;;69565:5;:14;69571:7;69565:14;;;;;;;;;;;:205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69180:602;;;69175:3;;;;;:::i;:::-;;;;69137:645;;;;69805:1;69796:6;:10;69792:70;;;69823:5;;;;;;;;;;;:10;;;69834:7;69843:6;69823:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69792:70;69876:8;69872:72;;;69901:31;69914:7;69923:8;;69901:12;:31::i;:::-;69872:72;69959:24;69967:7;69976:6;69959:24;;;;;;;:::i;:::-;;;;;;;;69036:955;;;68950:1041;;;;:::o;47621:191::-;47695:16;47714:6;;;;;;;;;;;47695:25;;47740:8;47731:6;;:17;;;;;;;;;;;;;;;;;;47795:8;47764:40;;47785:8;47764:40;;;;;;;;;;;;47684:128;47621:191;:::o;11499:98::-;11552:7;11579:10;11572:17;;11499:98;:::o;67979:593::-;68066:15;68107:8;;:15;;68092:11;;:30;;;;;;;:::i;:::-;;;;;;;;68138:6;68133:432;68154:8;;:15;;68150:1;:19;68133:432;;;68201:8;;68210:1;68201:11;;;;;;;:::i;:::-;;;;;;;;68191:21;;68227:19;68249:5;:14;68255:7;68249:14;;;;;;;;;;;68227:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68312:7;68288:31;;:3;;;;;;;;;;;:11;;;68300:7;68288:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;68280:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;68378:6;:24;;;68359:43;;:15;:43;;68351:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68456:5;:14;68462:7;68456:14;;;;;;;;;;;;68449:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68490:63;68502:7;68511:15;68528:6;:24;;;68490:63;;;;;;;;:::i;:::-;;;;;;;;68176:389;68171:3;;;;;:::i;:::-;;;;68133:432;;;;68055:517;67979:593;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;905:552::-;962:8;972:6;1022:3;1015:4;1007:6;1003:17;999:27;989:122;;1030:79;;:::i;:::-;989:122;1143:6;1130:20;1120:30;;1173:18;1165:6;1162:30;1159:117;;;1195:79;;:::i;:::-;1159:117;1309:4;1301:6;1297:17;1285:29;;1363:3;1355:4;1347:6;1343:17;1333:8;1329:32;1326:41;1323:128;;;1370:79;;:::i;:::-;1323:128;905:552;;;;;:::o;1463:139::-;1509:5;1547:6;1534:20;1525:29;;1563:33;1590:5;1563:33;:::i;:::-;1463:139;;;;:::o;1608:143::-;1665:5;1696:6;1690:13;1681:22;;1712:33;1739:5;1712:33;:::i;:::-;1608:143;;;;:::o;1757:137::-;1802:5;1840:6;1827:20;1818:29;;1856:32;1882:5;1856:32;:::i;:::-;1757:137;;;;:::o;1900:329::-;1959:6;2008:2;1996:9;1987:7;1983:23;1979:32;1976:119;;;2014:79;;:::i;:::-;1976:119;2134:1;2159:53;2204:7;2195:6;2184:9;2180:22;2159:53;:::i;:::-;2149:63;;2105:117;1900:329;;;;:::o;2235:351::-;2305:6;2354:2;2342:9;2333:7;2329:23;2325:32;2322:119;;;2360:79;;:::i;:::-;2322:119;2480:1;2505:64;2561:7;2552:6;2541:9;2537:22;2505:64;:::i;:::-;2495:74;;2451:128;2235:351;;;;:::o;2592:963::-;2689:6;2697;2705;2713;2721;2770:3;2758:9;2749:7;2745:23;2741:33;2738:120;;;2777:79;;:::i;:::-;2738:120;2897:1;2922:53;2967:7;2958:6;2947:9;2943:22;2922:53;:::i;:::-;2912:63;;2868:117;3024:2;3050:53;3095:7;3086:6;3075:9;3071:22;3050:53;:::i;:::-;3040:63;;2995:118;3152:2;3178:53;3223:7;3214:6;3203:9;3199:22;3178:53;:::i;:::-;3168:63;;3123:118;3308:2;3297:9;3293:18;3280:32;3339:18;3331:6;3328:30;3325:117;;;3361:79;;:::i;:::-;3325:117;3474:64;3530:7;3521:6;3510:9;3506:22;3474:64;:::i;:::-;3456:82;;;;3251:297;2592:963;;;;;;;;:::o;3561:704::-;3656:6;3664;3672;3721:2;3709:9;3700:7;3696:23;3692:32;3689:119;;;3727:79;;:::i;:::-;3689:119;3847:1;3872:53;3917:7;3908:6;3897:9;3893:22;3872:53;:::i;:::-;3862:63;;3818:117;4002:2;3991:9;3987:18;3974:32;4033:18;4025:6;4022:30;4019:117;;;4055:79;;:::i;:::-;4019:117;4168:80;4240:7;4231:6;4220:9;4216:22;4168:80;:::i;:::-;4150:98;;;;3945:313;3561:704;;;;;:::o;4271:559::-;4357:6;4365;4414:2;4402:9;4393:7;4389:23;4385:32;4382:119;;;4420:79;;:::i;:::-;4382:119;4568:1;4557:9;4553:17;4540:31;4598:18;4590:6;4587:30;4584:117;;;4620:79;;:::i;:::-;4584:117;4733:80;4805:7;4796:6;4785:9;4781:22;4733:80;:::i;:::-;4715:98;;;;4511:312;4271:559;;;;;:::o;4836:329::-;4895:6;4944:2;4932:9;4923:7;4919:23;4915:32;4912:119;;;4950:79;;:::i;:::-;4912:119;5070:1;5095:53;5140:7;5131:6;5120:9;5116:22;5095:53;:::i;:::-;5085:63;;5041:117;4836:329;;;;:::o;5171:351::-;5241:6;5290:2;5278:9;5269:7;5265:23;5261:32;5258:119;;;5296:79;;:::i;:::-;5258:119;5416:1;5441:64;5497:7;5488:6;5477:9;5473:22;5441:64;:::i;:::-;5431:74;;5387:128;5171:351;;;;:::o;5528:327::-;5586:6;5635:2;5623:9;5614:7;5610:23;5606:32;5603:119;;;5641:79;;:::i;:::-;5603:119;5761:1;5786:52;5830:7;5821:6;5810:9;5806:22;5786:52;:::i;:::-;5776:62;;5732:116;5528:327;;;;:::o;5861:179::-;5930:10;5951:46;5993:3;5985:6;5951:46;:::i;:::-;6029:4;6024:3;6020:14;6006:28;;5861:179;;;;:::o;6046:118::-;6133:24;6151:5;6133:24;:::i;:::-;6128:3;6121:37;6046:118;;:::o;6202:694::-;6338:52;6384:5;6338:52;:::i;:::-;6406:84;6483:6;6478:3;6406:84;:::i;:::-;6399:91;;6514:54;6562:5;6514:54;:::i;:::-;6591:7;6622:1;6607:282;6632:6;6629:1;6626:13;6607:282;;;6708:6;6702:13;6735:63;6794:3;6779:13;6735:63;:::i;:::-;6728:70;;6821:58;6872:6;6821:58;:::i;:::-;6811:68;;6667:222;6654:1;6651;6647:9;6642:14;;6607:282;;;6611:14;6314:582;;;6202:694;;:::o;6932:732::-;7051:3;7080:54;7128:5;7080:54;:::i;:::-;7150:86;7229:6;7224:3;7150:86;:::i;:::-;7143:93;;7260:56;7310:5;7260:56;:::i;:::-;7339:7;7370:1;7355:284;7380:6;7377:1;7374:13;7355:284;;;7456:6;7450:13;7483:63;7542:3;7527:13;7483:63;:::i;:::-;7476:70;;7569:60;7622:6;7569:60;:::i;:::-;7559:70;;7415:224;7402:1;7399;7395:9;7390:14;;7355:284;;;7359:14;7655:3;7648:10;;7056:608;;;6932:732;;;;:::o;7670:115::-;7755:23;7772:5;7755:23;:::i;:::-;7750:3;7743:36;7670:115;;:::o;7791:366::-;7933:3;7954:67;8018:2;8013:3;7954:67;:::i;:::-;7947:74;;8030:93;8119:3;8030:93;:::i;:::-;8148:2;8143:3;8139:12;8132:19;;7791:366;;;:::o;8163:::-;8305:3;8326:67;8390:2;8385:3;8326:67;:::i;:::-;8319:74;;8402:93;8491:3;8402:93;:::i;:::-;8520:2;8515:3;8511:12;8504:19;;8163:366;;;:::o;8535:::-;8677:3;8698:67;8762:2;8757:3;8698:67;:::i;:::-;8691:74;;8774:93;8863:3;8774:93;:::i;:::-;8892:2;8887:3;8883:12;8876:19;;8535:366;;;:::o;8907:::-;9049:3;9070:67;9134:2;9129:3;9070:67;:::i;:::-;9063:74;;9146:93;9235:3;9146:93;:::i;:::-;9264:2;9259:3;9255:12;9248:19;;8907:366;;;:::o;9279:::-;9421:3;9442:67;9506:2;9501:3;9442:67;:::i;:::-;9435:74;;9518:93;9607:3;9518:93;:::i;:::-;9636:2;9631:3;9627:12;9620:19;;9279:366;;;:::o;9651:::-;9793:3;9814:67;9878:2;9873:3;9814:67;:::i;:::-;9807:74;;9890:93;9979:3;9890:93;:::i;:::-;10008:2;10003:3;9999:12;9992:19;;9651:366;;;:::o;10023:::-;10165:3;10186:67;10250:2;10245:3;10186:67;:::i;:::-;10179:74;;10262:93;10351:3;10262:93;:::i;:::-;10380:2;10375:3;10371:12;10364:19;;10023:366;;;:::o;10395:115::-;10480:23;10497:5;10480:23;:::i;:::-;10475:3;10468:36;10395:115;;:::o;10516:108::-;10593:24;10611:5;10593:24;:::i;:::-;10588:3;10581:37;10516:108;;:::o;10630:118::-;10717:24;10735:5;10717:24;:::i;:::-;10712:3;10705:37;10630:118;;:::o;10754:129::-;10840:36;10870:5;10840:36;:::i;:::-;10835:3;10828:49;10754:129;;:::o;10889:115::-;10974:23;10991:5;10974:23;:::i;:::-;10969:3;10962:36;10889:115;;:::o;11010:222::-;11103:4;11141:2;11130:9;11126:18;11118:26;;11154:71;11222:1;11211:9;11207:17;11198:6;11154:71;:::i;:::-;11010:222;;;;:::o;11238:332::-;11359:4;11397:2;11386:9;11382:18;11374:26;;11410:71;11478:1;11467:9;11463:17;11454:6;11410:71;:::i;:::-;11491:72;11559:2;11548:9;11544:18;11535:6;11491:72;:::i;:::-;11238:332;;;;;:::o;11576:314::-;11715:4;11753:2;11742:9;11738:18;11730:26;;11766:117;11880:1;11869:9;11865:17;11856:6;11766:117;:::i;:::-;11576:314;;;;:::o;11896:373::-;12039:4;12077:2;12066:9;12062:18;12054:26;;12126:9;12120:4;12116:20;12112:1;12101:9;12097:17;12090:47;12154:108;12257:4;12248:6;12154:108;:::i;:::-;12146:116;;11896:373;;;;:::o;12275:218::-;12366:4;12404:2;12393:9;12389:18;12381:26;;12417:69;12483:1;12472:9;12468:17;12459:6;12417:69;:::i;:::-;12275:218;;;;:::o;12499:419::-;12665:4;12703:2;12692:9;12688:18;12680:26;;12752:9;12746:4;12742:20;12738:1;12727:9;12723:17;12716:47;12780:131;12906:4;12780:131;:::i;:::-;12772:139;;12499:419;;;:::o;12924:::-;13090:4;13128:2;13117:9;13113:18;13105:26;;13177:9;13171:4;13167:20;13163:1;13152:9;13148:17;13141:47;13205:131;13331:4;13205:131;:::i;:::-;13197:139;;12924:419;;;:::o;13349:::-;13515:4;13553:2;13542:9;13538:18;13530:26;;13602:9;13596:4;13592:20;13588:1;13577:9;13573:17;13566:47;13630:131;13756:4;13630:131;:::i;:::-;13622:139;;13349:419;;;:::o;13774:::-;13940:4;13978:2;13967:9;13963:18;13955:26;;14027:9;14021:4;14017:20;14013:1;14002:9;13998:17;13991:47;14055:131;14181:4;14055:131;:::i;:::-;14047:139;;13774:419;;;:::o;14199:::-;14365:4;14403:2;14392:9;14388:18;14380:26;;14452:9;14446:4;14442:20;14438:1;14427:9;14423:17;14416:47;14480:131;14606:4;14480:131;:::i;:::-;14472:139;;14199:419;;;:::o;14624:::-;14790:4;14828:2;14817:9;14813:18;14805:26;;14877:9;14871:4;14867:20;14863:1;14852:9;14848:17;14841:47;14905:131;15031:4;14905:131;:::i;:::-;14897:139;;14624:419;;;:::o;15049:::-;15215:4;15253:2;15242:9;15238:18;15230:26;;15302:9;15296:4;15292:20;15288:1;15277:9;15273:17;15266:47;15330:131;15456:4;15330:131;:::i;:::-;15322:139;;15049:419;;;:::o;15474:430::-;15617:4;15655:2;15644:9;15640:18;15632:26;;15668:69;15734:1;15723:9;15719:17;15710:6;15668:69;:::i;:::-;15747:70;15813:2;15802:9;15798:18;15789:6;15747:70;:::i;:::-;15827;15893:2;15882:9;15878:18;15869:6;15827:70;:::i;:::-;15474:430;;;;;;:::o;15910:222::-;16003:4;16041:2;16030:9;16026:18;16018:26;;16054:71;16122:1;16111:9;16107:17;16098:6;16054:71;:::i;:::-;15910:222;;;;:::o;16138:442::-;16287:4;16325:2;16314:9;16310:18;16302:26;;16338:71;16406:1;16395:9;16391:17;16382:6;16338:71;:::i;:::-;16419:72;16487:2;16476:9;16472:18;16463:6;16419:72;:::i;:::-;16501;16569:2;16558:9;16554:18;16545:6;16501:72;:::i;:::-;16138:442;;;;;;:::o;16586:440::-;16734:4;16772:2;16761:9;16757:18;16749:26;;16785:71;16853:1;16842:9;16838:17;16829:6;16785:71;:::i;:::-;16866:72;16934:2;16923:9;16919:18;16910:6;16866:72;:::i;:::-;16948:71;17015:2;17004:9;17000:18;16991:6;16948:71;:::i;:::-;16586:440;;;;;;:::o;17032:218::-;17123:4;17161:2;17150:9;17146:18;17138:26;;17174:69;17240:1;17229:9;17225:17;17216:6;17174:69;:::i;:::-;17032:218;;;;:::o;17337:98::-;17402:4;17425:3;17417:11;;17337:98;;;:::o;17441:132::-;17508:4;17531:3;17523:11;;17561:4;17556:3;17552:14;17544:22;;17441:132;;;:::o;17579:104::-;17644:6;17672:4;17662:14;;17579:104;;;:::o;17689:114::-;17756:6;17790:5;17784:12;17774:22;;17689:114;;;:::o;17809:111::-;17877:4;17909;17904:3;17900:14;17892:22;;17809:111;;;:::o;17926:113::-;17996:4;18028;18023:3;18019:14;18011:22;;17926:113;;;:::o;18045:143::-;18142:11;18179:3;18164:18;;18045:143;;;;:::o;18194:184::-;18293:11;18327:6;18322:3;18315:19;18367:4;18362:3;18358:14;18343:29;;18194:184;;;;:::o;18384:169::-;18468:11;18502:6;18497:3;18490:19;18542:4;18537:3;18533:14;18518:29;;18384:169;;;;:::o;18559:305::-;18599:3;18618:20;18636:1;18618:20;:::i;:::-;18613:25;;18652:20;18670:1;18652:20;:::i;:::-;18647:25;;18806:1;18738:66;18734:74;18731:1;18728:81;18725:107;;;18812:18;;:::i;:::-;18725:107;18856:1;18853;18849:9;18842:16;;18559:305;;;;:::o;18870:185::-;18910:1;18927:20;18945:1;18927:20;:::i;:::-;18922:25;;18961:20;18979:1;18961:20;:::i;:::-;18956:25;;19000:1;18990:35;;19005:18;;:::i;:::-;18990:35;19047:1;19044;19040:9;19035:14;;18870:185;;;;:::o;19061:348::-;19101:7;19124:20;19142:1;19124:20;:::i;:::-;19119:25;;19158:20;19176:1;19158:20;:::i;:::-;19153:25;;19346:1;19278:66;19274:74;19271:1;19268:81;19263:1;19256:9;19249:17;19245:105;19242:131;;;19353:18;;:::i;:::-;19242:131;19401:1;19398;19394:9;19383:20;;19061:348;;;;:::o;19415:293::-;19454:7;19477:19;19494:1;19477:19;:::i;:::-;19472:24;;19510:19;19527:1;19510:19;:::i;:::-;19505:24;;19645:1;19629:14;19625:22;19622:1;19619:29;19614:1;19607:9;19600:17;19596:53;19593:79;;;19652:18;;:::i;:::-;19593:79;19700:1;19697;19693:9;19682:20;;19415:293;;;;:::o;19714:191::-;19754:4;19774:20;19792:1;19774:20;:::i;:::-;19769:25;;19808:20;19826:1;19808:20;:::i;:::-;19803:25;;19847:1;19844;19841:8;19838:34;;;19852:18;;:::i;:::-;19838:34;19897:1;19894;19890:9;19882:17;;19714:191;;;;:::o;19911:96::-;19948:7;19977:24;19995:5;19977:24;:::i;:::-;19966:35;;19911:96;;;:::o;20013:149::-;20049:7;20089:66;20082:5;20078:78;20067:89;;20013:149;;;:::o;20168:126::-;20205:7;20245:42;20238:5;20234:54;20223:65;;20168:126;;;:::o;20300:91::-;20336:7;20376:8;20369:5;20365:20;20354:31;;20300:91;;;:::o;20397:77::-;20434:7;20463:5;20452:16;;20397:77;;;:::o;20480:97::-;20516:7;20556:14;20549:5;20545:26;20534:37;;20480:97;;;:::o;20583:111::-;20632:9;20665:23;20682:5;20665:23;:::i;:::-;20652:36;;20583:111;;;:::o;20700:233::-;20739:3;20762:24;20780:5;20762:24;:::i;:::-;20753:33;;20808:66;20801:5;20798:77;20795:103;;;20878:18;;:::i;:::-;20795:103;20925:1;20918:5;20914:13;20907:20;;20700:233;;;:::o;20939:180::-;20987:77;20984:1;20977:88;21084:4;21081:1;21074:15;21108:4;21105:1;21098:15;21125:180;21173:77;21170:1;21163:88;21270:4;21267:1;21260:15;21294:4;21291:1;21284:15;21311:180;21359:77;21356:1;21349:88;21456:4;21453:1;21446:15;21480:4;21477:1;21470:15;21497:180;21545:77;21542:1;21535:88;21642:4;21639:1;21632:15;21666:4;21663:1;21656:15;21683:117;21792:1;21789;21782:12;21806:117;21915:1;21912;21905:12;21929:117;22038:1;22035;22028:12;22052:117;22161:1;22158;22151:12;22175:117;22284:1;22281;22274:12;22298:225;22438:34;22434:1;22426:6;22422:14;22415:58;22507:8;22502:2;22494:6;22490:15;22483:33;22298:225;:::o;22529:164::-;22669:16;22665:1;22657:6;22653:14;22646:40;22529:164;:::o;22699:182::-;22839:34;22835:1;22827:6;22823:14;22816:58;22699:182;:::o;22887:162::-;23027:14;23023:1;23015:6;23011:14;23004:38;22887:162;:::o;23055:175::-;23195:27;23191:1;23183:6;23179:14;23172:51;23055:175;:::o;23236:221::-;23376:34;23372:1;23364:6;23360:14;23353:58;23445:4;23440:2;23432:6;23428:15;23421:29;23236:221;:::o;23463:164::-;23603:16;23599:1;23591:6;23587:14;23580:40;23463:164;:::o;23633:122::-;23706:24;23724:5;23706:24;:::i;:::-;23699:5;23696:35;23686:63;;23745:1;23742;23735:12;23686:63;23633:122;:::o;23761:::-;23834:24;23852:5;23834:24;:::i;:::-;23827:5;23824:35;23814:63;;23873:1;23870;23863:12;23814:63;23761:122;:::o;23889:120::-;23961:23;23978:5;23961:23;:::i;:::-;23954:5;23951:34;23941:62;;23999:1;23996;23989:12;23941:62;23889:120;:::o
Swarm Source
ipfs://024664c5154441f0252e144258bddd8a579e4cb8e30f25ef4c6069feae400af5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.