More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 4,688 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16820347 | 23 days ago | IN | 0 CRO | 0.240682 | ||||
Set Approval For... | 16466006 | 46 days ago | IN | 0 CRO | 0.23373925 | ||||
Safe Transfer Fr... | 16441515 | 48 days ago | IN | 0 CRO | 0.5000207 | ||||
Set Approval For... | 16402849 | 50 days ago | IN | 0 CRO | 0.2360535 | ||||
Safe Transfer Fr... | 16162706 | 66 days ago | IN | 0 CRO | 0.5000207 | ||||
Set Approval For... | 15950192 | 80 days ago | IN | 0 CRO | 0.23373925 | ||||
Safe Transfer Fr... | 15714979 | 95 days ago | IN | 0 CRO | 0.5000207 | ||||
Safe Transfer Fr... | 15627995 | 101 days ago | IN | 0 CRO | 0.49972811 | ||||
Safe Transfer Fr... | 15627874 | 101 days ago | IN | 0 CRO | 0.41354282 | ||||
Safe Transfer Fr... | 15625635 | 101 days ago | IN | 0 CRO | 0.49981159 | ||||
Safe Transfer Fr... | 15625477 | 101 days ago | IN | 0 CRO | 0.54680507 | ||||
Safe Transfer Fr... | 15625243 | 101 days ago | IN | 0 CRO | 0.46551208 | ||||
Safe Transfer Fr... | 15437057 | 113 days ago | IN | 0 CRO | 0.49966754 | ||||
Set Approval For... | 15411106 | 115 days ago | IN | 0 CRO | 0.23373925 | ||||
Safe Transfer Fr... | 15300410 | 122 days ago | IN | 0 CRO | 0.5000207 | ||||
Safe Transfer Fr... | 15243360 | 126 days ago | IN | 0 CRO | 0.49981159 | ||||
Set Approval For... | 14675865 | 163 days ago | IN | 0 CRO | 0.23366982 | ||||
Safe Transfer Fr... | 14658107 | 164 days ago | IN | 0 CRO | 0.48526834 | ||||
Set Approval For... | 14050173 | 204 days ago | IN | 0 CRO | 0.23366982 | ||||
Set Approval For... | 13892810 | 215 days ago | IN | 0 CRO | 0.14711759 | ||||
Set Approval For... | 13845793 | 218 days ago | IN | 0 CRO | 0.23366982 | ||||
Safe Transfer Fr... | 13840712 | 218 days ago | IN | 0 CRO | 0.5000207 | ||||
Transfer From | 13777140 | 222 days ago | IN | 0 CRO | 0.505 | ||||
Set Approval For... | 13721833 | 226 days ago | IN | 0 CRO | 0.14727989 | ||||
Set Approval For... | 13721830 | 226 days ago | IN | 0 CRO | 0.14727989 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1770935 | 1013 days ago | 37,737 CRO | ||||
1769935 | 1013 days ago | 110 CRO | ||||
1769933 | 1013 days ago | 132 CRO | ||||
1769932 | 1013 days ago | 110 CRO | ||||
1769932 | 1013 days ago | 110 CRO | ||||
1769932 | 1013 days ago | 110 CRO | ||||
1769928 | 1013 days ago | 220 CRO | ||||
1769927 | 1013 days ago | 110 CRO | ||||
1769926 | 1013 days ago | 110 CRO | ||||
1769925 | 1013 days ago | 110 CRO | ||||
1769924 | 1013 days ago | 110 CRO | ||||
1769924 | 1013 days ago | 220 CRO | ||||
1769923 | 1013 days ago | 550 CRO | ||||
1769923 | 1013 days ago | 110 CRO | ||||
1769923 | 1013 days ago | 110 CRO | ||||
1769922 | 1013 days ago | 110 CRO | ||||
1769922 | 1013 days ago | 550 CRO | ||||
1769919 | 1013 days ago | 132 CRO | ||||
1769918 | 1013 days ago | 110 CRO | ||||
1769918 | 1013 days ago | 110 CRO | ||||
1769915 | 1013 days ago | 110 CRO | ||||
1769915 | 1013 days ago | 110 CRO | ||||
1769915 | 1013 days ago | 110 CRO | ||||
1769915 | 1013 days ago | 110 CRO | ||||
1769913 | 1013 days ago | 110 CRO |
Loading...
Loading
Contract Name:
ALIENFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-03-08 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/SafeMathLite.sol pragma solidity ^0.8.4; library SafeMathLite{ /** * @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; } } // File contracts/SafePct.sol pragma solidity ^0.8.4; /** * @dev Compute percentages safely without phantom overflows. * * Intermediate operations can overflow even when the result will always * fit into computed type. Developers usually * assume that overflows raise errors. `SafePct` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafePct { using SafeMathLite for uint256; /** * Requirements: * * - intermediate operations must revert on overflow */ function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) { require(z > 0, "Division by zero"); if (x == 0) return 0; uint256 xy = x * y; if (xy / x == y) { // no overflow happened - same as in SafeMath mul return xy / z; } //slither-disable-next-line divide-before-multiply uint256 a = x / z; uint256 b = x % z; // x = a * z + b //slither-disable-next-line divide-before-multiply uint256 c = y / z; uint256 d = y % z; // y = c * z + d return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z)); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be 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 {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/escrow/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol) pragma solidity ^0.8.0; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its owner, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Ownable { using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public payable virtual onlyOwner { uint256 amount = msg.value; _deposits[payee] += amount; emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding all gas to the * recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public virtual onlyOwner { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol) pragma solidity ^0.8.0; /** * @dev Simple implementation of a * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment] * strategy, where the paying contract doesn't interact directly with the * receiver account, which must withdraw its payments itself. * * Pull-payments are often considered the best practice when it comes to sending * Ether, security-wise. It prevents recipients from blocking execution, and * eliminates reentrancy concerns. * * 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]. * * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} * instead of Solidity's `transfer` function. Payees can query their due * payments with {payments}, and retrieve them with {withdrawPayments}. */ abstract contract PullPayment { Escrow private immutable _escrow; constructor() { _escrow = new Escrow(); } /** * @dev Withdraw accumulated payments, forwarding all gas to the recipient. * * Note that _any_ account can call this function, not just the `payee`. * This means that contracts unaware of the `PullPayment` protocol can still * receive funds this way, by having a separate account call * {withdrawPayments}. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee Whose payments will be withdrawn. */ function withdrawPayments(address payable payee) public virtual { _escrow.withdraw(payee); } /** * @dev Returns the payments owed to an address. * @param dest The creditor's address. */ function payments(address dest) public view returns (uint256) { return _escrow.depositsOf(dest); } /** * @dev Called by the payer to store the sent amount as credit to be pulled. * Funds sent in this way are stored in an intermediate {Escrow} contract, so * there is no danger of them being spent before withdrawal. * * @param dest The destination address of the funds. * @param amount The amount to transfer. */ function _asyncTransfer(address dest, uint256 amount) internal virtual { _escrow.deposit{value: amount}(dest); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/BaseDrop.sol pragma solidity ^0.8.4; abstract contract BaseDrop is ERC721Enumerable, Ownable, PullPayment, Pausable, ReentrancyGuard { using Address for address payable; ERC1155 public memberships; address public artist; uint128 constant internal SCALE = 10000; uint128 internal fee = 2500; uint16[] internal order; function isMember(address _address) public view returns (bool) { return memberships.balanceOf(_address, 1) > 0 || memberships.balanceOf(_address, 2) > 0; } function withdrawPayments(address payable payee) public virtual override nonReentrant{ super.withdrawPayments(payee); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return super.supportsInterface(interfaceId); } function withdraw() public virtual onlyOwner{ payable(msg.sender).sendValue(address(this).balance); } function pause() public onlyOwner{ _pause(); } function unpause() public onlyOwner{ _unpause(); } } // File contracts/interfaces/IDrop.sol pragma solidity ^0.8.4; interface IDrop { struct Info { uint256 regularCost; uint256 memberCost; uint256 whitelistCost; uint256 maxSupply; uint256 totalSupply; uint256 maxMintPerAddress; uint256 maxMintPerTx; } function mintCost(address _minter) external view returns(uint256); function canMint(address _minter) external view returns (uint256); function mint(uint256 _amount) external payable; function maxSupply() external view returns (uint256); function getInfo() external view returns (Info memory); } // File contracts/drops/ALIENFT.sol pragma solidity ^0.8.4; contract ALIENFT is IDrop, BaseDrop { using Counters for Counters.Counter; using SafePct for uint256; using SafeMathLite for uint256; Counters.Counter public _tokenIdCounter; uint256 private whitelistCost = 125 ether; uint256 private memberCost = 125 ether; uint256 private regularCost = 150 ether; uint128 constant MAX_TOKENS = 2500; uint64 constant MAX_MINTAMOUNT = 5; uint64 private currentChunkIndex; string baseURI = "ipfs://QmZcWwt2fj3WkpbU7Jf5RtxZpg9M2pzheGC77aZgPmPoUS"; mapping(address => bool) whitelist; address lootContract = 0xEd34211cDD2cf76C3cceE162761A72d7b6601E2B; // mainnet // address lootContract = 0x2074D6a15c5F908707196C5ce982bd0598A666f9; // testnet constructor(address _memberships, address _artist) ERC721("ALIENFT", "ALIENFT") { memberships = ERC1155(_memberships); artist = _artist; fee = 1200; mintForArtist(); } function getLen() public view returns(uint) { return order.length; } function setSequnceChunk(uint8 _chunkIndex, uint16[] calldata _chunk) public onlyOwner { require(currentChunkIndex <= _chunkIndex, "chunkIndex exists"); if (_chunkIndex == 0) { order = _chunk; } else { uint len = _chunk.length; for(uint i = 0; i < len; i ++) { order.push(_chunk[i]); } } currentChunkIndex = _chunkIndex + 1; } function getInfo() external override view returns (Info memory) { Info memory allInfo; allInfo.regularCost = regularCost; allInfo.memberCost = memberCost; allInfo.whitelistCost = whitelistCost; allInfo.maxSupply = MAX_TOKENS; allInfo.totalSupply = super.totalSupply(); allInfo.maxMintPerTx = MAX_MINTAMOUNT; return allInfo; } function setLootContractAddress(address _lootContract) external onlyOwner { lootContract = _lootContract; } function hasMillionLoot(address _address) internal view returns (bool) { uint balance = IERC20(lootContract).balanceOf(_address); if (balance >= 5000000 ) { return true; } return false; } function addWhiteList(address[] calldata _addresses) public onlyOwner { uint len = _addresses.length; for(uint i = 0; i < len; i ++) { whitelist[_addresses[i]] = true; } } function addWhiteListAddress(address _address) public onlyOwner { whitelist[_address] = true; } function removeWhiteList(address _address) public onlyOwner { if (whitelist[_address]) { delete whitelist[_address]; } } function mintCost(address _minter) external override view returns(uint256) { if (isWhiteList(_minter) || hasMillionLoot(_minter)) { return whitelistCost; } else if (isMember(_minter)) { return memberCost; } else { return regularCost; } } function isWhiteList(address _address) public view returns (bool) { return whitelist[_address]; } function setRegularCost(uint256 _cost) external onlyOwner { regularCost = _cost; } function setMemberCost(uint256 _cost) external onlyOwner { memberCost = _cost; } function setWhitelistCost(uint256 _cost) external onlyOwner { whitelistCost = _cost; } function mintForArtist() private { for (uint i = 1; i <= 35; i ++) { _mint(artist, i); } } function setBaseURI(string memory _baseURI) external onlyOwner{ baseURI = _baseURI; } function mint(uint256 _amount) external override whenNotPaused payable { require(_amount <= MAX_MINTAMOUNT, "not mint more than max amount"); uint256 price; if (isWhiteList(msg.sender) || hasMillionLoot(msg.sender)) { price = whitelistCost.mul(_amount); } else { bool _isMember = isMember(msg.sender); if (_isMember){ price = memberCost.mul(_amount); } else { price = regularCost.mul(_amount); } } require(msg.value >= price, "not enough funds"); uint256 amountFee = price.mulDiv(fee, SCALE); for(uint256 i = 0; i < _amount; i++){ safeMint(msg.sender); } _asyncTransfer(artist, price - amountFee); } function tokenURI(uint _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = string(abi.encodePacked(baseURI, "/", Strings.toString(_tokenId), ".json")); return _tokenURI; } function safeMint(address _to) private { uint256 tokenId; tokenId = _tokenIdCounter.current(); require(tokenId < MAX_TOKENS - 35, "sold out!"); _tokenIdCounter.increment(); _safeMint(_to, order[tokenId]); } function maxSupply() external override pure returns (uint256) { return MAX_TOKENS; } function canMint(address) external override pure returns (uint256) { return MAX_MINTAMOUNT; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_memberships","type":"address"},{"internalType":"address","name":"_artist","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_tokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","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":"address","name":"","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"memberships","outputs":[{"internalType":"contract ERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lootContract","type":"address"}],"name":"setLootContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMemberCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setRegularCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_chunkIndex","type":"uint8"},{"internalType":"uint16[]","name":"_chunk","type":"uint16[]"}],"name":"setSequnceChunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600e80546001600160801b0319166109c41790556806c6b935b8bbd400006011819055601255680821ab0d4414980000601355610100604052603560a0818152906200411b60c03980516200005d916015916020909101906200071a565b50601780546001600160a01b03191673ed34211cdd2cf76c3ccee162761a72d7b6601e2b1790553480156200009157600080fd5b506040516200415038038062004150833981016040819052620000b491620007eb565b6040805180820182526007808252661053125153919560ca1b602080840182815285518087019096529285528401528151919291620000f6916000916200071a565b5080516200010c9060019060208401906200071a565b5050506200012962000123620001d060201b60201c565b620001d4565b6040516200013790620007a9565b604051809103906000f08015801562000154573d6000803e3d6000fd5b506001600160601b031960609190911b16608052600a805460ff60a01b191690556001600b55600c80546001600160a01b038481166001600160a01b031992831617909255600d805492841692909116919091179055600e80546001600160801b0319166104b0179055620001c862000226565b5050620008c8565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60015b602381116200025f57600d546200024a906001600160a01b03168262000262565b80620002568162000894565b91505062000229565b50565b6001600160a01b038216620002be5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b6000818152600260205260409020546001600160a01b031615620003255760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620002b5565b6200033360008383620003bc565b6001600160a01b03821660009081526003602052604081208054600192906200035e90849062000822565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b620003d4838383620003d960201b620018661760201c565b505050565b620003f1838383620003d460201b62000abd1760201c565b6001600160a01b0383166200044f576200044981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000475565b816001600160a01b0316836001600160a01b0316146200047557620004758382620004b5565b6001600160a01b0382166200048f57620003d48162000562565b826001600160a01b0316826001600160a01b031614620003d457620003d4828262000640565b60006001620004cf846200069160201b620011971760201c565b620004db91906200083d565b6000838152600760205260409020549091508082146200052f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062000576906001906200083d565b60008381526009602052604081205460088054939450909284908110620005ad57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110620005dd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806200062457634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000658836200069160201b620011971760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620006fe5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620002b5565b506001600160a01b031660009081526003602052604090205490565b828054620007289062000857565b90600052602060002090601f0160209004810192826200074c576000855562000797565b82601f106200076757805160ff191683800117855562000797565b8280016001018555821562000797579182015b82811115620007975782518255916020019190600101906200077a565b50620007a5929150620007b7565b5090565b6105ef8062003b2c83390190565b5b80821115620007a55760008155600101620007b8565b80516001600160a01b0381168114620007e657600080fd5b919050565b60008060408385031215620007fe578182fd5b6200080983620007ce565b91506200081960208401620007ce565b90509250929050565b60008219821115620008385762000838620008b2565b500190565b600082821015620008525762000852620008b2565b500390565b600181811c908216806200086c57607f821691505b602082108114156200088e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620008ab57620008ab620008b2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b60805160601c613237620008f56000396000818161175201528181611d0d01526121f701526132376000f3fe6080604052600436106102725760003560e01c80636352211e1161014f578063b88d4fde116100c1578063dc09e9231161007a578063dc09e9231461076d578063e1ec62941461078d578063e2982c21146107ad578063e985e9c5146107cd578063f2fde38b14610816578063f99031a71461083657600080fd5b8063b88d4fde146106b7578063b88fe6a3146106d7578063c2ba4744146106f7578063c87b56dd14610718578063d49479eb14610738578063d5abeb011461075857600080fd5b806384c4bd4b1161011357806384c4bd4b1461061a5780638da5cb5b1461063157806395d89b411461064f578063a0712d6814610664578063a22cb46514610677578063a230c5241461069757600080fd5b80636352211e1461059057806370a08231146105b0578063715018a6146105d05780638164c309146105e55780638456cb591461060557600080fd5b80633b3c523a116101e85780634a90be57116101ac5780634a90be57146104915780634f6ccce7146104a657806355f804b3146104c65780635a9b0b89146104e65780635c975abb146105515780635e1045ec1461057057600080fd5b80633b3c523a146104075780633ccfd60b146104275780633f4ba83a1461043c57806342842e0e1461045157806343bc16121461047157600080fd5b80632042e5c21161023a5780632042e5c21461034757806320c3cdd51461036757806323b872dd146103875780632acc659e146103a75780632f745c59146103c757806331b3eb94146103e757600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b31461030657806318160ddd14610328575b600080fd5b34801561028357600080fd5b50610297610292366004612ced565b61086f565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610880565b6040516102a39190612f64565b3480156102da57600080fd5b506102ee6102e9366004612d8d565b610912565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004612c82565b6109ac565b005b34801561033457600080fd5b506008545b6040519081526020016102a3565b34801561035357600080fd5b50610326610362366004612b40565b610ac2565b34801561037357600080fd5b50610326610382366004612b40565b610b31565b34801561039357600080fd5b506103266103a2366004612b94565b610b7d565b3480156103b357600080fd5b506103396103c2366004612b40565b610bae565b3480156103d357600080fd5b506103396103e2366004612c82565b610c04565b3480156103f357600080fd5b50610326610402366004612b40565b610c9a565b34801561041357600080fd5b50610326610422366004612dbd565b610d03565b34801561043357600080fd5b50610326610e59565b34801561044857600080fd5b50610326610e8f565b34801561045d57600080fd5b5061032661046c366004612b94565b610ec1565b34801561047d57600080fd5b50600d546102ee906001600160a01b031681565b34801561049d57600080fd5b50600f54610339565b3480156104b257600080fd5b506103396104c1366004612d8d565b610edc565b3480156104d257600080fd5b506103266104e1366004612d25565b610f7d565b3480156104f257600080fd5b506104fb610fbe565b6040516102a39190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b34801561055d57600080fd5b50600a54600160a01b900460ff16610297565b34801561057c57600080fd5b5061032661058b366004612cad565b61106f565b34801561059c57600080fd5b506102ee6105ab366004612d8d565b611120565b3480156105bc57600080fd5b506103396105cb366004612b40565b611197565b3480156105dc57600080fd5b5061032661121e565b3480156105f157600080fd5b50610326610600366004612b40565b611252565b34801561061157600080fd5b506103266112a0565b34801561062657600080fd5b506010546103399081565b34801561063d57600080fd5b50600a546001600160a01b03166102ee565b34801561065b57600080fd5b506102c16112d2565b610326610672366004612d8d565b6112e1565b34801561068357600080fd5b50610326610692366004612c51565b61149b565b3480156106a357600080fd5b506102976106b2366004612b40565b6114a6565b3480156106c357600080fd5b506103266106d2366004612bd4565b6115bd565b3480156106e357600080fd5b50600c546102ee906001600160a01b031681565b34801561070357600080fd5b50610339610712366004612b40565b50600590565b34801561072457600080fd5b506102c1610733366004612d8d565b6115ef565b34801561074457600080fd5b50610326610753366004612d8d565b6116a3565b34801561076457600080fd5b506109c4610339565b34801561077957600080fd5b50610326610788366004612d8d565b6116d2565b34801561079957600080fd5b506103266107a8366004612d8d565b611701565b3480156107b957600080fd5b506103396107c8366004612b40565b611730565b3480156107d957600080fd5b506102976107e8366004612b5c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082257600080fd5b50610326610831366004612b40565b6117ce565b34801561084257600080fd5b50610297610851366004612b40565b6001600160a01b031660009081526016602052604090205460ff1690565b600061087a8261191e565b92915050565b60606000805461088f9061312a565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb9061312a565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109b782611120565b9050806001600160a01b0316836001600160a01b03161415610a255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610987565b336001600160a01b0382161480610a415750610a4181336107e8565b610ab35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610987565b610abd8383611943565b505050565b600a546001600160a01b03163314610aec5760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03811660009081526016602052604090205460ff1615610b2e576001600160a01b0381166000908152601660205260409020805460ff191690555b50565b600a546001600160a01b03163314610b5b5760405162461bcd60e51b815260040161098790612fc9565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b610b8733826119b1565b610ba35760405162461bcd60e51b815260040161098790612ffe565b610abd838383611aa8565b6001600160a01b03811660009081526016602052604081205460ff1680610bd95750610bd982611c4f565b15610be657505060115490565b610bef826114a6565b15610bfc57505060125490565b505060135490565b6000610c0f83611197565b8210610c715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610987565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610ced5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610987565b6002600b55610cfb81611cee565b506001600b55565b600a546001600160a01b03163314610d2d5760405162461bcd60e51b815260040161098790612fc9565b60145460ff841667ffffffffffffffff9091161115610d825760405162461bcd60e51b81526020600482015260116024820152706368756e6b496e6465782065786973747360781b6044820152606401610987565b60ff8316610d9c57610d96600f838361294a565b50610e2e565b8060005b81811015610e2b57600f848483818110610dca57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ddf9190612d6b565b81546001810183556000928352602090922060108304018054600f9093166002026101000a61ffff81810219909416929093169290920217905580610e2381613165565b915050610da0565b50505b610e39836001613067565b6014805467ffffffffffffffff191660ff92909216919091179055505050565b600a546001600160a01b03163314610e835760405162461bcd60e51b815260040161098790612fc9565b610e8d3347611d6c565b565b600a546001600160a01b03163314610eb95760405162461bcd60e51b815260040161098790612fc9565b610e8d611e85565b610abd838383604051806020016040528060008152506115bd565b6000610ee760085490565b8210610f4a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610987565b60088281548110610f6b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610fa75760405162461bcd60e51b815260040161098790612fc9565b8051610fba9060159060208401906129f7565b5050565b610ffe6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61103e6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6013548152601254602082015260115460408201526109c460608201526008546080820152600560c0820152919050565b600a546001600160a01b031633146110995760405162461bcd60e51b815260040161098790612fc9565b8060005b8181101561111a576001601660008686858181106110cb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110e09190612b40565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061111281613165565b91505061109d565b50505050565b6000818152600260205260408120546001600160a01b03168061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610987565b60006001600160a01b0382166112025760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610987565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112485760405162461bcd60e51b815260040161098790612fc9565b610e8d6000611f22565b600a546001600160a01b0316331461127c5760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b600a546001600160a01b031633146112ca5760405162461bcd60e51b815260040161098790612fc9565b610e8d611f74565b60606001805461088f9061312a565b600a54600160a01b900460ff161561132e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610987565b600581111561137f5760405162461bcd60e51b815260206004820152601d60248201527f6e6f74206d696e74206d6f7265207468616e206d617820616d6f756e740000006044820152606401610987565b3360009081526016602052604081205460ff16806113a157506113a133611c4f565b156113ba576011546113b39083611ffc565b90506113f3565b60006113c5336114a6565b905080156113e1576012546113da9084611ffc565b91506113f1565b6013546113ee9084611ffc565b91505b505b803410156114365760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b6044820152606401610987565b600e546000906114539083906001600160801b031661271061200f565b905060005b8381101561147b5761146933612121565b8061147381613165565b915050611458565b50600d54610abd906001600160a01b031661149683856130e7565b6121d8565b610fba338383612259565b600c54604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612da5565b118061087a5750600c54604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b69190612da5565b1192915050565b6115c733836119b1565b6115e35760405162461bcd60e51b815260040161098790612ffe565b61111a84848484612328565b6000818152600260205260409020546060906001600160a01b031661166e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610987565b6000601561167b8461235b565b60405160200161168c929190612e5d565b60408051601f198184030181529190529392505050565b600a546001600160a01b031633146116cd5760405162461bcd60e51b815260040161098790612fc9565b601155565b600a546001600160a01b031633146116fc5760405162461bcd60e51b815260040161098790612fc9565b601255565b600a546001600160a01b0316331461172b5760405162461bcd60e51b815260040161098790612fc9565b601355565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a9060240160206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a9190612da5565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03811661185d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b610b2e81611f22565b6001600160a01b0383166118c1576118bc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6118e4565b816001600160a01b0316836001600160a01b0316146118e4576118e48382612475565b6001600160a01b0382166118fb57610abd81612512565b826001600160a01b0316826001600160a01b031614610abd57610abd82826125eb565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a8261262f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197882611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610987565b6000611a3583611120565b9050806001600160a01b0316846001600160a01b03161480611a705750836001600160a01b0316611a6584610912565b6001600160a01b0316145b80611aa057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611abb82611120565b6001600160a01b031614611b1f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610987565b6001600160a01b038216611b815760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b611b8c83838361267f565b611b97600082611943565b6001600160a01b0383166000908152600360205260408120805460019290611bc09084906130e7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bee90849061304f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a082319060240160206040518083038186803b158015611c9857600080fd5b505afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190612da5565b9050624c4b408110611ce55750600192915050565b50600092915050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b5050505050565b80471015611dbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610987565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e09576040519150601f19603f3d011682016040523d82523d6000602084013e611e0e565b606091505b5050905080610abd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610987565b600a54600160a01b900460ff16611ed55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610987565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff1615611fc15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610987565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f053390565b600061200882846130a0565b9392505050565b60008082116120535760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610987565b8361206057506000612008565b600061206c84866130a0565b905083612079868361308c565b141561209157612089838261308c565b915050612008565b600061209d848761308c565b905060006120ab8588613180565b905060006120b9868861308c565b905060006120c78789613180565b90506121146120e0886120da8685611ffc565b9061268a565b61210e6120ed8686611ffc565b61210e6120fa8987611ffc565b61210e8d6121088c8b611ffc565b90611ffc565b90612696565b9998505050505050505050565b600061212c60105490565b905061213b60236109c46130bf565b6001600160801b0316811061217e5760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610987565b61218c601080546001019055565b610fba82600f83815481106121b157634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff166126a2565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b15801561223c57600080fd5b505af1158015612250573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b031614156122bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610987565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612333848484611aa8565b61233f848484846126bc565b61111a5760405162461bcd60e51b815260040161098790612f77565b60608161237f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123a9578061239381613165565b91506123a29050600a8361308c565b9150612383565b60008167ffffffffffffffff8111156123d257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123fc576020820181803683370190505b5090505b8415611aa0576124116001836130e7565b915061241e600a86613180565b61242990603061304f565b60f81b81838151811061244c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061246e600a8661308c565b9450612400565b6000600161248284611197565b61248c91906130e7565b6000838152600760205260409020549091508082146124df576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612524906001906130e7565b6000838152600960205260408120546008805493945090928490811061255a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061258957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125cf57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125f683611197565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b148061266057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b610abd838383611866565b6000612008828461308c565b6000612008828461304f565b610fba8282604051806020016040528060008152506127c9565b60006001600160a01b0384163b156127be57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612700903390899088908890600401612f27565b602060405180830381600087803b15801561271a57600080fd5b505af192505050801561274a575060408051601f3d908101601f1916820190925261274791810190612d09565b60015b6127a4573d808015612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50805161279c5760405162461bcd60e51b815260040161098790612f77565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611aa0565b506001949350505050565b6127d383836127fc565b6127e060008484846126bc565b610abd5760405162461bcd60e51b815260040161098790612f77565b6001600160a01b0382166128525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610987565b6000818152600260205260409020546001600160a01b0316156128b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6128c36000838361267f565b6001600160a01b03821660009081526003602052604081208054600192906128ec90849061304f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805482825590600052602060002090600f016010900481019282156129e75791602002820160005b838211156129b757833561ffff1683826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302612973565b80156129e55782816101000a81549061ffff02191690556002016020816001010492830192600103026129b7565b505b506129f3929150612a6b565b5090565b828054612a039061312a565b90600052602060002090601f016020900481019282612a2557600085556129e7565b82601f10612a3e57805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e7578251825591602001919060010190612a50565b5b808211156129f35760008155600101612a6c565b600067ffffffffffffffff80841115612a9b57612a9b6131c0565b604051601f8501601f19908116603f01168101908282118183101715612ac357612ac36131c0565b81604052809350858152868686011115612adc57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612b07578182fd5b50813567ffffffffffffffff811115612b1e578182fd5b6020830191508360208260051b8501011115612b3957600080fd5b9250929050565b600060208284031215612b51578081fd5b8135612008816131d6565b60008060408385031215612b6e578081fd5b8235612b79816131d6565b91506020830135612b89816131d6565b809150509250929050565b600080600060608486031215612ba8578081fd5b8335612bb3816131d6565b92506020840135612bc3816131d6565b929592945050506040919091013590565b60008060008060808587031215612be9578081fd5b8435612bf4816131d6565b93506020850135612c04816131d6565b925060408501359150606085013567ffffffffffffffff811115612c26578182fd5b8501601f81018713612c36578182fd5b612c4587823560208401612a80565b91505092959194509250565b60008060408385031215612c63578182fd5b8235612c6e816131d6565b915060208301358015158114612b89578182fd5b60008060408385031215612c94578182fd5b8235612c9f816131d6565b946020939093013593505050565b60008060208385031215612cbf578182fd5b823567ffffffffffffffff811115612cd5578283fd5b612ce185828601612af6565b90969095509350505050565b600060208284031215612cfe578081fd5b8135612008816131eb565b600060208284031215612d1a578081fd5b8151612008816131eb565b600060208284031215612d36578081fd5b813567ffffffffffffffff811115612d4c578182fd5b8201601f81018413612d5c578182fd5b611aa084823560208401612a80565b600060208284031215612d7c578081fd5b813561ffff81168114612008578182fd5b600060208284031215612d9e578081fd5b5035919050565b600060208284031215612db6578081fd5b5051919050565b600080600060408486031215612dd1578081fd5b833560ff81168114612de1578182fd5b9250602084013567ffffffffffffffff811115612dfc578182fd5b612e0886828701612af6565b9497909650939450505050565b60008151808452612e2d8160208601602086016130fe565b601f01601f19169290920160200192915050565b60008151612e538185602086016130fe565b9290920192915050565b600080845482600182811c915080831680612e7957607f831692505b6020808410821415612e9957634e487b7160e01b87526022600452602487fd5b818015612ead5760018114612ebe57612eea565b60ff19861689528489019650612eea565b60008b815260209020885b86811015612ee25781548b820152908501908301612ec9565b505084890196505b505050505050612f1e612f0d612f0783602f60f81b815260010190565b86612e41565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5a90830184612e15565b9695505050505050565b6020815260006120086020830184612e15565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561306257613062613194565b500190565b600060ff821660ff84168060ff0382111561308457613084613194565b019392505050565b60008261309b5761309b6131aa565b500490565b60008160001904831182151516156130ba576130ba613194565b500290565b60006001600160801b03838116908316818110156130df576130df613194565b039392505050565b6000828210156130f9576130f9613194565b500390565b60005b83811015613119578181015183820152602001613101565b8381111561111a5750506000910152565b600181811c9082168061313e57607f821691505b6020821081141561315f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561317957613179613194565b5060010190565b60008261318f5761318f6131aa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b2e57600080fd5b6001600160e01b031981168114610b2e57600080fdfea2646970667358221220194a43e54da267965072e188597d8bca8de1bbe59c53c24cb4e4361079a4077164736f6c63430008040033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105718061007e6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a61461007c5780638da5cb5b14610091578063e3a9db1a146100be578063f2fde38b14610102578063f340fa0114610122575b600080fd5b34801561006657600080fd5b5061007a6100753660046104aa565b610135565b005b34801561008857600080fd5b5061007a6101d7565b34801561009d57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100ca57600080fd5b506100f46100d93660046104aa565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100b5565b34801561010e57600080fd5b5061007a61011d3660046104aa565b61020d565b61007a6101303660046104aa565b6102a8565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906104cd565b60405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610190908261033c565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516101cb91815260200190565b60405180910390a25050565b6000546001600160a01b031633146102015760405162461bcd60e51b815260040161015f906104cd565b61020b600061045a565b565b6000546001600160a01b031633146102375760405162461bcd60e51b815260040161015f906104cd565b6001600160a01b03811661029c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015f565b6102a58161045a565b50565b6000546001600160a01b031633146102d25760405162461bcd60e51b815260040161015f906104cd565b6001600160a01b0381166000908152600160205260408120805434928392916102fc908490610502565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4906020016101cb565b8047101561038c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161015f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146103d9576040519150601f19603f3d011682016040523d82523d6000602084013e6103de565b606091505b50509050806104555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161015f565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156104bb578081fd5b81356104c681610526565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561052157634e487b7160e01b81526011600452602481fd5b500190565b6001600160a01b03811681146102a557600080fdfea264697066735822122097aaf8330e2b679c3d08b05923d025844a488ff53c65b2f148c20b20172688e864736f6c63430008040033697066733a2f2f516d5a6357777432666a33576b706255374a66355274785a7067394d32707a686547433737615a67506d506f55530000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5000000000000000000000000fb8c9974360c2bc205bb43e9c2aa8737088a8a70
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636352211e1161014f578063b88d4fde116100c1578063dc09e9231161007a578063dc09e9231461076d578063e1ec62941461078d578063e2982c21146107ad578063e985e9c5146107cd578063f2fde38b14610816578063f99031a71461083657600080fd5b8063b88d4fde146106b7578063b88fe6a3146106d7578063c2ba4744146106f7578063c87b56dd14610718578063d49479eb14610738578063d5abeb011461075857600080fd5b806384c4bd4b1161011357806384c4bd4b1461061a5780638da5cb5b1461063157806395d89b411461064f578063a0712d6814610664578063a22cb46514610677578063a230c5241461069757600080fd5b80636352211e1461059057806370a08231146105b0578063715018a6146105d05780638164c309146105e55780638456cb591461060557600080fd5b80633b3c523a116101e85780634a90be57116101ac5780634a90be57146104915780634f6ccce7146104a657806355f804b3146104c65780635a9b0b89146104e65780635c975abb146105515780635e1045ec1461057057600080fd5b80633b3c523a146104075780633ccfd60b146104275780633f4ba83a1461043c57806342842e0e1461045157806343bc16121461047157600080fd5b80632042e5c21161023a5780632042e5c21461034757806320c3cdd51461036757806323b872dd146103875780632acc659e146103a75780632f745c59146103c757806331b3eb94146103e757600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b31461030657806318160ddd14610328575b600080fd5b34801561028357600080fd5b50610297610292366004612ced565b61086f565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610880565b6040516102a39190612f64565b3480156102da57600080fd5b506102ee6102e9366004612d8d565b610912565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004612c82565b6109ac565b005b34801561033457600080fd5b506008545b6040519081526020016102a3565b34801561035357600080fd5b50610326610362366004612b40565b610ac2565b34801561037357600080fd5b50610326610382366004612b40565b610b31565b34801561039357600080fd5b506103266103a2366004612b94565b610b7d565b3480156103b357600080fd5b506103396103c2366004612b40565b610bae565b3480156103d357600080fd5b506103396103e2366004612c82565b610c04565b3480156103f357600080fd5b50610326610402366004612b40565b610c9a565b34801561041357600080fd5b50610326610422366004612dbd565b610d03565b34801561043357600080fd5b50610326610e59565b34801561044857600080fd5b50610326610e8f565b34801561045d57600080fd5b5061032661046c366004612b94565b610ec1565b34801561047d57600080fd5b50600d546102ee906001600160a01b031681565b34801561049d57600080fd5b50600f54610339565b3480156104b257600080fd5b506103396104c1366004612d8d565b610edc565b3480156104d257600080fd5b506103266104e1366004612d25565b610f7d565b3480156104f257600080fd5b506104fb610fbe565b6040516102a39190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b34801561055d57600080fd5b50600a54600160a01b900460ff16610297565b34801561057c57600080fd5b5061032661058b366004612cad565b61106f565b34801561059c57600080fd5b506102ee6105ab366004612d8d565b611120565b3480156105bc57600080fd5b506103396105cb366004612b40565b611197565b3480156105dc57600080fd5b5061032661121e565b3480156105f157600080fd5b50610326610600366004612b40565b611252565b34801561061157600080fd5b506103266112a0565b34801561062657600080fd5b506010546103399081565b34801561063d57600080fd5b50600a546001600160a01b03166102ee565b34801561065b57600080fd5b506102c16112d2565b610326610672366004612d8d565b6112e1565b34801561068357600080fd5b50610326610692366004612c51565b61149b565b3480156106a357600080fd5b506102976106b2366004612b40565b6114a6565b3480156106c357600080fd5b506103266106d2366004612bd4565b6115bd565b3480156106e357600080fd5b50600c546102ee906001600160a01b031681565b34801561070357600080fd5b50610339610712366004612b40565b50600590565b34801561072457600080fd5b506102c1610733366004612d8d565b6115ef565b34801561074457600080fd5b50610326610753366004612d8d565b6116a3565b34801561076457600080fd5b506109c4610339565b34801561077957600080fd5b50610326610788366004612d8d565b6116d2565b34801561079957600080fd5b506103266107a8366004612d8d565b611701565b3480156107b957600080fd5b506103396107c8366004612b40565b611730565b3480156107d957600080fd5b506102976107e8366004612b5c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082257600080fd5b50610326610831366004612b40565b6117ce565b34801561084257600080fd5b50610297610851366004612b40565b6001600160a01b031660009081526016602052604090205460ff1690565b600061087a8261191e565b92915050565b60606000805461088f9061312a565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb9061312a565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109b782611120565b9050806001600160a01b0316836001600160a01b03161415610a255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610987565b336001600160a01b0382161480610a415750610a4181336107e8565b610ab35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610987565b610abd8383611943565b505050565b600a546001600160a01b03163314610aec5760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03811660009081526016602052604090205460ff1615610b2e576001600160a01b0381166000908152601660205260409020805460ff191690555b50565b600a546001600160a01b03163314610b5b5760405162461bcd60e51b815260040161098790612fc9565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b610b8733826119b1565b610ba35760405162461bcd60e51b815260040161098790612ffe565b610abd838383611aa8565b6001600160a01b03811660009081526016602052604081205460ff1680610bd95750610bd982611c4f565b15610be657505060115490565b610bef826114a6565b15610bfc57505060125490565b505060135490565b6000610c0f83611197565b8210610c715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610987565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610ced5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610987565b6002600b55610cfb81611cee565b506001600b55565b600a546001600160a01b03163314610d2d5760405162461bcd60e51b815260040161098790612fc9565b60145460ff841667ffffffffffffffff9091161115610d825760405162461bcd60e51b81526020600482015260116024820152706368756e6b496e6465782065786973747360781b6044820152606401610987565b60ff8316610d9c57610d96600f838361294a565b50610e2e565b8060005b81811015610e2b57600f848483818110610dca57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ddf9190612d6b565b81546001810183556000928352602090922060108304018054600f9093166002026101000a61ffff81810219909416929093169290920217905580610e2381613165565b915050610da0565b50505b610e39836001613067565b6014805467ffffffffffffffff191660ff92909216919091179055505050565b600a546001600160a01b03163314610e835760405162461bcd60e51b815260040161098790612fc9565b610e8d3347611d6c565b565b600a546001600160a01b03163314610eb95760405162461bcd60e51b815260040161098790612fc9565b610e8d611e85565b610abd838383604051806020016040528060008152506115bd565b6000610ee760085490565b8210610f4a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610987565b60088281548110610f6b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610fa75760405162461bcd60e51b815260040161098790612fc9565b8051610fba9060159060208401906129f7565b5050565b610ffe6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61103e6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6013548152601254602082015260115460408201526109c460608201526008546080820152600560c0820152919050565b600a546001600160a01b031633146110995760405162461bcd60e51b815260040161098790612fc9565b8060005b8181101561111a576001601660008686858181106110cb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110e09190612b40565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061111281613165565b91505061109d565b50505050565b6000818152600260205260408120546001600160a01b03168061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610987565b60006001600160a01b0382166112025760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610987565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112485760405162461bcd60e51b815260040161098790612fc9565b610e8d6000611f22565b600a546001600160a01b0316331461127c5760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b600a546001600160a01b031633146112ca5760405162461bcd60e51b815260040161098790612fc9565b610e8d611f74565b60606001805461088f9061312a565b600a54600160a01b900460ff161561132e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610987565b600581111561137f5760405162461bcd60e51b815260206004820152601d60248201527f6e6f74206d696e74206d6f7265207468616e206d617820616d6f756e740000006044820152606401610987565b3360009081526016602052604081205460ff16806113a157506113a133611c4f565b156113ba576011546113b39083611ffc565b90506113f3565b60006113c5336114a6565b905080156113e1576012546113da9084611ffc565b91506113f1565b6013546113ee9084611ffc565b91505b505b803410156114365760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b6044820152606401610987565b600e546000906114539083906001600160801b031661271061200f565b905060005b8381101561147b5761146933612121565b8061147381613165565b915050611458565b50600d54610abd906001600160a01b031661149683856130e7565b6121d8565b610fba338383612259565b600c54604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612da5565b118061087a5750600c54604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b69190612da5565b1192915050565b6115c733836119b1565b6115e35760405162461bcd60e51b815260040161098790612ffe565b61111a84848484612328565b6000818152600260205260409020546060906001600160a01b031661166e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610987565b6000601561167b8461235b565b60405160200161168c929190612e5d565b60408051601f198184030181529190529392505050565b600a546001600160a01b031633146116cd5760405162461bcd60e51b815260040161098790612fc9565b601155565b600a546001600160a01b031633146116fc5760405162461bcd60e51b815260040161098790612fc9565b601255565b600a546001600160a01b0316331461172b5760405162461bcd60e51b815260040161098790612fc9565b601355565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f000000000000000000000000f8ac1ea5c167b5a492681a9f991aade4de79a3299091169063e3a9db1a9060240160206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a9190612da5565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260040161098790612fc9565b6001600160a01b03811661185d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b610b2e81611f22565b6001600160a01b0383166118c1576118bc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6118e4565b816001600160a01b0316836001600160a01b0316146118e4576118e48382612475565b6001600160a01b0382166118fb57610abd81612512565b826001600160a01b0316826001600160a01b031614610abd57610abd82826125eb565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a8261262f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197882611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610987565b6000611a3583611120565b9050806001600160a01b0316846001600160a01b03161480611a705750836001600160a01b0316611a6584610912565b6001600160a01b0316145b80611aa057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611abb82611120565b6001600160a01b031614611b1f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610987565b6001600160a01b038216611b815760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b611b8c83838361267f565b611b97600082611943565b6001600160a01b0383166000908152600360205260408120805460019290611bc09084906130e7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bee90849061304f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a082319060240160206040518083038186803b158015611c9857600080fd5b505afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190612da5565b9050624c4b408110611ce55750600192915050565b50600092915050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000f8ac1ea5c167b5a492681a9f991aade4de79a32916906351cff8d990602401600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b5050505050565b80471015611dbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610987565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e09576040519150601f19603f3d011682016040523d82523d6000602084013e611e0e565b606091505b5050905080610abd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610987565b600a54600160a01b900460ff16611ed55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610987565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff1615611fc15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610987565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f053390565b600061200882846130a0565b9392505050565b60008082116120535760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610987565b8361206057506000612008565b600061206c84866130a0565b905083612079868361308c565b141561209157612089838261308c565b915050612008565b600061209d848761308c565b905060006120ab8588613180565b905060006120b9868861308c565b905060006120c78789613180565b90506121146120e0886120da8685611ffc565b9061268a565b61210e6120ed8686611ffc565b61210e6120fa8987611ffc565b61210e8d6121088c8b611ffc565b90611ffc565b90612696565b9998505050505050505050565b600061212c60105490565b905061213b60236109c46130bf565b6001600160801b0316811061217e5760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610987565b61218c601080546001019055565b610fba82600f83815481106121b157634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff166126a2565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f000000000000000000000000f8ac1ea5c167b5a492681a9f991aade4de79a329169063f340fa019083906024016000604051808303818588803b15801561223c57600080fd5b505af1158015612250573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b031614156122bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610987565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612333848484611aa8565b61233f848484846126bc565b61111a5760405162461bcd60e51b815260040161098790612f77565b60608161237f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123a9578061239381613165565b91506123a29050600a8361308c565b9150612383565b60008167ffffffffffffffff8111156123d257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123fc576020820181803683370190505b5090505b8415611aa0576124116001836130e7565b915061241e600a86613180565b61242990603061304f565b60f81b81838151811061244c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061246e600a8661308c565b9450612400565b6000600161248284611197565b61248c91906130e7565b6000838152600760205260409020549091508082146124df576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612524906001906130e7565b6000838152600960205260408120546008805493945090928490811061255a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061258957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125cf57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125f683611197565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b148061266057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b610abd838383611866565b6000612008828461308c565b6000612008828461304f565b610fba8282604051806020016040528060008152506127c9565b60006001600160a01b0384163b156127be57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612700903390899088908890600401612f27565b602060405180830381600087803b15801561271a57600080fd5b505af192505050801561274a575060408051601f3d908101601f1916820190925261274791810190612d09565b60015b6127a4573d808015612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50805161279c5760405162461bcd60e51b815260040161098790612f77565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611aa0565b506001949350505050565b6127d383836127fc565b6127e060008484846126bc565b610abd5760405162461bcd60e51b815260040161098790612f77565b6001600160a01b0382166128525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610987565b6000818152600260205260409020546001600160a01b0316156128b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6128c36000838361267f565b6001600160a01b03821660009081526003602052604081208054600192906128ec90849061304f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805482825590600052602060002090600f016010900481019282156129e75791602002820160005b838211156129b757833561ffff1683826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302612973565b80156129e55782816101000a81549061ffff02191690556002016020816001010492830192600103026129b7565b505b506129f3929150612a6b565b5090565b828054612a039061312a565b90600052602060002090601f016020900481019282612a2557600085556129e7565b82601f10612a3e57805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e7578251825591602001919060010190612a50565b5b808211156129f35760008155600101612a6c565b600067ffffffffffffffff80841115612a9b57612a9b6131c0565b604051601f8501601f19908116603f01168101908282118183101715612ac357612ac36131c0565b81604052809350858152868686011115612adc57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612b07578182fd5b50813567ffffffffffffffff811115612b1e578182fd5b6020830191508360208260051b8501011115612b3957600080fd5b9250929050565b600060208284031215612b51578081fd5b8135612008816131d6565b60008060408385031215612b6e578081fd5b8235612b79816131d6565b91506020830135612b89816131d6565b809150509250929050565b600080600060608486031215612ba8578081fd5b8335612bb3816131d6565b92506020840135612bc3816131d6565b929592945050506040919091013590565b60008060008060808587031215612be9578081fd5b8435612bf4816131d6565b93506020850135612c04816131d6565b925060408501359150606085013567ffffffffffffffff811115612c26578182fd5b8501601f81018713612c36578182fd5b612c4587823560208401612a80565b91505092959194509250565b60008060408385031215612c63578182fd5b8235612c6e816131d6565b915060208301358015158114612b89578182fd5b60008060408385031215612c94578182fd5b8235612c9f816131d6565b946020939093013593505050565b60008060208385031215612cbf578182fd5b823567ffffffffffffffff811115612cd5578283fd5b612ce185828601612af6565b90969095509350505050565b600060208284031215612cfe578081fd5b8135612008816131eb565b600060208284031215612d1a578081fd5b8151612008816131eb565b600060208284031215612d36578081fd5b813567ffffffffffffffff811115612d4c578182fd5b8201601f81018413612d5c578182fd5b611aa084823560208401612a80565b600060208284031215612d7c578081fd5b813561ffff81168114612008578182fd5b600060208284031215612d9e578081fd5b5035919050565b600060208284031215612db6578081fd5b5051919050565b600080600060408486031215612dd1578081fd5b833560ff81168114612de1578182fd5b9250602084013567ffffffffffffffff811115612dfc578182fd5b612e0886828701612af6565b9497909650939450505050565b60008151808452612e2d8160208601602086016130fe565b601f01601f19169290920160200192915050565b60008151612e538185602086016130fe565b9290920192915050565b600080845482600182811c915080831680612e7957607f831692505b6020808410821415612e9957634e487b7160e01b87526022600452602487fd5b818015612ead5760018114612ebe57612eea565b60ff19861689528489019650612eea565b60008b815260209020885b86811015612ee25781548b820152908501908301612ec9565b505084890196505b505050505050612f1e612f0d612f0783602f60f81b815260010190565b86612e41565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5a90830184612e15565b9695505050505050565b6020815260006120086020830184612e15565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561306257613062613194565b500190565b600060ff821660ff84168060ff0382111561308457613084613194565b019392505050565b60008261309b5761309b6131aa565b500490565b60008160001904831182151516156130ba576130ba613194565b500290565b60006001600160801b03838116908316818110156130df576130df613194565b039392505050565b6000828210156130f9576130f9613194565b500390565b60005b83811015613119578181015183820152602001613101565b8381111561111a5750506000910152565b600181811c9082168061313e57607f821691505b6020821081141561315f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561317957613179613194565b5060010190565b60008261318f5761318f6131aa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b2e57600080fd5b6001600160e01b031981168114610b2e57600080fdfea2646970667358221220194a43e54da267965072e188597d8bca8de1bbe59c53c24cb4e4361079a4077164736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5000000000000000000000000fb8c9974360c2bc205bb43e9c2aa8737088a8a70
-----Decoded View---------------
Arg [0] : _memberships (address): 0x8d9232Ebc4f06B7b8005CCff0ca401675ceb25F5
Arg [1] : _artist (address): 0xfB8c9974360c2BC205bb43E9C2AA8737088a8a70
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [1] : 000000000000000000000000fb8c9974360c2bc205bb43e9c2aa8737088a8a70
Deployed Bytecode Sourcemap
88313:5521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87153:145;;;;;;;;;;-1:-1:-1;87153:145:0;;;;;:::i;:::-;;:::i;:::-;;;10851:14:1;;10844:22;10826:41;;10814:2;10799:18;87153:145:0;;;;;;;;53205:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54764:221::-;;;;;;;;;;-1:-1:-1;54764:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9351:32:1;;;9333:51;;9321:2;9306:18;54764:221:0;9288:102:1;54287:411:0;;;;;;;;;;-1:-1:-1;54287:411:0;;;;;:::i;:::-;;:::i;:::-;;68117:113;;;;;;;;;;-1:-1:-1;68205:10:0;:17;68117:113;;;22857:25:1;;;22845:2;22830:18;68117:113:0;22812:76:1;90989:156:0;;;;;;;;;;-1:-1:-1;90989:156:0;;;;;:::i;:::-;;:::i;90255:121::-;;;;;;;;;;-1:-1:-1;90255:121:0;;;;;:::i;:::-;;:::i;55514:339::-;;;;;;;;;;-1:-1:-1;55514:339:0;;;;;:::i;:::-;;:::i;91153:317::-;;;;;;;;;;-1:-1:-1;91153:317:0;;;;;:::i;:::-;;:::i;67785:256::-;;;;;;;;;;-1:-1:-1;67785:256:0;;;;;:::i;:::-;;:::i;86781:133::-;;;;;;;;;;-1:-1:-1;86781:133:0;;;;;:::i;:::-;;:::i;89382:455::-;;;;;;;;;;-1:-1:-1;89382:455:0;;;;;:::i;:::-;;:::i;87306:115::-;;;;;;;;;;;;;:::i;87497:64::-;;;;;;;;;;;;;:::i;55924:185::-;;;;;;;;;;-1:-1:-1;55924:185:0;;;;;:::i;:::-;;:::i;86464:21::-;;;;;;;;;;-1:-1:-1;86464:21:0;;;;-1:-1:-1;;;;;86464:21:0;;;89288:82;;;;;;;;;;-1:-1:-1;89350:5:0;:12;89288:82;;68307:233;;;;;;;;;;-1:-1:-1;68307:233:0;;;;;:::i;:::-;;:::i;92049:99::-;;;;;;;;;;-1:-1:-1;92049:99:0;;;;;:::i;:::-;;:::i;89845:402::-;;;;;;;;;;;;;:::i;:::-;;;;;;22235:4:1;22277:3;22266:9;22262:19;22254:27;;22314:6;22308:13;22297:9;22290:32;22378:4;22370:6;22366:17;22360:24;22353:4;22342:9;22338:20;22331:54;22441:4;22433:6;22429:17;22423:24;22416:4;22405:9;22401:20;22394:54;22504:4;22496:6;22492:17;22486:24;22479:4;22468:9;22464:20;22457:54;22567:4;22559:6;22555:17;22549:24;22542:4;22531:9;22527:20;22520:54;22630:4;22622:6;22618:17;22612:24;22605:4;22594:9;22590:20;22583:54;22693:4;22685:6;22681:17;22675:24;22668:4;22657:9;22653:20;22646:54;22244:462;;;;;82267:86:0;;;;;;;;;;-1:-1:-1;82338:7:0;;-1:-1:-1;;;82338:7:0;;;;82267:86;;90636:224;;;;;;;;;;-1:-1:-1;90636:224:0;;;;;:::i;:::-;;:::i;52899:239::-;;;;;;;;;;-1:-1:-1;52899:239:0;;;;;:::i;:::-;;:::i;52629:208::-;;;;;;;;;;-1:-1:-1;52629:208:0;;;;;:::i;:::-;;:::i;75344:103::-;;;;;;;;;;;;;:::i;90872:109::-;;;;;;;;;;-1:-1:-1;90872:109:0;;;;;:::i;:::-;;:::i;87429:60::-;;;;;;;;;;;;;:::i;88467:39::-;;;;;;;;;;-1:-1:-1;88467:39:0;;;;;;74693:87;;;;;;;;;;-1:-1:-1;74766:6:0;;-1:-1:-1;;;;;74766:6:0;74693:87;;53374:104;;;;;;;;;;;;;:::i;92156:843::-;;;;;;:::i;:::-;;:::i;55057:155::-;;;;;;;;;;-1:-1:-1;55057:155:0;;;;;:::i;:::-;;:::i;86604:169::-;;;;;;;;;;-1:-1:-1;86604:169:0;;;;;:::i;:::-;;:::i;56180:328::-;;;;;;;;;;-1:-1:-1;56180:328:0;;;;;:::i;:::-;;:::i;86431:26::-;;;;;;;;;;-1:-1:-1;86431:26:0;;;;-1:-1:-1;;;;;86431:26:0;;;93724:107;;;;;;;;;;-1:-1:-1;93724:107:0;;;;;:::i;:::-;-1:-1:-1;88734:1:0;;93724:107;93007:318;;;;;;;;;;-1:-1:-1;93007:318:0;;;;;:::i;:::-;;:::i;91807:100::-;;;;;;;;;;-1:-1:-1;91807:100:0;;;;;:::i;:::-;;:::i;93618:98::-;;;;;;;;;;-1:-1:-1;88690:4:0;93618:98;;91705:94;;;;;;;;;;-1:-1:-1;91705:94:0;;;;;:::i;:::-;;:::i;91601:96::-;;;;;;;;;;-1:-1:-1;91601:96:0;;;;;:::i;:::-;;:::i;80515:112::-;;;;;;;;;;-1:-1:-1;80515:112:0;;;;;:::i;:::-;;:::i;55283:164::-;;;;;;;;;;-1:-1:-1;55283:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;55404:25:0;;;55380:4;55404:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;55283:164;75602:201;;;;;;;;;;-1:-1:-1;75602:201:0;;;;;:::i;:::-;;:::i;91478:111::-;;;;;;;;;;-1:-1:-1;91478:111:0;;;;;:::i;:::-;-1:-1:-1;;;;;91562:19:0;91538:4;91562:19;;;:9;:19;;;;;;;;;91478:111;87153:145;87230:4;87254:36;87278:11;87254:23;:36::i;:::-;87247:43;87153:145;-1:-1:-1;;87153:145:0:o;53205:100::-;53259:13;53292:5;53285:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53205:100;:::o;54764:221::-;54840:7;58107:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58107:16:0;54860:73;;;;-1:-1:-1;;;54860:73:0;;17787:2:1;54860:73:0;;;17769:21:1;17826:2;17806:18;;;17799:30;17865:34;17845:18;;;17838:62;-1:-1:-1;;;17916:18:1;;;17909:42;17968:19;;54860:73:0;;;;;;;;;-1:-1:-1;54953:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54953:24:0;;54764:221::o;54287:411::-;54368:13;54384:23;54399:7;54384:14;:23::i;:::-;54368:39;;54432:5;-1:-1:-1;;;;;54426:11:0;:2;-1:-1:-1;;;;;54426:11:0;;;54418:57;;;;-1:-1:-1;;;54418:57:0;;19322:2:1;54418:57:0;;;19304:21:1;19361:2;19341:18;;;19334:30;19400:34;19380:18;;;19373:62;-1:-1:-1;;;19451:18:1;;;19444:31;19492:19;;54418:57:0;19294:223:1;54418:57:0;25257:10;-1:-1:-1;;;;;54510:21:0;;;;:62;;-1:-1:-1;54535:37:0;54552:5;25257:10;55283:164;:::i;54535:37::-;54488:168;;;;-1:-1:-1;;;54488:168:0;;16180:2:1;54488:168:0;;;16162:21:1;16219:2;16199:18;;;16192:30;16258:34;16238:18;;;16231:62;16329:26;16309:18;;;16302:54;16373:19;;54488:168:0;16152:246:1;54488:168:0;54669:21;54678:2;54682:7;54669:8;:21::i;:::-;54287:411;;;:::o;90989:156::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91064:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;::::1;;91060:78;;;-1:-1:-1::0;;;;;91107:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;91100:26;;-1:-1:-1;;91100:26:0::1;::::0;;91060:78:::1;90989:156:::0;:::o;90255:121::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;90340:12:::1;:28:::0;;-1:-1:-1;;;;;;90340:28:0::1;-1:-1:-1::0;;;;;90340:28:0;;;::::1;::::0;;;::::1;::::0;;90255:121::o;55514:339::-;55709:41;25257:10;55742:7;55709:18;:41::i;:::-;55701:103;;;;-1:-1:-1;;;55701:103:0;;;;;;;:::i;:::-;55817:28;55827:4;55833:2;55837:7;55817:9;:28::i;91153:317::-;-1:-1:-1;;;;;91562:19:0;;91219:7;91562:19;;;:9;:19;;;;;;;;91243:47;;;;91267:23;91282:7;91267:14;:23::i;:::-;91239:224;;;-1:-1:-1;;91314:13:0;;;91153:317::o;91239:224::-;91349:17;91358:7;91349:8;:17::i;:::-;91345:118;;;-1:-1:-1;;91390:10:0;;;91153:317::o;91345:118::-;-1:-1:-1;;91440:11:0;;;91153:317::o;67785:256::-;67882:7;67918:23;67935:5;67918:16;:23::i;:::-;67910:5;:31;67902:87;;;;-1:-1:-1;;;67902:87:0;;11877:2:1;67902:87:0;;;11859:21:1;11916:2;11896:18;;;11889:30;11955:34;11935:18;;;11928:62;-1:-1:-1;;;12006:18:1;;;11999:41;12057:19;;67902:87:0;11849:233:1;67902:87:0;-1:-1:-1;;;;;;68007:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;67785:256::o;86781:133::-;85273:1;85871:7;;:19;;85863:63;;;;-1:-1:-1;;;85863:63:0;;21604:2:1;85863:63:0;;;21586:21:1;21643:2;21623:18;;;21616:30;21682:33;21662:18;;;21655:61;21733:18;;85863:63:0;21576:181:1;85863:63:0;85273:1;86004:7;:18;86877:29:::1;86900:5:::0;86877:22:::1;:29::i;:::-;-1:-1:-1::0;85229:1:0;86183:7;:22;86781:133::o;89382:455::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;89488:17:::1;::::0;:32:::1;::::0;::::1;:17;::::0;;::::1;:32;;89480:62;;;::::0;-1:-1:-1;;;89480:62:0;;21258:2:1;89480:62:0::1;::::0;::::1;21240:21:1::0;21297:2;21277:18;;;21270:30;-1:-1:-1;;;21316:18:1;;;21309:47;21373:18;;89480:62:0::1;21230:167:1::0;89480:62:0::1;89567:16;::::0;::::1;89563:221;;89600:14;:5;89608:6:::0;;89600:14:::1;:::i;:::-;;89563:221;;;89658:6:::0;89647:8:::1;89686:87;89706:3;89702:1;:7;89686:87;;;89736:5;89747:6;;89754:1;89747:9;;;;;-1:-1:-1::0;;;89747:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89736:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;89736:21:0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;89711:4;::::1;::::0;::::1;:::i;:::-;;;;89686:87;;;;89563:221;;89814:15;:11:::0;89828:1:::1;89814:15;:::i;:::-;89794:17;:35:::0;;-1:-1:-1;;89794:35:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;89382:455:0:o;87306:115::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;87361:52:::1;87369:10;87391:21;87361:29;:52::i;:::-;87306:115::o:0;87497:64::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;87543:10:::1;:8;:10::i;55924:185::-:0;56062:39;56079:4;56085:2;56089:7;56062:39;;;;;;;;;;;;:16;:39::i;68307:233::-;68382:7;68418:30;68205:10;:17;;68117:113;68418:30;68410:5;:38;68402:95;;;;-1:-1:-1;;;68402:95:0;;20845:2:1;68402:95:0;;;20827:21:1;20884:2;20864:18;;;20857:30;20923:34;20903:18;;;20896:62;-1:-1:-1;;;20974:18:1;;;20967:42;21026:19;;68402:95:0;20817:234:1;68402:95:0;68515:10;68526:5;68515:17;;;;;;-1:-1:-1;;;68515:17:0;;;;;;;;;;;;;;;;;68508:24;;68307:233;;;:::o;92049:99::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;92122:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;92049:99:::0;:::o;89845:402::-;89896:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89896:11:0;89920:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89920:19:0;89972:11;;89950:33;;90015:10;;89994:18;;;:31;90060:13;;90036:21;;;:37;88690:4;90084:17;;;:30;68205:10;:17;90125:19;;;:41;88734:1;90177:20;;;:37;90125:7;89845:402;-1:-1:-1;89845:402:0:o;90636:224::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;90728:10;90717:8:::1;90756:89;90776:3;90772:1;:7;90756:89;;;90829:4;90802:9;:24;90812:10;;90823:1;90812:13;;;;;-1:-1:-1::0;;;90812:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90802:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;90802:24:0;:31;;-1:-1:-1;;90802:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;90781:4;::::1;::::0;::::1;:::i;:::-;;;;90756:89;;;;74984:1;90636:224:::0;;:::o;52899:239::-;52971:7;53007:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53007:16:0;53042:19;53034:73;;;;-1:-1:-1;;;53034:73:0;;17016:2:1;53034:73:0;;;16998:21:1;17055:2;17035:18;;;17028:30;17094:34;17074:18;;;17067:62;-1:-1:-1;;;17145:18:1;;;17138:39;17194:19;;53034:73:0;16988:231:1;52629:208:0;52701:7;-1:-1:-1;;;;;52729:19:0;;52721:74;;;;-1:-1:-1;;;52721:74:0;;16605:2:1;52721:74:0;;;16587:21:1;16644:2;16624:18;;;16617:30;16683:34;16663:18;;;16656:62;-1:-1:-1;;;16734:18:1;;;16727:40;16784:19;;52721:74:0;16577:232:1;52721:74:0;-1:-1:-1;;;;;;52813:16:0;;;;;:9;:16;;;;;;;52629:208::o;75344:103::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;75409:30:::1;75436:1;75409:18;:30::i;90872:109::-:0;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;90947:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;90947:26:0::1;90969:4;90947:26;::::0;;90872:109::o;87429:60::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;87473:8:::1;:6;:8::i;53374:104::-:0;53430:13;53463:7;53456:14;;;;;:::i;92156:843::-;82338:7;;-1:-1:-1;;;82338:7:0;;;;82592:9;82584:38;;;;-1:-1:-1;;;82584:38:0;;15835:2:1;82584:38:0;;;15817:21:1;15874:2;15854:18;;;15847:30;-1:-1:-1;;;15893:18:1;;;15886:46;15949:18;;82584:38:0;15807:166:1;82584:38:0;88734:1:::1;92246:25:::0;::::1;;92238:67;;;::::0;-1:-1:-1;;;92238:67:0;;20142:2:1;92238:67:0::1;::::0;::::1;20124:21:1::0;20181:2;20161:18;;;20154:30;20220:31;20200:18;;;20193:59;20269:18;;92238:67:0::1;20114:179:1::0;92238:67:0::1;92375:10;92326:13;91562:19:::0;;;:9;:19;;;;;;;;92363:53:::1;;;;92390:26;92405:10;92390:14;:26::i;:::-;92359:360;;;92441:13;::::0;:26:::1;::::0;92459:7;92441:17:::1;:26::i;:::-;92433:34;;92359:360;;;92501:14;92518:20;92527:10;92518:8;:20::i;:::-;92501:37;;92557:9;92553:155;;;92594:10;::::0;:23:::1;::::0;92609:7;92594:14:::1;:23::i;:::-;92586:31;;92553:155;;;92667:11;::::0;:24:::1;::::0;92683:7;92667:15:::1;:24::i;:::-;92659:32;;92553:155;92359:360;;92760:5;92747:9;:18;;92739:47;;;::::0;-1:-1:-1;;;92739:47:0;;20500:2:1;92739:47:0::1;::::0;::::1;20482:21:1::0;20539:2;20519:18;;;20512:30;-1:-1:-1;;;20558:18:1;;;20551:46;20614:18;;92739:47:0::1;20472:166:1::0;92739:47:0::1;92832:3;::::0;92799:17:::1;::::0;92819:24:::1;::::0;:5;;-1:-1:-1;;;;;92832:3:0::1;86526:5;92819:12;:24::i;:::-;92799:44;;92861:9;92857:83;92880:7;92876:1;:11;92857:83;;;92908:20;92917:10;92908:8;:20::i;:::-;92889:3:::0;::::1;::::0;::::1;:::i;:::-;;;;92857:83;;;-1:-1:-1::0;92965:6:0::1;::::0;92950:41:::1;::::0;-1:-1:-1;;;;;92965:6:0::1;92973:17;92981:9:::0;92973:5;:17:::1;:::i;:::-;92950:14;:41::i;55057:155::-:0;55152:52;25257:10;55185:8;55195;55152:18;:52::i;86604:169::-;86685:11;;:34;;-1:-1:-1;;;86685:34:0;;-1:-1:-1;;;;;10312:32:1;;;86685:34:0;;;10294:51:1;86685:11:0;10361:18:1;;;10354:34;86661:4:0;;;;86685:11;;;:21;;10267:18:1;;86685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:80;;;-1:-1:-1;86727:11:0;;:34;;-1:-1:-1;;;86727:34:0;;-1:-1:-1;;;;;10312:32:1;;;86727:34:0;;;10294:51:1;86759:1:0;10361:18:1;;;10354:34;86764:1:0;;86727:11;;:21;;10267:18:1;;86727:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;86678:87;86604:169;-1:-1:-1;;86604:169:0:o;56180:328::-;56355:41;25257:10;56388:7;56355:18;:41::i;:::-;56347:103;;;;-1:-1:-1;;;56347:103:0;;;;;;;:::i;:::-;56461:39;56475:4;56481:2;56485:7;56494:5;56461:13;:39::i;93007:318::-;58083:4;58107:16;;;:7;:16;;;;;;93078:13;;-1:-1:-1;;;;;58107:16:0;93102:76;;;;-1:-1:-1;;;93102:76:0;;18906:2:1;93102:76:0;;;18888:21:1;18945:2;18925:18;;;18918:30;18984:34;18964:18;;;18957:62;-1:-1:-1;;;19035:18:1;;;19028:45;19090:19;;93102:76:0;18878:237:1;93102:76:0;93189:23;93239:7;93253:26;93270:8;93253:16;:26::i;:::-;93222:67;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;93222:67:0;;;;;;;;;;93007:318;-1:-1:-1;;;93007:318:0:o;91807:100::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;91878:13:::1;:21:::0;91807:100::o;91705:94::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;91773:10:::1;:18:::0;91705:94::o;91601:96::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;91670:11:::1;:19:::0;91601:96::o;80515:112::-;80595:24;;-1:-1:-1;;;80595:24:0;;-1:-1:-1;;;;;9351:32:1;;;80595:24:0;;;9333:51:1;80568:7:0;;80595;:18;;;;;;9306::1;;80595:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75602:201::-;74766:6;;-1:-1:-1;;;;;74766:6:0;25257:10;74913:23;74905:68;;;;-1:-1:-1;;;74905:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75691:22:0;::::1;75683:73;;;::::0;-1:-1:-1;;;75683:73:0;;12708:2:1;75683:73:0::1;::::0;::::1;12690:21:1::0;12747:2;12727:18;;;12720:30;12786:34;12766:18;;;12759:62;-1:-1:-1;;;12837:18:1;;;12830:36;12883:19;;75683:73:0::1;12680:228:1::0;75683:73:0::1;75767:28;75786:8;75767:18;:28::i;69153:589::-:0;-1:-1:-1;;;;;69359:18:0;;69355:187;;69394:40;69426:7;70569:10;:17;;70542:24;;;;:15;:24;;;;;:44;;;70597:24;;;;;;;;;;;;70465:164;69394:40;69355:187;;;69464:2;-1:-1:-1;;;;;69456:10:0;:4;-1:-1:-1;;;;;69456:10:0;;69452:90;;69483:47;69516:4;69522:7;69483:32;:47::i;:::-;-1:-1:-1;;;;;69556:16:0;;69552:183;;69589:45;69626:7;69589:36;:45::i;69552:183::-;69662:4;-1:-1:-1;;;;;69656:10:0;:2;-1:-1:-1;;;;;69656:10:0;;69652:83;;69683:40;69711:2;69715:7;69683:27;:40::i;67477:224::-;67579:4;-1:-1:-1;;;;;;67603:50:0;;-1:-1:-1;;;67603:50:0;;:90;;;67657:36;67681:11;67657:23;:36::i;62164:174::-;62239:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;62239:29:0;-1:-1:-1;;;;;62239:29:0;;;;;;;;:24;;62293:23;62239:24;62293:14;:23::i;:::-;-1:-1:-1;;;;;62284:46:0;;;;;;;;;;;62164:174;;:::o;58312:348::-;58405:4;58107:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58107:16:0;58422:73;;;;-1:-1:-1;;;58422:73:0;;15422:2:1;58422:73:0;;;15404:21:1;15461:2;15441:18;;;15434:30;15500:34;15480:18;;;15473:62;-1:-1:-1;;;15551:18:1;;;15544:42;15603:19;;58422:73:0;15394:234:1;58422:73:0;58506:13;58522:23;58537:7;58522:14;:23::i;:::-;58506:39;;58575:5;-1:-1:-1;;;;;58564:16:0;:7;-1:-1:-1;;;;;58564:16:0;;:51;;;;58608:7;-1:-1:-1;;;;;58584:31:0;:20;58596:7;58584:11;:20::i;:::-;-1:-1:-1;;;;;58584:31:0;;58564:51;:87;;;-1:-1:-1;;;;;;55404:25:0;;;55380:4;55404:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;58619:32;58556:96;58312:348;-1:-1:-1;;;;58312:348:0:o;61421:625::-;61580:4;-1:-1:-1;;;;;61553:31:0;:23;61568:7;61553:14;:23::i;:::-;-1:-1:-1;;;;;61553:31:0;;61545:81;;;;-1:-1:-1;;;61545:81:0;;13115:2:1;61545:81:0;;;13097:21:1;13154:2;13134:18;;;13127:30;13193:34;13173:18;;;13166:62;-1:-1:-1;;;13244:18:1;;;13237:35;13289:19;;61545:81:0;13087:227:1;61545:81:0;-1:-1:-1;;;;;61645:16:0;;61637:65;;;;-1:-1:-1;;;61637:65:0;;13878:2:1;61637:65:0;;;13860:21:1;13917:2;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;-1:-1:-1;;;14007:18:1;;;14000:34;14051:19;;61637:65:0;13850:226:1;61637:65:0;61715:39;61736:4;61742:2;61746:7;61715:20;:39::i;:::-;61819:29;61836:1;61840:7;61819:8;:29::i;:::-;-1:-1:-1;;;;;61861:15:0;;;;;;:9;:15;;;;;:20;;61880:1;;61861:15;:20;;61880:1;;61861:20;:::i;:::-;;;;-1:-1:-1;;;;;;;61892:13:0;;;;;;:9;:13;;;;;:18;;61909:1;;61892:13;:18;;61909:1;;61892:18;:::i;:::-;;;;-1:-1:-1;;61921:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;61921:21:0;-1:-1:-1;;;;;61921:21:0;;;;;;;;;61960:27;;61921:16;;61960:27;;;;;;;54287:411;;;:::o;90384:244::-;90488:12;;90481:40;;-1:-1:-1;;;90481:40:0;;-1:-1:-1;;;;;9351:32:1;;;90481:40:0;;;9333:51:1;90449:4:0;;;;90488:12;;;90481:30;;9306:18:1;;90481:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90466:55;;90548:7;90536;:19;90532:64;;-1:-1:-1;90580:4:0;;90384:244;-1:-1:-1;;90384:244:0:o;90532:64::-;-1:-1:-1;90615:5:0;;90384:244;-1:-1:-1;;90384:244:0:o;80285:106::-;80360:23;;-1:-1:-1;;;80360:23:0;;-1:-1:-1;;;;;9351:32:1;;;80360:23:0;;;9333:51:1;80360:7:0;:16;;;;9306:18:1;;80360:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80285:106;:::o;18481:317::-;18596:6;18571:21;:31;;18563:73;;;;-1:-1:-1;;;18563:73:0;;15064:2:1;18563:73:0;;;15046:21:1;15103:2;15083:18;;;15076:30;15142:31;15122:18;;;15115:59;15191:18;;18563:73:0;15036:179:1;18563:73:0;18650:12;18668:9;-1:-1:-1;;;;;18668:14:0;18690:6;18668:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18649:52;;;18720:7;18712:78;;;;-1:-1:-1;;;18712:78:0;;14637:2:1;18712:78:0;;;14619:21:1;14676:2;14656:18;;;14649:30;14715:34;14695:18;;;14688:62;14786:28;14766:18;;;14759:56;14832:19;;18712:78:0;14609:248:1;83326:120:0;82338:7;;-1:-1:-1;;;82338:7:0;;;;82862:41;;;;-1:-1:-1;;;82862:41:0;;11528:2:1;82862:41:0;;;11510:21:1;11567:2;11547:18;;;11540:30;-1:-1:-1;;;11586:18:1;;;11579:50;11646:18;;82862:41:0;11500:170:1;82862:41:0;83385:7:::1;:15:::0;;-1:-1:-1;;;;83385:15:0::1;::::0;;83416:22:::1;25257:10:::0;83425:12:::1;83416:22;::::0;-1:-1:-1;;;;;9351:32:1;;;9333:51;;9321:2;9306:18;83416:22:0::1;;;;;;;83326:120::o:0;75963:191::-;76056:6;;;-1:-1:-1;;;;;76073:17:0;;;-1:-1:-1;;;;;;76073:17:0;;;;;;;76106:40;;76056:6;;;76073:17;76056:6;;76106:40;;76037:16;;76106:40;75963:191;;:::o;83067:118::-;82338:7;;-1:-1:-1;;;82338:7:0;;;;82592:9;82584:38;;;;-1:-1:-1;;;82584:38:0;;15835:2:1;82584:38:0;;;15817:21:1;15874:2;15854:18;;;15847:30;-1:-1:-1;;;15893:18:1;;;15886:46;15949:18;;82584:38:0;15807:166:1;82584:38:0;83127:7:::1;:14:::0;;-1:-1:-1;;;;83127:14:0::1;-1:-1:-1::0;;;83127:14:0::1;::::0;;83157:20:::1;83164:12;25257:10:::0;;25177:98;5524;5582:7;5609:5;5613:1;5609;:5;:::i;:::-;5602:12;5524:98;-1:-1:-1;;;5524:98:0:o;6907:669::-;6979:7;7011:1;7007;:5;6999:34;;;;-1:-1:-1;;;6999:34:0;;18200:2:1;6999:34:0;;;18182:21:1;18239:2;18219:18;;;18212:30;-1:-1:-1;;;18258:18:1;;;18251:46;18314:18;;6999:34:0;18172:166:1;6999:34:0;7050:6;7046:20;;-1:-1:-1;7065:1:0;7058:8;;7046:20;7077:10;7090:5;7094:1;7090;:5;:::i;:::-;7077:18;-1:-1:-1;7120:1:0;7110:6;7115:1;7077:18;7110:6;:::i;:::-;:11;7106:107;;;7195:6;7200:1;7195:2;:6;:::i;:::-;7188:13;;;;;7106:107;7285:9;7297:5;7301:1;7297;:5;:::i;:::-;7285:17;-1:-1:-1;7313:9:0;7325:5;7329:1;7325;:5;:::i;:::-;7313:17;-1:-1:-1;7420:9:0;7432:5;7436:1;7432;:5;:::i;:::-;7420:17;-1:-1:-1;7448:9:0;7460:5;7464:1;7460;:5;:::i;:::-;7448:17;-1:-1:-1;7502:66:0;7552:15;7565:1;7552:8;:1;7448:17;7552:5;:8::i;:::-;:12;;:15::i;:::-;7502:45;7538:8;:1;7544;7538:5;:8::i;:::-;7502:31;7524:8;:1;7530;7524:5;:8::i;:::-;7503:15;7516:1;7503:8;:1;7509;7503:5;:8::i;:::-;:12;;:15::i;:::-;7502:21;;:31::i;:66::-;7495:73;6907:669;-1:-1:-1;;;;;;;;;6907:669:0:o;93332:278::-;93382:15;93428:25;:15;1065:14;;973:114;93428:25;93418:35;-1:-1:-1;93492:15:0;93505:2;88690:4;93492:15;:::i;:::-;-1:-1:-1;;;;;93482:25:0;:7;:25;93474:47;;;;-1:-1:-1;;;93474:47:0;;21964:2:1;93474:47:0;;;21946:21:1;22003:1;21983:18;;;21976:29;-1:-1:-1;;;22021:18:1;;;22014:39;22070:18;;93474:47:0;21936:158:1;93474:47:0;93532:27;:15;1184:19;;1202:1;1184:19;;;1095:127;93532:27;93572:30;93582:3;93587:5;93593:7;93587:14;;;;;;-1:-1:-1;;;93587:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93572:9;:30::i;80996:126::-;81078:36;;-1:-1:-1;;;81078:36:0;;-1:-1:-1;;;;;9351:32:1;;;81078:36:0;;;9333:51:1;81078:7:0;:15;;;;81101:6;;9306:18:1;;81078:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80996:126;;:::o;62480:315::-;62635:8;-1:-1:-1;;;;;62626:17:0;:5;-1:-1:-1;;;;;62626:17:0;;;62618:55;;;;-1:-1:-1;;;62618:55:0;;14283:2:1;62618:55:0;;;14265:21:1;14322:2;14302:18;;;14295:30;14361:27;14341:18;;;14334:55;14406:18;;62618:55:0;14255:175:1;62618:55:0;-1:-1:-1;;;;;62684:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;62684:46:0;;;;;;;;;;62746:41;;10826::1;;;62746::0;;10799:18:1;62746:41:0;;;;;;;62480:315;;;:::o;57390:::-;57547:28;57557:4;57563:2;57567:7;57547:9;:28::i;:::-;57594:48;57617:4;57623:2;57627:7;57636:5;57594:22;:48::i;:::-;57586:111;;;;-1:-1:-1;;;57586:111:0;;;;;;;:::i;49088:723::-;49144:13;49365:10;49361:53;;-1:-1:-1;;49392:10:0;;;;;;;;;;;;-1:-1:-1;;;49392:10:0;;;;;49088:723::o;49361:53::-;49439:5;49424:12;49480:78;49487:9;;49480:78;;49513:8;;;;:::i;:::-;;-1:-1:-1;49536:10:0;;-1:-1:-1;49544:2:0;49536:10;;:::i;:::-;;;49480:78;;;49568:19;49600:6;49590:17;;;;;;-1:-1:-1;;;49590:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49590:17:0;;49568:39;;49618:154;49625:10;;49618:154;;49652:11;49662:1;49652:11;;:::i;:::-;;-1:-1:-1;49721:10:0;49729:2;49721:5;:10;:::i;:::-;49708:24;;:2;:24;:::i;:::-;49695:39;;49678:6;49685;49678:14;;;;;;-1:-1:-1;;;49678:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;49678:56:0;;;;;;;;-1:-1:-1;49749:11:0;49758:2;49749:11;;:::i;:::-;;;49618:154;;71256:988;71522:22;71572:1;71547:22;71564:4;71547:16;:22::i;:::-;:26;;;;:::i;:::-;71584:18;71605:26;;;:17;:26;;;;;;71522:51;;-1:-1:-1;71738:28:0;;;71734:328;;-1:-1:-1;;;;;71805:18:0;;71783:19;71805:18;;;:12;:18;;;;;;;;:34;;;;;;;;;71856:30;;;;;;:44;;;71973:30;;:17;:30;;;;;:43;;;71734:328;-1:-1:-1;72158:26:0;;;;:17;:26;;;;;;;;72151:33;;;-1:-1:-1;;;;;72202:18:0;;;;;:12;:18;;;;;:34;;;;;;;72195:41;71256:988::o;72539:1079::-;72817:10;:17;72792:22;;72817:21;;72837:1;;72817:21;:::i;:::-;72849:18;72870:24;;;:15;:24;;;;;;73243:10;:26;;72792:46;;-1:-1:-1;72870:24:0;;72792:46;;73243:26;;;;-1:-1:-1;;;73243:26:0;;;;;;;;;;;;;;;;;73221:48;;73307:11;73282:10;73293;73282:22;;;;;;-1:-1:-1;;;73282:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;73387:28;;;:15;:28;;;;;;;:41;;;73559:24;;;;;73552:31;73594:10;:16;;;;;-1:-1:-1;;;73594:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;72539:1079;;;;:::o;70043:221::-;70128:14;70145:20;70162:2;70145:16;:20::i;:::-;-1:-1:-1;;;;;70176:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;70221:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;70043:221:0:o;52260:305::-;52362:4;-1:-1:-1;;;;;;52399:40:0;;-1:-1:-1;;;52399:40:0;;:105;;-1:-1:-1;;;;;;;52456:48:0;;-1:-1:-1;;;52456:48:0;52399:105;:158;;;-1:-1:-1;;;;;;;;;;26371:40:0;;;52521:36;26262:157;86990:155;87092:45;87119:4;87125:2;87129:7;87092:26;:45::i;5923:98::-;5981:7;6008:5;6012:1;6008;:5;:::i;4786:98::-;4844:7;4871:5;4875:1;4871;:5;:::i;59002:110::-;59078:26;59088:2;59092:7;59078:26;;;;;;;;;;;;:9;:26::i;63360:799::-;63515:4;-1:-1:-1;;;;;63536:13:0;;17515:19;:23;63532:620;;63572:72;;-1:-1:-1;;;63572:72:0;;-1:-1:-1;;;;;63572:36:0;;;;;:72;;25257:10;;63623:4;;63629:7;;63638:5;;63572:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63572:72:0;;;;;;;;-1:-1:-1;;63572:72:0;;;;;;;;;;;;:::i;:::-;;;63568:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63814:13:0;;63810:272;;63857:60;;-1:-1:-1;;;63857:60:0;;;;;;;:::i;63810:272::-;64032:6;64026:13;64017:6;64013:2;64009:15;64002:38;63568:529;-1:-1:-1;;;;;;63695:51:0;-1:-1:-1;;;63695:51:0;;-1:-1:-1;63688:58:0;;63532:620;-1:-1:-1;64136:4:0;63360:799;;;;;;:::o;59339:321::-;59469:18;59475:2;59479:7;59469:5;:18::i;:::-;59520:54;59551:1;59555:2;59559:7;59568:5;59520:22;:54::i;:::-;59498:154;;;;-1:-1:-1;;;59498:154:0;;;;;;;:::i;59996:439::-;-1:-1:-1;;;;;60076:16:0;;60068:61;;;;-1:-1:-1;;;60068:61:0;;17426:2:1;60068:61:0;;;17408:21:1;;;17445:18;;;17438:30;17504:34;17484:18;;;17477:62;17556:18;;60068:61:0;17398:182:1;60068:61:0;58083:4;58107:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58107:16:0;:30;60140:58;;;;-1:-1:-1;;;60140:58:0;;13521:2:1;60140:58:0;;;13503:21:1;13560:2;13540:18;;;13533:30;13599;13579:18;;;13572:58;13647:18;;60140:58:0;13493:178:1;60140:58:0;60211:45;60240:1;60244:2;60248:7;60211:20;:45::i;:::-;-1:-1:-1;;;;;60269:13:0;;;;;;:9;:13;;;;;:18;;60286:1;;60269:13;:18;;60286:1;;60269:18;:::i;:::-;;;;-1:-1:-1;;60298:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;60298:21:0;-1:-1:-1;;;;;60298:21:0;;;;;;;;60337:33;;60298:16;;;60337:33;;60298:16;;60337:33;92122:18:::1;92049:99:::0;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:395::-;713:8;723:6;777:3;770:4;762:6;758:17;754:27;744:2;;802:8;792;785:26;744:2;-1:-1:-1;832:20:1;;875:18;864:30;;861:2;;;914:8;904;897:26;861:2;958:4;950:6;946:17;934:29;;1018:3;1011:4;1001:6;998:1;994:14;986:6;982:27;978:38;975:47;972:2;;;1035:1;1032;1025:12;972:2;734:311;;;;;:::o;1050:257::-;1109:6;1162:2;1150:9;1141:7;1137:23;1133:32;1130:2;;;1183:6;1175;1168:22;1130:2;1227:9;1214:23;1246:31;1271:5;1246:31;:::i;1582:398::-;1650:6;1658;1711:2;1699:9;1690:7;1686:23;1682:32;1679:2;;;1732:6;1724;1717:22;1679:2;1776:9;1763:23;1795:31;1820:5;1795:31;:::i;:::-;1845:5;-1:-1:-1;1902:2:1;1887:18;;1874:32;1915:33;1874:32;1915:33;:::i;:::-;1967:7;1957:17;;;1669:311;;;;;:::o;1985:466::-;2062:6;2070;2078;2131:2;2119:9;2110:7;2106:23;2102:32;2099:2;;;2152:6;2144;2137:22;2099:2;2196:9;2183:23;2215:31;2240:5;2215:31;:::i;:::-;2265:5;-1:-1:-1;2322:2:1;2307:18;;2294:32;2335:33;2294:32;2335:33;:::i;:::-;2089:362;;2387:7;;-1:-1:-1;;;2441:2:1;2426:18;;;;2413:32;;2089:362::o;2456:824::-;2551:6;2559;2567;2575;2628:3;2616:9;2607:7;2603:23;2599:33;2596:2;;;2650:6;2642;2635:22;2596:2;2694:9;2681:23;2713:31;2738:5;2713:31;:::i;:::-;2763:5;-1:-1:-1;2820:2:1;2805:18;;2792:32;2833:33;2792:32;2833:33;:::i;:::-;2885:7;-1:-1:-1;2939:2:1;2924:18;;2911:32;;-1:-1:-1;2994:2:1;2979:18;;2966:32;3021:18;3010:30;;3007:2;;;3058:6;3050;3043:22;3007:2;3086:22;;3139:4;3131:13;;3127:27;-1:-1:-1;3117:2:1;;3173:6;3165;3158:22;3117:2;3201:73;3266:7;3261:2;3248:16;3243:2;3239;3235:11;3201:73;:::i;:::-;3191:83;;;2586:694;;;;;;;:::o;3285:436::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3476:9;3463:23;3495:31;3520:5;3495:31;:::i;:::-;3545:5;-1:-1:-1;3602:2:1;3587:18;;3574:32;3644:15;;3637:23;3625:36;;3615:2;;3680:6;3672;3665:22;3726:325;3794:6;3802;3855:2;3843:9;3834:7;3830:23;3826:32;3823:2;;;3876:6;3868;3861:22;3823:2;3920:9;3907:23;3939:31;3964:5;3939:31;:::i;:::-;3989:5;4041:2;4026:18;;;;4013:32;;-1:-1:-1;;;3813:238:1:o;4056:457::-;4142:6;4150;4203:2;4191:9;4182:7;4178:23;4174:32;4171:2;;;4224:6;4216;4209:22;4171:2;4269:9;4256:23;4302:18;4294:6;4291:30;4288:2;;;4339:6;4331;4324:22;4288:2;4383:70;4445:7;4436:6;4425:9;4421:22;4383:70;:::i;:::-;4472:8;;4357:96;;-1:-1:-1;4161:352:1;-1:-1:-1;;;;4161:352:1:o;4518:255::-;4576:6;4629:2;4617:9;4608:7;4604:23;4600:32;4597:2;;;4650:6;4642;4635:22;4597:2;4694:9;4681:23;4713:30;4737:5;4713:30;:::i;4778:259::-;4847:6;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4921:6;4913;4906:22;4868:2;4958:9;4952:16;4977:30;5001:5;4977:30;:::i;5042:480::-;5111:6;5164:2;5152:9;5143:7;5139:23;5135:32;5132:2;;;5185:6;5177;5170:22;5132:2;5230:9;5217:23;5263:18;5255:6;5252:30;5249:2;;;5300:6;5292;5285:22;5249:2;5328:22;;5381:4;5373:13;;5369:27;-1:-1:-1;5359:2:1;;5415:6;5407;5400:22;5359:2;5443:73;5508:7;5503:2;5490:16;5485:2;5481;5477:11;5443:73;:::i;5527:292::-;5585:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:2;;;5659:6;5651;5644:22;5606:2;5703:9;5690:23;5753:6;5746:5;5742:18;5735:5;5732:29;5722:2;;5780:6;5772;5765:22;5824:190;5883:6;5936:2;5924:9;5915:7;5911:23;5907:32;5904:2;;;5957:6;5949;5942:22;5904:2;-1:-1:-1;5985:23:1;;5894:120;-1:-1:-1;5894:120:1:o;6019:194::-;6089:6;6142:2;6130:9;6121:7;6117:23;6113:32;6110:2;;;6163:6;6155;6148:22;6110:2;-1:-1:-1;6191:16:1;;6100:113;-1:-1:-1;6100:113:1:o;6218:623::-;6310:6;6318;6326;6379:2;6367:9;6358:7;6354:23;6350:32;6347:2;;;6400:6;6392;6385:22;6347:2;6444:9;6431:23;6494:4;6487:5;6483:16;6476:5;6473:27;6463:2;;6519:6;6511;6504:22;6463:2;6547:5;-1:-1:-1;6603:2:1;6588:18;;6575:32;6630:18;6619:30;;6616:2;;;6667:6;6659;6652:22;6616:2;6711:70;6773:7;6764:6;6753:9;6749:22;6711:70;:::i;:::-;6337:504;;6800:8;;-1:-1:-1;6685:96:1;;-1:-1:-1;;;;6337:504:1:o;6846:257::-;6887:3;6925:5;6919:12;6952:6;6947:3;6940:19;6968:63;7024:6;7017:4;7012:3;7008:14;7001:4;6994:5;6990:16;6968:63;:::i;:::-;7085:2;7064:15;-1:-1:-1;;7060:29:1;7051:39;;;;7092:4;7047:50;;6895:208;-1:-1:-1;;6895:208:1:o;7108:185::-;7150:3;7188:5;7182:12;7203:52;7248:6;7243:3;7236:4;7229:5;7225:16;7203:52;:::i;:::-;7271:16;;;;;7158:135;-1:-1:-1;;7158:135:1:o;7535:1437::-;7913:3;7942;7977:6;7971:13;8007:3;8029:1;8057:9;8053:2;8049:18;8039:28;;8117:2;8106:9;8102:18;8139;8129:2;;8183:4;8175:6;8171:17;8161:27;;8129:2;8209;8257;8249:6;8246:14;8226:18;8223:38;8220:2;;;-1:-1:-1;;;8284:33:1;;8340:4;8337:1;8330:15;8370:4;8291:3;8358:17;8220:2;8401:18;8428:104;;;;8546:1;8541:322;;;;8394:469;;8428:104;-1:-1:-1;;8461:24:1;;8449:37;;8506:16;;;;-1:-1:-1;8428:104:1;;8541:322;22940:4;22959:17;;;23009:4;22993:21;;8636:3;8652:165;8666:6;8663:1;8660:13;8652:165;;;8744:14;;8731:11;;;8724:35;8787:16;;;;8681:10;;8652:165;;;8656:3;;8846:6;8841:3;8837:16;8830:23;;8394:469;;;;;;;8879:87;8904:61;8930:34;8960:3;-1:-1:-1;;;7481:16:1;;7522:1;7513:11;;7471:59;8930:34;8922:6;8904:61;:::i;:::-;-1:-1:-1;;;7358:20:1;;7403:1;7394:11;;7348:63;8879:87;8872:94;7921:1051;-1:-1:-1;;;;;7921:1051:1:o;9619:488::-;-1:-1:-1;;;;;9888:15:1;;;9870:34;;9940:15;;9935:2;9920:18;;9913:43;9987:2;9972:18;;9965:34;;;10035:3;10030:2;10015:18;;10008:31;;;9813:4;;10056:45;;10081:19;;10073:6;10056:45;:::i;:::-;10048:53;9822:285;-1:-1:-1;;;;;;9822:285:1:o;11102:219::-;11251:2;11240:9;11233:21;11214:4;11271:44;11311:2;11300:9;11296:18;11288:6;11271:44;:::i;12087:414::-;12289:2;12271:21;;;12328:2;12308:18;;;12301:30;12367:34;12362:2;12347:18;;12340:62;-1:-1:-1;;;12433:2:1;12418:18;;12411:48;12491:3;12476:19;;12261:240::o;18343:356::-;18545:2;18527:21;;;18564:18;;;18557:30;18623:34;18618:2;18603:18;;18596:62;18690:2;18675:18;;18517:182::o;19522:413::-;19724:2;19706:21;;;19763:2;19743:18;;;19736:30;19802:34;19797:2;19782:18;;19775:62;-1:-1:-1;;;19868:2:1;19853:18;;19846:47;19925:3;19910:19;;19696:239::o;23025:128::-;23065:3;23096:1;23092:6;23089:1;23086:13;23083:2;;;23102:18;;:::i;:::-;-1:-1:-1;23138:9:1;;23073:80::o;23158:204::-;23196:3;23232:4;23229:1;23225:12;23264:4;23261:1;23257:12;23299:3;23293:4;23289:14;23284:3;23281:23;23278:2;;;23307:18;;:::i;:::-;23343:13;;23204:158;-1:-1:-1;;;23204:158:1:o;23367:120::-;23407:1;23433;23423:2;;23438:18;;:::i;:::-;-1:-1:-1;23472:9:1;;23413:74::o;23492:168::-;23532:7;23598:1;23594;23590:6;23586:14;23583:1;23580:21;23575:1;23568:9;23561:17;23557:45;23554:2;;;23605:18;;:::i;:::-;-1:-1:-1;23645:9:1;;23544:116::o;23665:246::-;23705:4;-1:-1:-1;;;;;23818:10:1;;;;23788;;23840:12;;;23837:2;;;23855:18;;:::i;:::-;23892:13;;23714:197;-1:-1:-1;;;23714:197:1:o;23916:125::-;23956:4;23984:1;23981;23978:8;23975:2;;;23989:18;;:::i;:::-;-1:-1:-1;24026:9:1;;23965:76::o;24046:258::-;24118:1;24128:113;24142:6;24139:1;24136:13;24128:113;;;24218:11;;;24212:18;24199:11;;;24192:39;24164:2;24157:10;24128:113;;;24259:6;24256:1;24253:13;24250:2;;;-1:-1:-1;;24294:1:1;24276:16;;24269:27;24099:205::o;24309:380::-;24388:1;24384:12;;;;24431;;;24452:2;;24506:4;24498:6;24494:17;24484:27;;24452:2;24559;24551:6;24548:14;24528:18;24525:38;24522:2;;;24605:10;24600:3;24596:20;24593:1;24586:31;24640:4;24637:1;24630:15;24668:4;24665:1;24658:15;24522:2;;24364:325;;;:::o;24694:135::-;24733:3;-1:-1:-1;;24754:17:1;;24751:2;;;24774:18;;:::i;:::-;-1:-1:-1;24821:1:1;24810:13;;24741:88::o;24834:112::-;24866:1;24892;24882:2;;24897:18;;:::i;:::-;-1:-1:-1;24931:9:1;;24872:74::o;24951:127::-;25012:10;25007:3;25003:20;25000:1;24993:31;25043:4;25040:1;25033:15;25067:4;25064:1;25057:15;25083:127;25144:10;25139:3;25135:20;25132:1;25125:31;25175:4;25172:1;25165:15;25199:4;25196:1;25189:15;25215:127;25276:10;25271:3;25267:20;25264:1;25257:31;25307:4;25304:1;25297:15;25331:4;25328:1;25321:15;25347:131;-1:-1:-1;;;;;25422:31:1;;25412:42;;25402:2;;25468:1;25465;25458:12;25483:131;-1:-1:-1;;;;;;25557:32:1;;25547:43;;25537:2;;25604:1;25601;25594:12
Swarm Source
ipfs://97aaf8330e2b679c3d08b05923d025844a488ff53c65b2f148c20b20172688e8
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.