ERC-721
NFT
Overview
Max Total Supply
5,000 MAL_LOOT
Holders
898
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MAL_LOOTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MoonLootBag
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @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.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @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/ERC721Enumerable.sol) /** * @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 v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IMAL { function spendMAL(address user, uint256 amount) external; } interface ISTAKING { function balanceOf(address user) external view returns (uint256); } contract MoonLootBag is Context, ERC721Enumerable, Ownable, ReentrancyGuard { using SafeMath for uint256; using Strings for uint256; string private _lootBaseURI; uint256 public constant MAX_SUPPLY = 5000; uint256 public _basePriceAmount; uint256 public _basePrice; uint256 public _incrementPrice; bool public saleIsActive; bool public apeOwnershipRequired; mapping (address => bool) private _isAuthorised; address[] public authorisedLog; IMAL public MAL; ISTAKING public STAKING; IERC721 public APES; mapping(address => uint256) public _mintedByAddress; event LootsMinted(address indexed mintedBy, uint256 indexed tokensNumber); constructor(address _apes, address _staking, address _mal) ERC721("Moon Loot Bags", "MAL_LOOT"){ MAL = IMAL(_mal); STAKING = ISTAKING(_staking); APES = IERC721(_apes); _isAuthorised[_staking] = true; _lootBaseURI = "ipfs://QmUbDeEV5ZdXqqzcMDAex4PfAVvKC4c5p6KdWrQr7oC5pP/"; apeOwnershipRequired = true; _basePriceAmount = 3; _basePrice = 1000 ether; _incrementPrice = 1000 ether; } modifier onlyAuthorised { require(_isAuthorised[_msgSender()], "Not Authorised"); _; } function authorise(address addressToAuth) public onlyOwner { _isAuthorised[addressToAuth] = true; authorisedLog.push(addressToAuth); } function unauthorise(address addressToUnAuth) public onlyOwner { _isAuthorised[addressToUnAuth] = false; } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view override returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender) || _isAuthorised[spender]); } function reserveForGiveaways(uint256 lootsToMint) public onlyOwner{ require(totalSupply().add(lootsToMint) <= MAX_SUPPLY, "Minting more tokens than allowed"); for(uint256 i = 0; i < lootsToMint; i++) { _safeMint(_msgSender(), totalSupply() + 1); } } function giveaway(address[] memory receivers) public onlyOwner{ require(totalSupply().add(receivers.length) <= MAX_SUPPLY, "Minting more tokens than allowed"); for(uint256 i = 0; i < receivers.length; i++) { _safeMint(receivers[i], totalSupply() + 1); } } function purchaseLoot(uint256 lootsToMint) public nonReentrant { require(saleIsActive, "The mint has not started yet"); require(_basePrice > 0, "The mint has not started yet"); require(_incrementPrice > 0, "The mint has not started yet"); require(_validateApeOwnership(_msgSender()), "You do not have any Moon Apes"); require(lootsToMint > 0, "Min mint is 1 token"); require(lootsToMint <= 50, "You can mint max 50 tokens per transaction"); require(totalSupply().add(lootsToMint) <= MAX_SUPPLY, "Minting more tokens than allowed"); uint256 totalPrice = getTokensPrice(_msgSender(), lootsToMint); MAL.spendMAL(_msgSender(), totalPrice); _mintedByAddress[_msgSender()] += lootsToMint; for(uint256 i = 0; i < lootsToMint; i++) { _safeMint(_msgSender(), totalSupply() + 1); } emit LootsMinted(_msgSender(), lootsToMint); } function getUserMintedAmount(address user) public view returns(uint256){ return _mintedByAddress[user]; } function getTokensPrice(address user, uint256 amount) public view returns (uint256) { uint256 minted = _mintedByAddress[user]; if (minted.add(amount) <= _basePriceAmount) return amount.mul(_basePrice); uint256 totalPrice; for (uint256 i; i < amount; i++) { minted = minted.add(1); if (minted <= _basePriceAmount) { totalPrice = totalPrice.add(_basePrice); continue; } totalPrice += _basePrice.add((minted.sub(_basePriceAmount).mul(_incrementPrice))); } return totalPrice; } function _validateApeOwnership(address user) internal view returns (bool) { if (!apeOwnershipRequired) return true; if (STAKING.balanceOf(user) > 0) return true; return APES.balanceOf(user) > 0; } function updateApeOwnershipRequirement(bool _isOwnershipRequired) public onlyOwner { apeOwnershipRequired = _isOwnershipRequired; } function updateSaleStatus(bool status) public onlyOwner { saleIsActive = status; } function updateBasePrice(uint256 _newPrice) public onlyOwner { require(!saleIsActive, "Pause sale before price update"); _basePrice = _newPrice; } function updateBasePriceAmount(uint256 _amount) public onlyOwner { _basePriceAmount = _amount; } function updateIncrementPrice(uint256 incrementPrice) public onlyOwner { require(!saleIsActive, "Pause sale before price update"); _incrementPrice = incrementPrice; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(string(abi.encodePacked(_lootBaseURI, tokenId.toString())), ".json")); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(owner()).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_apes","type":"address"},{"internalType":"address","name":"_staking","type":"address"},{"internalType":"address","name":"_mal","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"LootsMinted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"APES","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAL","outputs":[{"internalType":"contract IMAL","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING","outputs":[{"internalType":"contract ISTAKING","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_basePriceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_incrementPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apeOwnershipRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAuth","type":"address"}],"name":"authorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorisedLog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTokensPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootsToMint","type":"uint256"}],"name":"purchaseLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootsToMint","type":"uint256"}],"name":"reserveForGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToUnAuth","type":"address"}],"name":"unauthorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOwnershipRequired","type":"bool"}],"name":"updateApeOwnershipRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"updateBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateBasePriceAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"incrementPrice","type":"uint256"}],"name":"updateIncrementPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002be838038062002be8833981016040819052620000349162000298565b604080518082018252600e81526d4d6f6f6e204c6f6f74204261677360901b60208083019182528351808501909452600884526713505317d313d3d560c21b9084015281519192916200008a91600091620001d5565b508051620000a0906001906020840190620001d5565b505050620000bd620000b76200017f60201b60201c565b62000183565b6001600b819055601380546001600160a01b038085166001600160a01b0319928316179092556014805486841690831681179091556015805493881693909216929092179055600090815260116020908152604091829020805460ff19169093179092558051606081019091526036808252909162002bb29083013980516200014f91600c91602090910190620001d5565b50506010805461ff00191661010017905550506003600d55683635c9adc5dea00000600e819055600f556200031f565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e390620002e2565b90600052602060002090601f01602090048101928262000207576000855562000252565b82601f106200022257805160ff191683800117855562000252565b8280016001018555821562000252579182015b828111156200025257825182559160200191906001019062000235565b506200026092915062000264565b5090565b5b8082111562000260576000815560010162000265565b80516001600160a01b03811681146200029357600080fd5b919050565b600080600060608486031215620002ae57600080fd5b620002b9846200027b565b9250620002c9602085016200027b565b9150620002d9604085016200027b565b90509250925092565b600181811c90821680620002f757607f821691505b602082108114156200031957634e487b7160e01b600052602260045260246000fd5b50919050565b612883806200032f6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637bdadbcf11610151578063c82bc61d116100c3578063eb8d244411610087578063eb8d24441461055e578063f1c73b701461056b578063f2fde38b1461057e578063f31121d714610591578063f4461fc8146105a3578063fd5baa88146105b657600080fd5b8063c82bc61d146104c9578063c87b56dd146104dc578063cdfa59a9146104ef578063cff0c0ef1461050f578063e985e9c51461052257600080fd5b806395d89b411161011557806395d89b411461046257806397610f301461046a578063983360231461047d578063a22cb46514610490578063b88d4fde146104a3578063c3c6f3ca146104b657600080fd5b80637bdadbcf1461040f57806380833d781461042257806386d57d8b146104355780638da5cb5b1461043e578063922fab051461044f57600080fd5b806332cb6b0c116101ea5780634f6ccce7116101ae5780634f6ccce7146103b25780636352211e146103c557806366e6c8af146103d857806370a08231146103eb578063715018a6146103fe578063748b61671461040657600080fd5b806332cb6b0c1461035c5780633ccfd60b1461036557806342842e0e1461036d57806344cf661f1461038057806347705cbc1461038957600080fd5b806318160ddd1161023157806318160ddd146102fe57806323b872dd1461031057806328d46df0146103235780632f745c5914610336578063311d38931461034957600080fd5b806301ffc9a71461026e57806306fdde0314610296578063081812fc146102ab578063095ea7b3146102d65780630a088949146102eb575b600080fd5b61028161027c366004612388565b6105c9565b60405190151581526020015b60405180910390f35b61029e6105f4565b60405161028d9190612549565b6102be6102b93660046123c2565b610686565b6040516001600160a01b03909116815260200161028d565b6102e96102e436600461228f565b610720565b005b6102e96102f936600461236d565b610836565b6008545b60405190815260200161028d565b6102e961031e366004612169565b610873565b6102e96103313660046122b9565b6108a4565b61030261034436600461228f565b61095b565b6102e96103573660046123c2565b6109f1565b61030261138881565b6102e9610a20565b6102e961037b366004612169565b610a95565b610302600e5481565b61030261039736600461211b565b6001600160a01b031660009081526016602052604090205490565b6103026103c03660046123c2565b610ab0565b6102be6103d33660046123c2565b610b43565b6102e96103e636600461211b565b610bba565b6103026103f936600461211b565b610c4a565b6102e9610cd1565b610302600f5481565b6013546102be906001600160a01b031681565b6102e961043036600461211b565b610d07565b610302600d5481565b600a546001600160a01b03166102be565b6015546102be906001600160a01b031681565b61029e610d52565b6014546102be906001600160a01b031681565b6102e961048b3660046123c2565b610d61565b6102e961049e366004612265565b610de3565b6102e96104b13660046121a5565b610dee565b6102e96104c43660046123c2565b610e26565b6102be6104d73660046123c2565b611130565b61029e6104ea3660046123c2565b61115a565b6103026104fd36600461211b565b60166020526000908152604090205481565b61030261051d36600461228f565b611228565b610281610530366004612136565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6010546102819060ff1681565b6102e96105793660046123c2565b6112f5565b6102e961058c36600461211b565b611377565b60105461028190610100900460ff1681565b6102e96105b136600461236d565b611412565b6102e96105c43660046123c2565b611456565b60006001600160e01b0319821663780e9d6360e01b14806105ee57506105ee826114d8565b92915050565b6060600080546106039061275f565b80601f016020809104026020016040519081016040528092919081815260200182805461062f9061275f565b801561067c5780601f106106515761010080835404028352916020019161067c565b820191906000526020600020905b81548152906001019060200180831161065f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107045760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061072b82610b43565b9050806001600160a01b0316836001600160a01b031614156107995760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106fb565b336001600160a01b03821614806107b557506107b58133610530565b6108275760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106fb565b6108318383611528565b505050565b600a546001600160a01b031633146108605760405162461bcd60e51b81526004016106fb906125e3565b6010805460ff1916911515919091179055565b61087d3382611596565b6108995760405162461bcd60e51b81526004016106fb90612618565b6108318383836116b0565b600a546001600160a01b031633146108ce5760405162461bcd60e51b81526004016106fb906125e3565b6113886108e582516108df60085490565b90611857565b11156109035760405162461bcd60e51b81526004016106fb906125ae565b60005b8151811015610957576109458282815181106109245761092461280b565b602002602001015161093560085490565b6109409060016126d1565b61186a565b8061094f8161279a565b915050610906565b5050565b600061096683610c4a565b82106109c85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106fb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a1b5760405162461bcd60e51b81526004016106fb906125e3565b600d55565b600a546001600160a01b03163314610a4a5760405162461bcd60e51b81526004016106fb906125e3565b47610a5d600a546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610957573d6000803e3d6000fd5b61083183838360405180602001604052806000815250610dee565b6000610abb60085490565b8210610b1e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106fb565b60088281548110610b3157610b3161280b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106fb565b600a546001600160a01b03163314610be45760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b03166000818152601160205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b60006001600160a01b038216610cb55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106fb565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610cfb5760405162461bcd60e51b81526004016106fb906125e3565b610d056000611884565b565b600a546001600160a01b03163314610d315760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b03166000908152601160205260409020805460ff19169055565b6060600180546106039061275f565b600a546001600160a01b03163314610d8b5760405162461bcd60e51b81526004016106fb906125e3565b611388610d9b826108df60085490565b1115610db95760405162461bcd60e51b81526004016106fb906125ae565b60005b8181101561095757610dd1335b600854610935565b80610ddb8161279a565b915050610dbc565b6109573383836118d6565b610df83383611596565b610e145760405162461bcd60e51b81526004016106fb90612618565b610e20848484846119a5565b50505050565b6002600b541415610e795760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106fb565b6002600b5560105460ff16610ea05760405162461bcd60e51b81526004016106fb90612669565b6000600e5411610ec25760405162461bcd60e51b81526004016106fb90612669565b6000600f5411610ee45760405162461bcd60e51b81526004016106fb90612669565b610eed336119d8565b610f395760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e79204d6f6f6e204170657300000060448201526064016106fb565b60008111610f7f5760405162461bcd60e51b815260206004820152601360248201527226b4b71036b4b73a1034b99018903a37b5b2b760691b60448201526064016106fb565b6032811115610fe35760405162461bcd60e51b815260206004820152602a60248201527f596f752063616e206d696e74206d617820353020746f6b656e732070657220746044820152693930b739b0b1ba34b7b760b11b60648201526084016106fb565b611388610ff3826108df60085490565b11156110115760405162461bcd60e51b81526004016106fb906125ae565b600061101d3383611228565b6013549091506001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b50505050816016600061109e3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110cd91906126d1565b90915550600090505b828110156110f9576110e733610dc9565b806110f18161279a565b9150506110d6565b50604051829033907f5dfcc088c5d00a81315e7a64e15444bf105108d4bb5905c26759dbad1bfb343290600090a350506001600b55565b6012818154811061114057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600260205260409020546060906001600160a01b03166111d95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fb565b600c6111e483611b03565b6040516020016111f5929190612465565b60408051601f19818403018152908290526112129160200161243c565b6040516020818303038152906040529050919050565b6001600160a01b038216600090815260166020526040812054600d5461124e8285611857565b1161126957600e54611261908490611c01565b9150506105ee565b6000805b848110156112ec57611280836001611857565b9250600d5483116112a057600e54611299908390611857565b91506112da565b6112cd6112c4600f546112be600d5487611c0d90919063ffffffff16565b90611c01565b600e5490611857565b6112d790836126d1565b91505b806112e48161279a565b91505061126d565b50949350505050565b600a546001600160a01b0316331461131f5760405162461bcd60e51b81526004016106fb906125e3565b60105460ff16156113725760405162461bcd60e51b815260206004820152601e60248201527f50617573652073616c65206265666f726520707269636520757064617465000060448201526064016106fb565b600f55565b600a546001600160a01b031633146113a15760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b0381166114065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fb565b61140f81611884565b50565b600a546001600160a01b0316331461143c5760405162461bcd60e51b81526004016106fb906125e3565b601080549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146114805760405162461bcd60e51b81526004016106fb906125e3565b60105460ff16156114d35760405162461bcd60e51b815260206004820152601e60248201527f50617573652073616c65206265666f726520707269636520757064617465000060448201526064016106fb565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061150957506001600160e01b03198216635b5e139f60e01b145b806105ee57506301ffc9a760e01b6001600160e01b03198316146105ee565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061155d82610b43565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661160f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fb565b600061161a83610b43565b9050806001600160a01b0316846001600160a01b031614806116555750836001600160a01b031661164a84610686565b6001600160a01b0316145b8061168557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806116a857506001600160a01b03841660009081526011602052604090205460ff165b949350505050565b826001600160a01b03166116c382610b43565b6001600160a01b0316146117275760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016106fb565b6001600160a01b0382166117895760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106fb565b611794838383611c19565b61179f600082611528565b6001600160a01b03831660009081526003602052604081208054600192906117c890849061271c565b90915550506001600160a01b03821660009081526003602052604081208054600192906117f69084906126d1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061186382846126d1565b9392505050565b610957828260405180602001604052806000815250611cd1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156119385760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106fb565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119b08484846116b0565b6119bc84848484611d04565b610e205760405162461bcd60e51b81526004016106fb9061255c565b601054600090610100900460ff166119f257506001919050565b6014546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611a3857600080fd5b505afa158015611a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7091906123db565b1115611a7e57506001919050565b6015546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc91906123db565b1192915050565b606081611b275750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b515780611b3b8161279a565b9150611b4a9050600a836126e9565b9150611b2b565b60008167ffffffffffffffff811115611b6c57611b6c612821565b6040519080825280601f01601f191660200182016040528015611b96576020820181803683370190505b5090505b84156116a857611bab60018361271c565b9150611bb8600a866127b5565b611bc39060306126d1565b60f81b818381518110611bd857611bd861280b565b60200101906001600160f81b031916908160001a905350611bfa600a866126e9565b9450611b9a565b600061186382846126fd565b6000611863828461271c565b6001600160a01b038316611c7457611c6f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c97565b816001600160a01b0316836001600160a01b031614611c9757611c978382611e11565b6001600160a01b038216611cae5761083181611eae565b826001600160a01b0316826001600160a01b031614610831576108318282611f5d565b611cdb8383611fa1565b611ce86000848484611d04565b6108315760405162461bcd60e51b81526004016106fb9061255c565b60006001600160a01b0384163b15611e0657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d4890339089908890889060040161250c565b602060405180830381600087803b158015611d6257600080fd5b505af1925050508015611d92575060408051601f3d908101601f19168201909252611d8f918101906123a5565b60015b611dec573d808015611dc0576040519150601f19603f3d011682016040523d82523d6000602084013e611dc5565b606091505b508051611de45760405162461bcd60e51b81526004016106fb9061255c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116a8565b506001949350505050565b60006001611e1e84610c4a565b611e28919061271c565b600083815260076020526040902054909150808214611e7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ec09060019061271c565b60008381526009602052604081205460088054939450909284908110611ee857611ee861280b565b906000526020600020015490508060088381548110611f0957611f0961280b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f4157611f416127f5565b6001900381819060005260206000200160009055905550505050565b6000611f6883610c4a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611ff75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106fb565b6000818152600260205260409020546001600160a01b03161561205c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106fb565b61206860008383611c19565b6001600160a01b03821660009081526003602052604081208054600192906120919084906126d1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461210657600080fd5b919050565b8035801515811461210657600080fd5b60006020828403121561212d57600080fd5b611863826120ef565b6000806040838503121561214957600080fd5b612152836120ef565b9150612160602084016120ef565b90509250929050565b60008060006060848603121561217e57600080fd5b612187846120ef565b9250612195602085016120ef565b9150604084013590509250925092565b600080600080608085870312156121bb57600080fd5b6121c4856120ef565b935060206121d38187016120ef565b935060408601359250606086013567ffffffffffffffff808211156121f757600080fd5b818801915088601f83011261220b57600080fd5b81358181111561221d5761221d612821565b61222f601f8201601f191685016126a0565b9150808252898482850101111561224557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561227857600080fd5b612281836120ef565b91506121606020840161210b565b600080604083850312156122a257600080fd5b6122ab836120ef565b946020939093013593505050565b600060208083850312156122cc57600080fd5b823567ffffffffffffffff808211156122e457600080fd5b818501915085601f8301126122f857600080fd5b81358181111561230a5761230a612821565b8060051b915061231b8483016126a0565b8181528481019084860184860187018a101561233657600080fd5b600095505b838610156123605761234c816120ef565b83526001959095019491860191860161233b565b5098975050505050505050565b60006020828403121561237f57600080fd5b6118638261210b565b60006020828403121561239a57600080fd5b813561186381612837565b6000602082840312156123b757600080fd5b815161186381612837565b6000602082840312156123d457600080fd5b5035919050565b6000602082840312156123ed57600080fd5b5051919050565b6000815180845261240c816020860160208601612733565b601f01601f19169290920160200192915050565b60008151612432818560208601612733565b9290920192915050565b6000825161244e818460208701612733565b64173539b7b760d91b920191825250600501919050565b600080845481600182811c91508083168061248157607f831692505b60208084108214156124a157634e487b7160e01b86526022600452602486fd5b8180156124b557600181146124c6576124f3565b60ff198616895284890196506124f3565b60008b81526020902060005b868110156124eb5781548b8201529085019083016124d2565b505084890196505b5050505050506125038185612420565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061253f908301846123f4565b9695505050505050565b60208152600061186360208301846123f4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4d696e74696e67206d6f726520746f6b656e73207468616e20616c6c6f776564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c9612821565b604052919050565b600082198211156126e4576126e46127c9565b500190565b6000826126f8576126f86127df565b500490565b6000816000190483118215151615612717576127176127c9565b500290565b60008282101561272e5761272e6127c9565b500390565b60005b8381101561274e578181015183820152602001612736565b83811115610e205750506000910152565b600181811c9082168061277357607f821691505b6020821081141561279457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127ae576127ae6127c9565b5060010190565b6000826127c4576127c46127df565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140f57600080fdfea2646970667358221220954bf0006439ebc929c2a2571883588d0e8b19ab0d05b0a64a89e9af65f7a9f964736f6c63430008070033697066733a2f2f516d556244654556355a645871717a634d444165783450664156764b4334633570364b6457725172376f433570502f00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c80637bdadbcf11610151578063c82bc61d116100c3578063eb8d244411610087578063eb8d24441461055e578063f1c73b701461056b578063f2fde38b1461057e578063f31121d714610591578063f4461fc8146105a3578063fd5baa88146105b657600080fd5b8063c82bc61d146104c9578063c87b56dd146104dc578063cdfa59a9146104ef578063cff0c0ef1461050f578063e985e9c51461052257600080fd5b806395d89b411161011557806395d89b411461046257806397610f301461046a578063983360231461047d578063a22cb46514610490578063b88d4fde146104a3578063c3c6f3ca146104b657600080fd5b80637bdadbcf1461040f57806380833d781461042257806386d57d8b146104355780638da5cb5b1461043e578063922fab051461044f57600080fd5b806332cb6b0c116101ea5780634f6ccce7116101ae5780634f6ccce7146103b25780636352211e146103c557806366e6c8af146103d857806370a08231146103eb578063715018a6146103fe578063748b61671461040657600080fd5b806332cb6b0c1461035c5780633ccfd60b1461036557806342842e0e1461036d57806344cf661f1461038057806347705cbc1461038957600080fd5b806318160ddd1161023157806318160ddd146102fe57806323b872dd1461031057806328d46df0146103235780632f745c5914610336578063311d38931461034957600080fd5b806301ffc9a71461026e57806306fdde0314610296578063081812fc146102ab578063095ea7b3146102d65780630a088949146102eb575b600080fd5b61028161027c366004612388565b6105c9565b60405190151581526020015b60405180910390f35b61029e6105f4565b60405161028d9190612549565b6102be6102b93660046123c2565b610686565b6040516001600160a01b03909116815260200161028d565b6102e96102e436600461228f565b610720565b005b6102e96102f936600461236d565b610836565b6008545b60405190815260200161028d565b6102e961031e366004612169565b610873565b6102e96103313660046122b9565b6108a4565b61030261034436600461228f565b61095b565b6102e96103573660046123c2565b6109f1565b61030261138881565b6102e9610a20565b6102e961037b366004612169565b610a95565b610302600e5481565b61030261039736600461211b565b6001600160a01b031660009081526016602052604090205490565b6103026103c03660046123c2565b610ab0565b6102be6103d33660046123c2565b610b43565b6102e96103e636600461211b565b610bba565b6103026103f936600461211b565b610c4a565b6102e9610cd1565b610302600f5481565b6013546102be906001600160a01b031681565b6102e961043036600461211b565b610d07565b610302600d5481565b600a546001600160a01b03166102be565b6015546102be906001600160a01b031681565b61029e610d52565b6014546102be906001600160a01b031681565b6102e961048b3660046123c2565b610d61565b6102e961049e366004612265565b610de3565b6102e96104b13660046121a5565b610dee565b6102e96104c43660046123c2565b610e26565b6102be6104d73660046123c2565b611130565b61029e6104ea3660046123c2565b61115a565b6103026104fd36600461211b565b60166020526000908152604090205481565b61030261051d36600461228f565b611228565b610281610530366004612136565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6010546102819060ff1681565b6102e96105793660046123c2565b6112f5565b6102e961058c36600461211b565b611377565b60105461028190610100900460ff1681565b6102e96105b136600461236d565b611412565b6102e96105c43660046123c2565b611456565b60006001600160e01b0319821663780e9d6360e01b14806105ee57506105ee826114d8565b92915050565b6060600080546106039061275f565b80601f016020809104026020016040519081016040528092919081815260200182805461062f9061275f565b801561067c5780601f106106515761010080835404028352916020019161067c565b820191906000526020600020905b81548152906001019060200180831161065f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107045760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061072b82610b43565b9050806001600160a01b0316836001600160a01b031614156107995760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106fb565b336001600160a01b03821614806107b557506107b58133610530565b6108275760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106fb565b6108318383611528565b505050565b600a546001600160a01b031633146108605760405162461bcd60e51b81526004016106fb906125e3565b6010805460ff1916911515919091179055565b61087d3382611596565b6108995760405162461bcd60e51b81526004016106fb90612618565b6108318383836116b0565b600a546001600160a01b031633146108ce5760405162461bcd60e51b81526004016106fb906125e3565b6113886108e582516108df60085490565b90611857565b11156109035760405162461bcd60e51b81526004016106fb906125ae565b60005b8151811015610957576109458282815181106109245761092461280b565b602002602001015161093560085490565b6109409060016126d1565b61186a565b8061094f8161279a565b915050610906565b5050565b600061096683610c4a565b82106109c85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106fb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a1b5760405162461bcd60e51b81526004016106fb906125e3565b600d55565b600a546001600160a01b03163314610a4a5760405162461bcd60e51b81526004016106fb906125e3565b47610a5d600a546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610957573d6000803e3d6000fd5b61083183838360405180602001604052806000815250610dee565b6000610abb60085490565b8210610b1e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106fb565b60088281548110610b3157610b3161280b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106fb565b600a546001600160a01b03163314610be45760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b03166000818152601160205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b60006001600160a01b038216610cb55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106fb565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610cfb5760405162461bcd60e51b81526004016106fb906125e3565b610d056000611884565b565b600a546001600160a01b03163314610d315760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b03166000908152601160205260409020805460ff19169055565b6060600180546106039061275f565b600a546001600160a01b03163314610d8b5760405162461bcd60e51b81526004016106fb906125e3565b611388610d9b826108df60085490565b1115610db95760405162461bcd60e51b81526004016106fb906125ae565b60005b8181101561095757610dd1335b600854610935565b80610ddb8161279a565b915050610dbc565b6109573383836118d6565b610df83383611596565b610e145760405162461bcd60e51b81526004016106fb90612618565b610e20848484846119a5565b50505050565b6002600b541415610e795760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106fb565b6002600b5560105460ff16610ea05760405162461bcd60e51b81526004016106fb90612669565b6000600e5411610ec25760405162461bcd60e51b81526004016106fb90612669565b6000600f5411610ee45760405162461bcd60e51b81526004016106fb90612669565b610eed336119d8565b610f395760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e79204d6f6f6e204170657300000060448201526064016106fb565b60008111610f7f5760405162461bcd60e51b815260206004820152601360248201527226b4b71036b4b73a1034b99018903a37b5b2b760691b60448201526064016106fb565b6032811115610fe35760405162461bcd60e51b815260206004820152602a60248201527f596f752063616e206d696e74206d617820353020746f6b656e732070657220746044820152693930b739b0b1ba34b7b760b11b60648201526084016106fb565b611388610ff3826108df60085490565b11156110115760405162461bcd60e51b81526004016106fb906125ae565b600061101d3383611228565b6013549091506001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b50505050816016600061109e3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110cd91906126d1565b90915550600090505b828110156110f9576110e733610dc9565b806110f18161279a565b9150506110d6565b50604051829033907f5dfcc088c5d00a81315e7a64e15444bf105108d4bb5905c26759dbad1bfb343290600090a350506001600b55565b6012818154811061114057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600260205260409020546060906001600160a01b03166111d95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fb565b600c6111e483611b03565b6040516020016111f5929190612465565b60408051601f19818403018152908290526112129160200161243c565b6040516020818303038152906040529050919050565b6001600160a01b038216600090815260166020526040812054600d5461124e8285611857565b1161126957600e54611261908490611c01565b9150506105ee565b6000805b848110156112ec57611280836001611857565b9250600d5483116112a057600e54611299908390611857565b91506112da565b6112cd6112c4600f546112be600d5487611c0d90919063ffffffff16565b90611c01565b600e5490611857565b6112d790836126d1565b91505b806112e48161279a565b91505061126d565b50949350505050565b600a546001600160a01b0316331461131f5760405162461bcd60e51b81526004016106fb906125e3565b60105460ff16156113725760405162461bcd60e51b815260206004820152601e60248201527f50617573652073616c65206265666f726520707269636520757064617465000060448201526064016106fb565b600f55565b600a546001600160a01b031633146113a15760405162461bcd60e51b81526004016106fb906125e3565b6001600160a01b0381166114065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fb565b61140f81611884565b50565b600a546001600160a01b0316331461143c5760405162461bcd60e51b81526004016106fb906125e3565b601080549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146114805760405162461bcd60e51b81526004016106fb906125e3565b60105460ff16156114d35760405162461bcd60e51b815260206004820152601e60248201527f50617573652073616c65206265666f726520707269636520757064617465000060448201526064016106fb565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061150957506001600160e01b03198216635b5e139f60e01b145b806105ee57506301ffc9a760e01b6001600160e01b03198316146105ee565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061155d82610b43565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661160f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fb565b600061161a83610b43565b9050806001600160a01b0316846001600160a01b031614806116555750836001600160a01b031661164a84610686565b6001600160a01b0316145b8061168557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806116a857506001600160a01b03841660009081526011602052604090205460ff165b949350505050565b826001600160a01b03166116c382610b43565b6001600160a01b0316146117275760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016106fb565b6001600160a01b0382166117895760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106fb565b611794838383611c19565b61179f600082611528565b6001600160a01b03831660009081526003602052604081208054600192906117c890849061271c565b90915550506001600160a01b03821660009081526003602052604081208054600192906117f69084906126d1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061186382846126d1565b9392505050565b610957828260405180602001604052806000815250611cd1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156119385760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106fb565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119b08484846116b0565b6119bc84848484611d04565b610e205760405162461bcd60e51b81526004016106fb9061255c565b601054600090610100900460ff166119f257506001919050565b6014546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611a3857600080fd5b505afa158015611a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7091906123db565b1115611a7e57506001919050565b6015546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc91906123db565b1192915050565b606081611b275750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b515780611b3b8161279a565b9150611b4a9050600a836126e9565b9150611b2b565b60008167ffffffffffffffff811115611b6c57611b6c612821565b6040519080825280601f01601f191660200182016040528015611b96576020820181803683370190505b5090505b84156116a857611bab60018361271c565b9150611bb8600a866127b5565b611bc39060306126d1565b60f81b818381518110611bd857611bd861280b565b60200101906001600160f81b031916908160001a905350611bfa600a866126e9565b9450611b9a565b600061186382846126fd565b6000611863828461271c565b6001600160a01b038316611c7457611c6f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c97565b816001600160a01b0316836001600160a01b031614611c9757611c978382611e11565b6001600160a01b038216611cae5761083181611eae565b826001600160a01b0316826001600160a01b031614610831576108318282611f5d565b611cdb8383611fa1565b611ce86000848484611d04565b6108315760405162461bcd60e51b81526004016106fb9061255c565b60006001600160a01b0384163b15611e0657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d4890339089908890889060040161250c565b602060405180830381600087803b158015611d6257600080fd5b505af1925050508015611d92575060408051601f3d908101601f19168201909252611d8f918101906123a5565b60015b611dec573d808015611dc0576040519150601f19603f3d011682016040523d82523d6000602084013e611dc5565b606091505b508051611de45760405162461bcd60e51b81526004016106fb9061255c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116a8565b506001949350505050565b60006001611e1e84610c4a565b611e28919061271c565b600083815260076020526040902054909150808214611e7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ec09060019061271c565b60008381526009602052604081205460088054939450909284908110611ee857611ee861280b565b906000526020600020015490508060088381548110611f0957611f0961280b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f4157611f416127f5565b6001900381819060005260206000200160009055905550505050565b6000611f6883610c4a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611ff75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106fb565b6000818152600260205260409020546001600160a01b03161561205c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106fb565b61206860008383611c19565b6001600160a01b03821660009081526003602052604081208054600192906120919084906126d1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461210657600080fd5b919050565b8035801515811461210657600080fd5b60006020828403121561212d57600080fd5b611863826120ef565b6000806040838503121561214957600080fd5b612152836120ef565b9150612160602084016120ef565b90509250929050565b60008060006060848603121561217e57600080fd5b612187846120ef565b9250612195602085016120ef565b9150604084013590509250925092565b600080600080608085870312156121bb57600080fd5b6121c4856120ef565b935060206121d38187016120ef565b935060408601359250606086013567ffffffffffffffff808211156121f757600080fd5b818801915088601f83011261220b57600080fd5b81358181111561221d5761221d612821565b61222f601f8201601f191685016126a0565b9150808252898482850101111561224557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561227857600080fd5b612281836120ef565b91506121606020840161210b565b600080604083850312156122a257600080fd5b6122ab836120ef565b946020939093013593505050565b600060208083850312156122cc57600080fd5b823567ffffffffffffffff808211156122e457600080fd5b818501915085601f8301126122f857600080fd5b81358181111561230a5761230a612821565b8060051b915061231b8483016126a0565b8181528481019084860184860187018a101561233657600080fd5b600095505b838610156123605761234c816120ef565b83526001959095019491860191860161233b565b5098975050505050505050565b60006020828403121561237f57600080fd5b6118638261210b565b60006020828403121561239a57600080fd5b813561186381612837565b6000602082840312156123b757600080fd5b815161186381612837565b6000602082840312156123d457600080fd5b5035919050565b6000602082840312156123ed57600080fd5b5051919050565b6000815180845261240c816020860160208601612733565b601f01601f19169290920160200192915050565b60008151612432818560208601612733565b9290920192915050565b6000825161244e818460208701612733565b64173539b7b760d91b920191825250600501919050565b600080845481600182811c91508083168061248157607f831692505b60208084108214156124a157634e487b7160e01b86526022600452602486fd5b8180156124b557600181146124c6576124f3565b60ff198616895284890196506124f3565b60008b81526020902060005b868110156124eb5781548b8201529085019083016124d2565b505084890196505b5050505050506125038185612420565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061253f908301846123f4565b9695505050505050565b60208152600061186360208301846123f4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4d696e74696e67206d6f726520746f6b656e73207468616e20616c6c6f776564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c9612821565b604052919050565b600082198211156126e4576126e46127c9565b500190565b6000826126f8576126f86127df565b500490565b6000816000190483118215151615612717576127176127c9565b500290565b60008282101561272e5761272e6127c9565b500390565b60005b8381101561274e578181015183820152602001612736565b83811115610e205750506000910152565b600181811c9082168061277357607f821691505b6020821081141561279457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127ae576127ae6127c9565b5060010190565b6000826127c4576127c46127df565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140f57600080fdfea2646970667358221220954bf0006439ebc929c2a2571883588d0e8b19ab0d05b0a64a89e9af65f7a9f964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93
-----Decoded View---------------
Arg [0] : _apes (address): 0x34c4EBA1966B502dfCF0868b6f271d85CC8A2312
Arg [1] : _staking (address): 0x00a103267A22971375C3C37d6E1f1BDfb548e946
Arg [2] : _mal (address): 0x65fd5d7eA09459c932Aa70eba22548cd16283c93
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a2312
Arg [1] : 00000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946
Arg [2] : 00000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93
Deployed Bytecode Sourcemap
54118:5621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35749:224;;;;;;:::i;:::-;;:::i;:::-;;;7904:14:1;;7897:22;7879:41;;7867:2;7852:18;35749:224:0;;;;;;;;21720:100;;;:::i;:::-;;;;;;;:::i;23279:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6923:32:1;;;6905:51;;6893:2;6878:18;23279:221:0;6759:203:1;22802:411:0;;;;;;:::i;:::-;;:::i;:::-;;58716:94;;;;;;:::i;:::-;;:::i;36389:113::-;36477:10;:17;36389:113;;;18727:25:1;;;18715:2;18700:18;36389:113:0;18581:177:1;24029:339:0;;;;;;:::i;:::-;;:::i;56383:290::-;;;;;;:::i;:::-;;:::i;36057:256::-;;;;;;:::i;:::-;;:::i;58991:108::-;;;;;;:::i;:::-;;:::i;54304:41::-;;54341:4;54304:41;;59598:138;;;:::i;24439:185::-;;;;;;:::i;:::-;;:::i;54390:25::-;;;;;;57620:117;;;;;;:::i;:::-;-1:-1:-1;;;;;57707:22:0;57683:7;57707:22;;;:16;:22;;;;;;;57620:117;36579:233;;;;;;:::i;:::-;;:::i;21414:239::-;;;;;;:::i;:::-;;:::i;55421:153::-;;;;;;:::i;:::-;;:::i;21144:208::-;;;;;;:::i;:::-;;:::i;43522:103::-;;;:::i;54422:30::-;;;;;;54626:15;;;;;-1:-1:-1;;;;;54626:15:0;;;55582:118;;;;;;:::i;:::-;;:::i;54352:31::-;;;;;;42871:87;42944:6;;-1:-1:-1;;;;;42944:6:0;42871:87;;54678:19;;;;;-1:-1:-1;;;;;54678:19:0;;;21889:104;;;:::i;54648:23::-;;;;;-1:-1:-1;;;;;54648:23:0;;;56091:284;;;;;;:::i;:::-;;:::i;23572:155::-;;;;;;:::i;:::-;;:::i;24695:328::-;;;;;;:::i;:::-;;:::i;56681:931::-;;;;;;:::i;:::-;;:::i;54587:30::-;;;;;;:::i;:::-;;:::i;59300:290::-;;;;;;:::i;:::-;;:::i;54706:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;57745:582;;;;;;:::i;:::-;;:::i;23798:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23919:25:0;;;23895:4;23919:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23798:164;54461:24;;;;;;;;;59107:185;;;;;;:::i;:::-;;:::i;43780:201::-;;;;;;:::i;:::-;;:::i;54492:32::-;;;;;;;;;;;;58565:143;;;;;;:::i;:::-;;:::i;58818:165::-;;;;;;:::i;:::-;;:::i;35749:224::-;35851:4;-1:-1:-1;;;;;;35875:50:0;;-1:-1:-1;;;35875:50:0;;:90;;;35929:36;35953:11;35929:23;:36::i;:::-;35868:97;35749:224;-1:-1:-1;;35749:224:0:o;21720:100::-;21774:13;21807:5;21800:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21720:100;:::o;23279:221::-;23355:7;26622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26622:16:0;23375:73;;;;-1:-1:-1;;;23375:73:0;;15284:2:1;23375:73:0;;;15266:21:1;15323:2;15303:18;;;15296:30;15362:34;15342:18;;;15335:62;-1:-1:-1;;;15413:18:1;;;15406:42;15465:19;;23375:73:0;;;;;;;;;-1:-1:-1;23468:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23468:24:0;;23279:221::o;22802:411::-;22883:13;22899:23;22914:7;22899:14;:23::i;:::-;22883:39;;22947:5;-1:-1:-1;;;;;22941:11:0;:2;-1:-1:-1;;;;;22941:11:0;;;22933:57;;;;-1:-1:-1;;;22933:57:0;;16474:2:1;22933:57:0;;;16456:21:1;16513:2;16493:18;;;16486:30;16552:34;16532:18;;;16525:62;-1:-1:-1;;;16603:18:1;;;16596:31;16644:19;;22933:57:0;16272:397:1;22933:57:0;16371:10;-1:-1:-1;;;;;23025:21:0;;;;:62;;-1:-1:-1;23050:37:0;23067:5;16371:10;23798:164;:::i;23050:37::-;23003:168;;;;-1:-1:-1;;;23003:168:0;;12968:2:1;23003:168:0;;;12950:21:1;13007:2;12987:18;;;12980:30;13046:34;13026:18;;;13019:62;13117:26;13097:18;;;13090:54;13161:19;;23003:168:0;12766:420:1;23003:168:0;23184:21;23193:2;23197:7;23184:8;:21::i;:::-;22872:341;22802:411;;:::o;58716:94::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;58781:12:::1;:21:::0;;-1:-1:-1;;58781:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58716:94::o;24029:339::-;24224:41;16371:10;24257:7;24224:18;:41::i;:::-;24216:103;;;;-1:-1:-1;;;24216:103:0;;;;;;;:::i;:::-;24332:28;24342:4;24348:2;24352:7;24332:9;:28::i;56383:290::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;54341:4:::1;56462:35;56480:9;:16;56462:13;36477:10:::0;:17;;36389:113;56462:13:::1;:17:::0;::::1;:35::i;:::-;:49;;56454:94;;;;-1:-1:-1::0;;;56454:94:0::1;;;;;;;:::i;:::-;56561:9;56557:109;56580:9;:16;56576:1;:20;56557:109;;;56614:42;56624:9;56634:1;56624:12;;;;;;;;:::i;:::-;;;;;;;56638:13;36477:10:::0;:17;;36389:113;56638:13:::1;:17;::::0;56654:1:::1;56638:17;:::i;:::-;56614:9;:42::i;:::-;56598:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56557:109;;;;56383:290:::0;:::o;36057:256::-;36154:7;36190:23;36207:5;36190:16;:23::i;:::-;36182:5;:31;36174:87;;;;-1:-1:-1;;;36174:87:0;;9795:2:1;36174:87:0;;;9777:21:1;9834:2;9814:18;;;9807:30;9873:34;9853:18;;;9846:62;-1:-1:-1;;;9924:18:1;;;9917:41;9975:19;;36174:87:0;9593:407:1;36174:87:0;-1:-1:-1;;;;;;36279:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36057:256::o;58991:108::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;59065:16:::1;:26:::0;58991:108::o;59598:138::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;59664:21:::1;59702:7;42944:6:::0;;-1:-1:-1;;;;;42944:6:0;;42871:87;59702:7:::1;-1:-1:-1::0;;;;;59694:25:0::1;:34;59720:7;59694:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;24439:185:::0;24577:39;24594:4;24600:2;24604:7;24577:39;;;;;;;;;;;;:16;:39::i;36579:233::-;36654:7;36690:30;36477:10;:17;;36389:113;36690:30;36682:5;:38;36674:95;;;;-1:-1:-1;;;36674:95:0;;17294:2:1;36674:95:0;;;17276:21:1;17333:2;17313:18;;;17306:30;17372:34;17352:18;;;17345:62;-1:-1:-1;;;17423:18:1;;;17416:42;17475:19;;36674:95:0;17092:408:1;36674:95:0;36787:10;36798:5;36787:17;;;;;;;;:::i;:::-;;;;;;;;;36780:24;;36579:233;;;:::o;21414:239::-;21486:7;21522:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21522:16:0;21557:19;21549:73;;;;-1:-1:-1;;;21549:73:0;;13804:2:1;21549:73:0;;;13786:21:1;13843:2;13823:18;;;13816:30;13882:34;13862:18;;;13855:62;-1:-1:-1;;;13933:18:1;;;13926:39;13982:19;;21549:73:0;13602:405:1;55421:153:0;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55489:28:0::1;;::::0;;;:13:::1;:28;::::0;;;;:35;;-1:-1:-1;;55489:35:0::1;55520:4;55489:35:::0;;::::1;::::0;;;55533:13:::1;:33:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;55533:33:0::1;::::0;;::::1;::::0;;55421:153::o;21144:208::-;21216:7;-1:-1:-1;;;;;21244:19:0;;21236:74;;;;-1:-1:-1;;;21236:74:0;;13393:2:1;21236:74:0;;;13375:21:1;13432:2;13412:18;;;13405:30;13471:34;13451:18;;;13444:62;-1:-1:-1;;;13522:18:1;;;13515:40;13572:19;;21236:74:0;13191:406:1;21236:74:0;-1:-1:-1;;;;;;21328:16:0;;;;;:9;:16;;;;;;;21144:208::o;43522:103::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;43587:30:::1;43614:1;43587:18;:30::i;:::-;43522:103::o:0;55582:118::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55654:30:0::1;55687:5;55654:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;55654:38:0::1;::::0;;55582:118::o;21889:104::-;21945:13;21978:7;21971:14;;;;;:::i;56091:284::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;54341:4:::1;56174:30;56192:11;56174:13;36477:10:::0;:17;;36389:113;56174:30:::1;:44;;56166:89;;;;-1:-1:-1::0;;;56166:89:0::1;;;;;;;:::i;:::-;56268:9;56264:104;56287:11;56283:1;:15;56264:104;;;56316:42;16371:10:::0;56326:12:::1;36477:10:::0;:17;56340:13:::1;36389:113:::0;56316:42:::1;56300:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56264:104;;23572:155:::0;23667:52;16371:10;23700:8;23710;23667:18;:52::i;24695:328::-;24870:41;16371:10;24903:7;24870:18;:41::i;:::-;24862:103;;;;-1:-1:-1;;;24862:103:0;;;;;;;:::i;:::-;24976:39;24990:4;24996:2;25000:7;25009:5;24976:13;:39::i;:::-;24695:328;;;;:::o;56681:931::-;52989:1;53587:7;;:19;;53579:63;;;;-1:-1:-1;;;53579:63:0;;18066:2:1;53579:63:0;;;18048:21:1;18105:2;18085:18;;;18078:30;18144:33;18124:18;;;18117:61;18195:18;;53579:63:0;17864:355:1;53579:63:0;52989:1;53720:7;:18;56761:12:::1;::::0;::::1;;56753:53;;;;-1:-1:-1::0;;;56753:53:0::1;;;;;;;:::i;:::-;56836:1;56823:10;;:14;56815:55;;;;-1:-1:-1::0;;;56815:55:0::1;;;;;;;:::i;:::-;56905:1;56887:15;;:19;56879:60;;;;-1:-1:-1::0;;;56879:60:0::1;;;;;;;:::i;:::-;56958:35;16371:10:::0;56958:21:::1;:35::i;:::-;56950:77;;;::::0;-1:-1:-1;;;56950:77:0;;9026:2:1;56950:77:0::1;::::0;::::1;9008:21:1::0;9065:2;9045:18;;;9038:30;9104:31;9084:18;;;9077:59;9153:18;;56950:77:0::1;8824:353:1::0;56950:77:0::1;57058:1;57044:11;:15;57036:47;;;::::0;-1:-1:-1;;;57036:47:0;;14936:2:1;57036:47:0::1;::::0;::::1;14918:21:1::0;14975:2;14955:18;;;14948:30;-1:-1:-1;;;14994:18:1;;;14987:49;15053:18;;57036:47:0::1;14734:343:1::0;57036:47:0::1;57115:2;57100:11;:17;;57092:72;;;::::0;-1:-1:-1;;;57092:72:0;;9384:2:1;57092:72:0::1;::::0;::::1;9366:21:1::0;9423:2;9403:18;;;9396:30;9462:34;9442:18;;;9435:62;-1:-1:-1;;;9513:18:1;;;9506:40;9563:19;;57092:72:0::1;9182:406:1::0;57092:72:0::1;54341:4;57181:30;57199:11;57181:13;36477:10:::0;:17;;36389:113;57181:30:::1;:44;;57173:89;;;;-1:-1:-1::0;;;57173:89:0::1;;;;;;;:::i;:::-;57273:18;57294:41;16371:10:::0;57323:11:::1;57294:14;:41::i;:::-;57344:3;::::0;57273:62;;-1:-1:-1;;;;;;57344:3:0::1;:12;16371:10:::0;57344:38:::1;::::0;-1:-1:-1;;;;;;57344:38:0::1;::::0;;;;;;-1:-1:-1;;;;;7652:32:1;;;57344:38:0::1;::::0;::::1;7634:51:1::0;7701:18;;;7694:34;;;7607:18;;57344:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57425:11;57391:16;:30;57408:12;16371:10:::0;;16291:98;57408:12:::1;-1:-1:-1::0;;;;;57391:30:0::1;-1:-1:-1::0;;;;;57391:30:0::1;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;57451:9:0::1;::::0;-1:-1:-1;57447:104:0::1;57470:11;57466:1;:15;57447:104;;;57499:42;16371:10:::0;57509:12:::1;16291:98:::0;57499:42:::1;57483:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57447:104;;;-1:-1:-1::0;57566:38:0::1;::::0;57592:11;;16371:10;;57566:38:::1;::::0;;;::::1;-1:-1:-1::0;;52945:1:0;53899:7;:22;56681:931::o;54587:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54587:30:0;;-1:-1:-1;54587:30:0;:::o;59300:290::-;26598:4;26622:16;;;:7;:16;;;;;;59373:13;;-1:-1:-1;;;;;26622:16:0;59397:76;;;;-1:-1:-1;;;59397:76:0;;16058:2:1;59397:76:0;;;16040:21:1;16097:2;16077:18;;;16070:30;16136:34;16116:18;;;16109:62;-1:-1:-1;;;16187:18:1;;;16180:45;16242:19;;59397:76:0;15856:411:1;59397:76:0;59537:12;59551:18;:7;:16;:18::i;:::-;59520:50;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59520:50:0;;;;;;;;;;59496:85;;59520:50;59496:85;;:::i;:::-;;;;;;;;;;;;;59482:100;;59300:290;;;:::o;57745:582::-;-1:-1:-1;;;;;57855:22:0;;57820:7;57855:22;;;:16;:22;;;;;;57914:16;;57892:18;57855:22;57903:6;57892:10;:18::i;:::-;:38;57888:73;;57950:10;;57939:22;;:6;;:10;:22::i;:::-;57932:29;;;;;57888:73;57972:18;58004:9;57999:295;58019:6;58015:1;:10;57999:295;;;58052:13;:6;58063:1;58052:10;:13::i;:::-;58043:22;;58090:16;;58080:6;:26;58076:117;;58149:10;;58134:26;;:10;;:14;:26::i;:::-;58121:39;;58173:8;;58076:117;58217:67;58233:49;58266:15;;58233:28;58244:16;;58233:6;:10;;:28;;;;:::i;:::-;:32;;:49::i;:::-;58217:10;;;:14;:67::i;:::-;58203:81;;;;:::i;:::-;;;57999:295;58027:3;;;;:::i;:::-;;;;57999:295;;;-1:-1:-1;58309:10:0;57745:582;-1:-1:-1;;;;57745:582:0:o;59107:185::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;59196:12:::1;::::0;::::1;;59195:13;59187:56;;;::::0;-1:-1:-1;;;59187:56:0;;17707:2:1;59187:56:0::1;::::0;::::1;17689:21:1::0;17746:2;17726:18;;;17719:30;17785:32;17765:18;;;17758:60;17835:18;;59187:56:0::1;17505:354:1::0;59187:56:0::1;59252:15;:32:::0;59107:185::o;43780:201::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43869:22:0;::::1;43861:73;;;::::0;-1:-1:-1;;;43861:73:0;;10626:2:1;43861:73:0::1;::::0;::::1;10608:21:1::0;10665:2;10645:18;;;10638:30;10704:34;10684:18;;;10677:62;-1:-1:-1;;;10755:18:1;;;10748:36;10801:19;;43861:73:0::1;10424:402:1::0;43861:73:0::1;43945:28;43964:8;43945:18;:28::i;:::-;43780:201:::0;:::o;58565:143::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;58657:20:::1;:43:::0;;;::::1;;;;-1:-1:-1::0;;58657:43:0;;::::1;::::0;;;::::1;::::0;;58565:143::o;58818:165::-;42944:6;;-1:-1:-1;;;;;42944:6:0;16371:10;43091:23;43083:68;;;;-1:-1:-1;;;43083:68:0;;;;;;;:::i;:::-;58897:12:::1;::::0;::::1;;58896:13;58888:56;;;::::0;-1:-1:-1;;;58888:56:0;;17707:2:1;58888:56:0::1;::::0;::::1;17689:21:1::0;17746:2;17726:18;;;17719:30;17785:32;17765:18;;;17758:60;17835:18;;58888:56:0::1;17505:354:1::0;58888:56:0::1;58953:10;:22:::0;58818:165::o;20775:305::-;20877:4;-1:-1:-1;;;;;;20914:40:0;;-1:-1:-1;;;20914:40:0;;:105;;-1:-1:-1;;;;;;;20971:48:0;;-1:-1:-1;;;20971:48:0;20914:105;:158;;;-1:-1:-1;;;;;;;;;;19418:40:0;;;21036:36;19309:157;30679:174;30754:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30754:29:0;-1:-1:-1;;;;;30754:29:0;;;;;;;;:24;;30808:23;30754:24;30808:14;:23::i;:::-;-1:-1:-1;;;;;30799:46:0;;;;;;;;;;;30679:174;;:::o;55708:375::-;55802:4;26622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26622:16:0;55819:73;;;;-1:-1:-1;;;55819:73:0;;12555:2:1;55819:73:0;;;12537:21:1;12594:2;12574:18;;;12567:30;12633:34;12613:18;;;12606:62;-1:-1:-1;;;12684:18:1;;;12677:42;12736:19;;55819:73:0;12353:408:1;55819:73:0;55903:13;55919:23;55934:7;55919:14;:23::i;:::-;55903:39;;55972:5;-1:-1:-1;;;;;55961:16:0;:7;-1:-1:-1;;;;;55961:16:0;;:51;;;;56005:7;-1:-1:-1;;;;;55981:31:0;:20;55993:7;55981:11;:20::i;:::-;-1:-1:-1;;;;;55981:31:0;;55961:51;:87;;;-1:-1:-1;;;;;;23919:25:0;;;23895:4;23919:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;56016:32;55961:113;;;-1:-1:-1;;;;;;56052:22:0;;;;;;:13;:22;;;;;;;;55961:113;55953:122;55708:375;-1:-1:-1;;;;55708:375:0:o;29936:625::-;30095:4;-1:-1:-1;;;;;30068:31:0;:23;30083:7;30068:14;:23::i;:::-;-1:-1:-1;;;;;30068:31:0;;30060:81;;;;-1:-1:-1;;;30060:81:0;;11033:2:1;30060:81:0;;;11015:21:1;11072:2;11052:18;;;11045:30;11111:34;11091:18;;;11084:62;-1:-1:-1;;;11162:18:1;;;11155:35;11207:19;;30060:81:0;10831:401:1;30060:81:0;-1:-1:-1;;;;;30160:16:0;;30152:65;;;;-1:-1:-1;;;30152:65:0;;11796:2:1;30152:65:0;;;11778:21:1;11835:2;11815:18;;;11808:30;11874:34;11854:18;;;11847:62;-1:-1:-1;;;11925:18:1;;;11918:34;11969:19;;30152:65:0;11594:400:1;30152:65:0;30230:39;30251:4;30257:2;30261:7;30230:20;:39::i;:::-;30334:29;30351:1;30355:7;30334:8;:29::i;:::-;-1:-1:-1;;;;;30376:15:0;;;;;;:9;:15;;;;;:20;;30395:1;;30376:15;:20;;30395:1;;30376:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30407:13:0;;;;;;:9;:13;;;;;:18;;30424:1;;30407:13;:18;;30424:1;;30407:18;:::i;:::-;;;;-1:-1:-1;;30436:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30436:21:0;-1:-1:-1;;;;;30436:21:0;;;;;;;;;30475:27;;30436:16;;30475:27;;;;;;;22872:341;22802:411;;:::o;47108:98::-;47166:7;47193:5;47197:1;47193;:5;:::i;:::-;47186:12;47108:98;-1:-1:-1;;;47108:98:0:o;27517:110::-;27593:26;27603:2;27607:7;27593:26;;;;;;;;;;;;:9;:26::i;44141:191::-;44234:6;;;-1:-1:-1;;;;;44251:17:0;;;-1:-1:-1;;;;;;44251:17:0;;;;;;;44284:40;;44234:6;;;44251:17;44234:6;;44284:40;;44215:16;;44284:40;44204:128;44141:191;:::o;30995:315::-;31150:8;-1:-1:-1;;;;;31141:17:0;:5;-1:-1:-1;;;;;31141:17:0;;;31133:55;;;;-1:-1:-1;;;31133:55:0;;12201:2:1;31133:55:0;;;12183:21:1;12240:2;12220:18;;;12213:30;12279:27;12259:18;;;12252:55;12324:18;;31133:55:0;11999:349:1;31133:55:0;-1:-1:-1;;;;;31199:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31199:46:0;;;;;;;;;;31261:41;;7879::1;;;31261::0;;7852:18:1;31261:41:0;;;;;;;30995:315;;;:::o;25905:::-;26062:28;26072:4;26078:2;26082:7;26062:9;:28::i;:::-;26109:48;26132:4;26138:2;26142:7;26151:5;26109:22;:48::i;:::-;26101:111;;;;-1:-1:-1;;;26101:111:0;;;;;;;:::i;58335:222::-;58423:20;;58403:4;;58423:20;;;;;58418:38;;-1:-1:-1;58452:4:0;;58335:222;-1:-1:-1;58335:222:0:o;58418:38::-;58469:7;;:23;;-1:-1:-1;;;58469:23:0;;-1:-1:-1;;;;;6923:32:1;;;58469:23:0;;;6905:51:1;58495:1:0;;58469:7;;:17;;6878:18:1;;58469:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;58465:44;;;-1:-1:-1;58505:4:0;;58335:222;-1:-1:-1;58335:222:0:o;58465:44::-;58525:4;;:20;;-1:-1:-1;;;58525:20:0;;-1:-1:-1;;;;;6923:32:1;;;58525:20:0;;;6905:51:1;58548:1:0;;58525:4;;:14;;6878:18:1;;58525:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;;58335:222;-1:-1:-1;;58335:222:0:o;16785:723::-;16841:13;17062:10;17058:53;;-1:-1:-1;;17089:10:0;;;;;;;;;;;;-1:-1:-1;;;17089:10:0;;;;;16785:723::o;17058:53::-;17136:5;17121:12;17177:78;17184:9;;17177:78;;17210:8;;;;:::i;:::-;;-1:-1:-1;17233:10:0;;-1:-1:-1;17241:2:0;17233:10;;:::i;:::-;;;17177:78;;;17265:19;17297:6;17287:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17287:17:0;;17265:39;;17315:154;17322:10;;17315:154;;17349:11;17359:1;17349:11;;:::i;:::-;;-1:-1:-1;17418:10:0;17426:2;17418:5;:10;:::i;:::-;17405:24;;:2;:24;:::i;:::-;17392:39;;17375:6;17382;17375:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17375:56:0;;;;;;;;-1:-1:-1;17446:11:0;17455:2;17446:11;;:::i;:::-;;;17315:154;;47846:98;47904:7;47931:5;47935:1;47931;:5;:::i;47489:98::-;47547:7;47574:5;47578:1;47574;:5;:::i;37425:589::-;-1:-1:-1;;;;;37631:18:0;;37627:187;;37666:40;37698:7;38841:10;:17;;38814:24;;;;:15;:24;;;;;:44;;;38869:24;;;;;;;;;;;;38737:164;37666:40;37627:187;;;37736:2;-1:-1:-1;;;;;37728:10:0;:4;-1:-1:-1;;;;;37728:10:0;;37724:90;;37755:47;37788:4;37794:7;37755:32;:47::i;:::-;-1:-1:-1;;;;;37828:16:0;;37824:183;;37861:45;37898:7;37861:36;:45::i;37824:183::-;37934:4;-1:-1:-1;;;;;37928:10:0;:2;-1:-1:-1;;;;;37928:10:0;;37924:83;;37955:40;37983:2;37987:7;37955:27;:40::i;27854:321::-;27984:18;27990:2;27994:7;27984:5;:18::i;:::-;28035:54;28066:1;28070:2;28074:7;28083:5;28035:22;:54::i;:::-;28013:154;;;;-1:-1:-1;;;28013:154:0;;;;;;;:::i;31875:799::-;32030:4;-1:-1:-1;;;;;32051:13:0;;8722:19;:23;32047:620;;32087:72;;-1:-1:-1;;;32087:72:0;;-1:-1:-1;;;;;32087:36:0;;;;;:72;;16371:10;;32138:4;;32144:7;;32153:5;;32087:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32087:72:0;;;;;;;;-1:-1:-1;;32087:72:0;;;;;;;;;;;;:::i;:::-;;;32083:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32329:13:0;;32325:272;;32372:60;;-1:-1:-1;;;32372:60:0;;;;;;;:::i;32325:272::-;32547:6;32541:13;32532:6;32528:2;32524:15;32517:38;32083:529;-1:-1:-1;;;;;;32210:51:0;-1:-1:-1;;;32210:51:0;;-1:-1:-1;32203:58:0;;32047:620;-1:-1:-1;32651:4:0;31875:799;;;;;;:::o;39528:988::-;39794:22;39844:1;39819:22;39836:4;39819:16;:22::i;:::-;:26;;;;:::i;:::-;39856:18;39877:26;;;:17;:26;;;;;;39794:51;;-1:-1:-1;40010:28:0;;;40006:328;;-1:-1:-1;;;;;40077:18:0;;40055:19;40077:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40128:30;;;;;;:44;;;40245:30;;:17;:30;;;;;:43;;;40006:328;-1:-1:-1;40430:26:0;;;;:17;:26;;;;;;;;40423:33;;;-1:-1:-1;;;;;40474:18:0;;;;;:12;:18;;;;;:34;;;;;;;40467:41;39528:988::o;40811:1079::-;41089:10;:17;41064:22;;41089:21;;41109:1;;41089:21;:::i;:::-;41121:18;41142:24;;;:15;:24;;;;;;41515:10;:26;;41064:46;;-1:-1:-1;41142:24:0;;41064:46;;41515:26;;;;;;:::i;:::-;;;;;;;;;41493:48;;41579:11;41554:10;41565;41554:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41659:28;;;:15;:28;;;;;;;:41;;;41831:24;;;;;41824:31;41866:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40882:1008;;;40811:1079;:::o;38315:221::-;38400:14;38417:20;38434:2;38417:16;:20::i;:::-;-1:-1:-1;;;;;38448:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38493:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38315:221:0:o;28511:439::-;-1:-1:-1;;;;;28591:16:0;;28583:61;;;;-1:-1:-1;;;28583:61:0;;14214:2:1;28583:61:0;;;14196:21:1;;;14233:18;;;14226:30;14292:34;14272:18;;;14265:62;14344:18;;28583:61:0;14012:356:1;28583:61:0;26598:4;26622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26622:16:0;:30;28655:58;;;;-1:-1:-1;;;28655:58:0;;11439:2:1;28655:58:0;;;11421:21:1;11478:2;11458:18;;;11451:30;11517;11497:18;;;11490:58;11565:18;;28655:58:0;11237:352:1;28655:58:0;28726:45;28755:1;28759:2;28763:7;28726:20;:45::i;:::-;-1:-1:-1;;;;;28784:13:0;;;;;;:9;:13;;;;;:18;;28801:1;;28784:13;:18;;28801:1;;28784:18;:::i;:::-;;;;-1:-1:-1;;28813:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28813:21:0;-1:-1:-1;;;;;28813:21:0;;;;;;;;28852:33;;28813:16;;;28852:33;;28813:16;;28852:33;56557:109:::1;56383:290:::0;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:980::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:2;1427:38;1461:2;1450:9;1446:18;1427:38;:::i;:::-;1417:48;;1512:2;1501:9;1497:18;1484:32;1474:42;;1567:2;1556:9;1552:18;1539:32;1590:18;1631:2;1623:6;1620:14;1617:34;;;1647:1;1644;1637:12;1617:34;1685:6;1674:9;1670:22;1660:32;;1730:7;1723:4;1719:2;1715:13;1711:27;1701:55;;1752:1;1749;1742:12;1701:55;1788:2;1775:16;1810:2;1806;1803:10;1800:36;;;1816:18;;:::i;:::-;1858:53;1901:2;1882:13;;-1:-1:-1;;1878:27:1;1874:36;;1858:53;:::i;:::-;1845:66;;1934:2;1927:5;1920:17;1974:7;1969:2;1964;1960;1956:11;1952:20;1949:33;1946:53;;;1995:1;1992;1985:12;1946:53;2050:2;2045;2041;2037:11;2032:2;2025:5;2021:14;2008:45;2094:1;2089:2;2084;2077:5;2073:14;2069:23;2062:34;;2115:5;2105:15;;;;;1146:980;;;;;;;:::o;2131:254::-;2196:6;2204;2257:2;2245:9;2236:7;2232:23;2228:32;2225:52;;;2273:1;2270;2263:12;2225:52;2296:29;2315:9;2296:29;:::i;:::-;2286:39;;2344:35;2375:2;2364:9;2360:18;2344:35;:::i;2390:254::-;2458:6;2466;2519:2;2507:9;2498:7;2494:23;2490:32;2487:52;;;2535:1;2532;2525:12;2487:52;2558:29;2577:9;2558:29;:::i;:::-;2548:39;2634:2;2619:18;;;;2606:32;;-1:-1:-1;;;2390:254:1:o;2649:963::-;2733:6;2764:2;2807;2795:9;2786:7;2782:23;2778:32;2775:52;;;2823:1;2820;2813:12;2775:52;2863:9;2850:23;2892:18;2933:2;2925:6;2922:14;2919:34;;;2949:1;2946;2939:12;2919:34;2987:6;2976:9;2972:22;2962:32;;3032:7;3025:4;3021:2;3017:13;3013:27;3003:55;;3054:1;3051;3044:12;3003:55;3090:2;3077:16;3112:2;3108;3105:10;3102:36;;;3118:18;;:::i;:::-;3164:2;3161:1;3157:10;3147:20;;3187:28;3211:2;3207;3203:11;3187:28;:::i;:::-;3249:15;;;3280:12;;;;3312:11;;;3342;;;3338:20;;3335:33;-1:-1:-1;3332:53:1;;;3381:1;3378;3371:12;3332:53;3403:1;3394:10;;3413:169;3427:2;3424:1;3421:9;3413:169;;;3484:23;3503:3;3484:23;:::i;:::-;3472:36;;3445:1;3438:9;;;;;3528:12;;;;3560;;3413:169;;;-1:-1:-1;3601:5:1;2649:963;-1:-1:-1;;;;;;;;2649:963:1:o;3617:180::-;3673:6;3726:2;3714:9;3705:7;3701:23;3697:32;3694:52;;;3742:1;3739;3732:12;3694:52;3765:26;3781:9;3765:26;:::i;3802:245::-;3860:6;3913:2;3901:9;3892:7;3888:23;3884:32;3881:52;;;3929:1;3926;3919:12;3881:52;3968:9;3955:23;3987:30;4011:5;3987:30;:::i;4052:249::-;4121:6;4174:2;4162:9;4153:7;4149:23;4145:32;4142:52;;;4190:1;4187;4180:12;4142:52;4222:9;4216:16;4241:30;4265:5;4241:30;:::i;4306:180::-;4365:6;4418:2;4406:9;4397:7;4393:23;4389:32;4386:52;;;4434:1;4431;4424:12;4386:52;-1:-1:-1;4457:23:1;;4306:180;-1:-1:-1;4306:180:1:o;4491:184::-;4561:6;4614:2;4602:9;4593:7;4589:23;4585:32;4582:52;;;4630:1;4627;4620:12;4582:52;-1:-1:-1;4653:16:1;;4491:184;-1:-1:-1;4491:184:1:o;4680:257::-;4721:3;4759:5;4753:12;4786:6;4781:3;4774:19;4802:63;4858:6;4851:4;4846:3;4842:14;4835:4;4828:5;4824:16;4802:63;:::i;:::-;4919:2;4898:15;-1:-1:-1;;4894:29:1;4885:39;;;;4926:4;4881:50;;4680:257;-1:-1:-1;;4680:257:1:o;4942:185::-;4984:3;5022:5;5016:12;5037:52;5082:6;5077:3;5070:4;5063:5;5059:16;5037:52;:::i;:::-;5105:16;;;;;4942:185;-1:-1:-1;;4942:185:1:o;5132:443::-;5364:3;5402:6;5396:13;5418:53;5464:6;5459:3;5452:4;5444:6;5440:17;5418:53;:::i;:::-;-1:-1:-1;;;5493:16:1;;5518:22;;;-1:-1:-1;5567:1:1;5556:13;;5132:443;-1:-1:-1;5132:443:1:o;5580:1174::-;5756:3;5785:1;5818:6;5812:13;5848:3;5870:1;5898:9;5894:2;5890:18;5880:28;;5958:2;5947:9;5943:18;5980;5970:61;;6024:4;6016:6;6012:17;6002:27;;5970:61;6050:2;6098;6090:6;6087:14;6067:18;6064:38;6061:165;;;-1:-1:-1;;;6125:33:1;;6181:4;6178:1;6171:15;6211:4;6132:3;6199:17;6061:165;6242:18;6269:104;;;;6387:1;6382:320;;;;6235:467;;6269:104;-1:-1:-1;;6302:24:1;;6290:37;;6347:16;;;;-1:-1:-1;6269:104:1;;6382:320;19116:1;19109:14;;;19153:4;19140:18;;6477:1;6491:165;6505:6;6502:1;6499:13;6491:165;;;6583:14;;6570:11;;;6563:35;6626:16;;;;6520:10;;6491:165;;;6495:3;;6685:6;6680:3;6676:16;6669:23;;6235:467;;;;;;;6718:30;6744:3;6736:6;6718:30;:::i;:::-;6711:37;5580:1174;-1:-1:-1;;;;;5580:1174:1:o;6967:488::-;-1:-1:-1;;;;;7236:15:1;;;7218:34;;7288:15;;7283:2;7268:18;;7261:43;7335:2;7320:18;;7313:34;;;7383:3;7378:2;7363:18;;7356:31;;;7161:4;;7404:45;;7429:19;;7421:6;7404:45;:::i;:::-;7396:53;6967:488;-1:-1:-1;;;;;;6967:488:1:o;8600:219::-;8749:2;8738:9;8731:21;8712:4;8769:44;8809:2;8798:9;8794:18;8786:6;8769:44;:::i;10005:414::-;10207:2;10189:21;;;10246:2;10226:18;;;10219:30;10285:34;10280:2;10265:18;;10258:62;-1:-1:-1;;;10351:2:1;10336:18;;10329:48;10409:3;10394:19;;10005:414::o;14373:356::-;14575:2;14557:21;;;14594:18;;;14587:30;14653:34;14648:2;14633:18;;14626:62;14720:2;14705:18;;14373:356::o;15495:::-;15697:2;15679:21;;;15716:18;;;15709:30;15775:34;15770:2;15755:18;;15748:62;15842:2;15827:18;;15495:356::o;16674:413::-;16876:2;16858:21;;;16915:2;16895:18;;;16888:30;16954:34;16949:2;16934:18;;16927:62;-1:-1:-1;;;17020:2:1;17005:18;;16998:47;17077:3;17062:19;;16674:413::o;18224:352::-;18426:2;18408:21;;;18465:2;18445:18;;;18438:30;18504;18499:2;18484:18;;18477:58;18567:2;18552:18;;18224:352::o;18763:275::-;18834:2;18828:9;18899:2;18880:13;;-1:-1:-1;;18876:27:1;18864:40;;18934:18;18919:34;;18955:22;;;18916:62;18913:88;;;18981:18;;:::i;:::-;19017:2;19010:22;18763:275;;-1:-1:-1;18763:275:1:o;19169:128::-;19209:3;19240:1;19236:6;19233:1;19230:13;19227:39;;;19246:18;;:::i;:::-;-1:-1:-1;19282:9:1;;19169:128::o;19302:120::-;19342:1;19368;19358:35;;19373:18;;:::i;:::-;-1:-1:-1;19407:9:1;;19302:120::o;19427:168::-;19467:7;19533:1;19529;19525:6;19521:14;19518:1;19515:21;19510:1;19503:9;19496:17;19492:45;19489:71;;;19540:18;;:::i;:::-;-1:-1:-1;19580:9:1;;19427:168::o;19600:125::-;19640:4;19668:1;19665;19662:8;19659:34;;;19673:18;;:::i;:::-;-1:-1:-1;19710:9:1;;19600:125::o;19730:258::-;19802:1;19812:113;19826:6;19823:1;19820:13;19812:113;;;19902:11;;;19896:18;19883:11;;;19876:39;19848:2;19841:10;19812:113;;;19943:6;19940:1;19937:13;19934:48;;;-1:-1:-1;;19978:1:1;19960:16;;19953:27;19730:258::o;19993:380::-;20072:1;20068:12;;;;20115;;;20136:61;;20190:4;20182:6;20178:17;20168:27;;20136:61;20243:2;20235:6;20232:14;20212:18;20209:38;20206:161;;;20289:10;20284:3;20280:20;20277:1;20270:31;20324:4;20321:1;20314:15;20352:4;20349:1;20342:15;20206:161;;19993:380;;;:::o;20378:135::-;20417:3;-1:-1:-1;;20438:17:1;;20435:43;;;20458:18;;:::i;:::-;-1:-1:-1;20505:1:1;20494:13;;20378:135::o;20518:112::-;20550:1;20576;20566:35;;20581:18;;:::i;:::-;-1:-1:-1;20615:9:1;;20518:112::o;20635:127::-;20696:10;20691:3;20687:20;20684:1;20677:31;20727:4;20724:1;20717:15;20751:4;20748:1;20741:15;20767:127;20828:10;20823:3;20819:20;20816:1;20809:31;20859:4;20856:1;20849:15;20883:4;20880:1;20873:15;20899:127;20960:10;20955:3;20951:20;20948:1;20941:31;20991:4;20988:1;20981:15;21015:4;21012:1;21005:15;21031:127;21092:10;21087:3;21083:20;21080:1;21073:31;21123:4;21120:1;21113:15;21147:4;21144:1;21137:15;21163:127;21224:10;21219:3;21215:20;21212:1;21205:31;21255:4;21252:1;21245:15;21279:4;21276:1;21269:15;21295:131;-1:-1:-1;;;;;;21369:32:1;;21359:43;;21349:71;;21416:1;21413;21406:12
Swarm Source
ipfs://954bf0006439ebc929c2a2571883588d0e8b19ab0d05b0a64a89e9af65f7a9f9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.