More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 735 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 16184859 | 2 days ago | IN | 75 CRO | 0.47975 | ||||
Mint | 16184269 | 2 days ago | IN | 25 CRO | 0.47975 | ||||
Mint | 16184266 | 2 days ago | IN | 250 CRO | 0.47975 | ||||
Mint | 16184264 | 2 days ago | IN | 250 CRO | 0.47975 | ||||
Mint | 16184157 | 2 days ago | IN | 75 CRO | 0.47975 | ||||
Mint | 16171026 | 3 days ago | IN | 50 CRO | 0.47946927 | ||||
Mint | 16156352 | 4 days ago | IN | 100 CRO | 0.47975 | ||||
Withdrawfunds | 16135618 | 5 days ago | IN | 0 CRO | 0.15365614 | ||||
Mint | 16135355 | 5 days ago | IN | 500 CRO | 0.5155141 | ||||
Withdrawfunds | 16135202 | 5 days ago | IN | 0 CRO | 0.1522538 | ||||
Mint | 16134976 | 5 days ago | IN | 500 CRO | 0.5155141 | ||||
Set Approval For... | 16116647 | 6 days ago | IN | 0 CRO | 0.23590065 | ||||
Mint | 16116635 | 6 days ago | IN | 500 CRO | 0.5155141 | ||||
Mint | 16116250 | 6 days ago | IN | 500 CRO | 0.5155141 | ||||
Mint | 16116220 | 6 days ago | IN | 500 CRO | 0.6018691 | ||||
Mint | 16113947 | 7 days ago | IN | 250 CRO | 0.47975 | ||||
Mint | 16113942 | 7 days ago | IN | 250 CRO | 0.47975 | ||||
Mint | 16113932 | 7 days ago | IN | 250 CRO | 0.47975 | ||||
Mint | 16110273 | 7 days ago | IN | 100 CRO | 0.47975 | ||||
Mint | 16105699 | 7 days ago | IN | 125 CRO | 0.47975 | ||||
Withdrawfunds | 16088949 | 8 days ago | IN | 0 CRO | 0.15365614 | ||||
Freemint | 16088895 | 8 days ago | IN | 0 CRO | 0.35776843 | ||||
Mint | 16084204 | 9 days ago | IN | 100 CRO | 0.47975 | ||||
Mint | 16082513 | 9 days ago | IN | 375 CRO | 0.47975 | ||||
Freemint | 16064905 | 10 days ago | IN | 0 CRO | 0.83675353 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16135618 | 5 days ago | 500 CRO | ||||
16135202 | 5 days ago | 2,975 CRO | ||||
16088949 | 8 days ago | 575 CRO | ||||
16002676 | 14 days ago | 1,275 CRO | ||||
15954003 | 17 days ago | 350 CRO | ||||
15813624 | 26 days ago | 650 CRO | ||||
15783244 | 28 days ago | 100 CRO | ||||
15540391 | 44 days ago | 550 CRO | ||||
15402050 | 53 days ago | 325 CRO | ||||
15149320 | 70 days ago | 300 CRO | ||||
14952366 | 83 days ago | 150 CRO | ||||
14898040 | 86 days ago | 400 CRO | ||||
14812542 | 92 days ago | 850 CRO | ||||
14454029 | 115 days ago | 150 CRO | ||||
14393670 | 119 days ago | 550 CRO | ||||
13880028 | 153 days ago | 125 CRO | ||||
13824948 | 157 days ago | 275 CRO | ||||
13594064 | 172 days ago | 75 CRO | ||||
13563369 | 174 days ago | 100 CRO | ||||
13517562 | 177 days ago | 150 CRO | ||||
13457604 | 181 days ago | 550 CRO | ||||
13393158 | 185 days ago | 875 CRO | ||||
13376755 | 186 days ago | 450 CRO | ||||
13345442 | 188 days ago | 1,875 CRO | ||||
13125370 | 203 days ago | 200 CRO |
Loading...
Loading
Contract Name:
StandardERC721A
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./ERC721Enumerable.sol"; import "./ERC721A.sol"; /** * @title NFT Sale with bulk mint discount * @author Breakthrough Labs Inc. * @notice NFT, Sale, ERC721, ERC721A * @custom:version 1.0.9 * @custom:address 15 * @custom:default-precision 0 * @custom:simple-description An NFT with a built in sale that provides bulk minting discounts. * When minting multiple NFTs, gas costs are reduced compared to a normal NFT contract. * @dev ERC721A NFT with the following features: * * - Built-in sale with an adjustable price. * - Reserve function for the owner to mint free NFTs. * - Fixed maximum supply. * - Reduced Gas costs when minting many NFTs at the same time. * */ contract StandardERC721A is ERC721A, Ownable { bool public saleIsActive = true; string private _baseURIextended; uint256 public immutable MAX_SUPPLY; /// @custom:precision 18 uint256 public currentPrice; uint256 public walletLimit; /** * @param _name NFT Name * @param _symbol NFT Symbol * @param _uri Token URI used for metadata * @param price Initial Price | precision:18 * @param maxSupply Maximum # of NFTs */ constructor( string memory _name, string memory _symbol, string memory _uri, uint256 price, uint256 maxSupply ) payable ERC721A(_name, _symbol) { _baseURIextended = _uri; currentPrice = price; MAX_SUPPLY = maxSupply; } /** * @dev An external method for users to purchase and mint NFTs. Requires that the sale * is active, that the minted NFTs will not exceed the `MAX_SUPPLY`, and that a * sufficient payable value is sent. * @param amount The number of NFTs to mint. */ function mint(uint256 amount) external payable { uint256 ts = totalSupply(); require(saleIsActive, "Sale must be active to mint tokens"); require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens"); require( currentPrice * amount == msg.value, "Value sent is not correct" ); _safeMint(msg.sender, amount); } /** * @dev A way for the owner to reserve a specifc number of NFTs without having to * interact with the sale. * @param to The address to send reserved NFTs to. * @param amount The number of NFTs to reserve. */ function freemint(address to, uint256 amount) external onlyOwner { uint256 ts = totalSupply(); require(ts + amount <= MAX_SUPPLY, "free minting would exceed max tokens"); _safeMint(to, amount); } /** * @dev A way for the owner to withdraw all proceeds from the sale. */ function withdrawfunds() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } /** * @dev Sets whether or not the NFT sale is active. * @param isActive Whether or not the sale will be active. */ function pauseMints(bool isActive) external onlyOwner { saleIsActive = isActive; } /** * @dev Sets the price of each NFT during the initial sale. * @param price The price of each NFT during the initial sale | precision:18 */ function setCurrentPrice(uint256 price) external onlyOwner { currentPrice = price; } /** * @dev Updates the baseURI that will be used to retrieve NFT metadata. * @param baseURI_ The baseURI to be used. */ function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // 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; } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if ( to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if ( !_checkContractOnERC721Received( address(0), to, updatedIndex++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // 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); }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
/* ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██ ██ ██████ ██████ ██████ ██ ██ ██ ██████ ███████ ████ Find any smart contract, and build your project faster: https://www.cookbook.dev Twitter: https://twitter.com/cookbook_dev Discord: https://discord.gg/WzsfPcfHrk Find this contract on Cookbook: https://www.cookbook.dev/contracts/Azuki-ERC721A-NFT-Sale-basic/?utm=code */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"pauseMints","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCurrentPrice","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":"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":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawfunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526001600860146101000a81548160ff0219169083151502179055506040516200377a3803806200377a8339818101604052810190620000449190620002fb565b848481600290805190602001906200005e929190620001b6565b50806003908051906020019062000077929190620001b6565b5062000088620000e360201b60201c565b6000819055505050620000b0620000a4620000e860201b60201c565b620000f060201b60201c565b8260099080519060200190620000c8929190620001b6565b5081600a819055508060808181525050505050505062000588565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c4906200047f565b90600052602060002090601f016020900481019282620001e8576000855562000234565b82601f106200020357805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023357825182559160200191906001019062000216565b5b50905062000243919062000247565b5090565b5b808211156200026257600081600090555060010162000248565b5090565b60006200027d620002778462000409565b620003e0565b9050828152602081018484840111156200029c576200029b6200054e565b5b620002a984828562000449565b509392505050565b600082601f830112620002c957620002c862000549565b5b8151620002db84826020860162000266565b91505092915050565b600081519050620002f5816200056e565b92915050565b600080600080600060a086880312156200031a576200031962000558565b5b600086015167ffffffffffffffff8111156200033b576200033a62000553565b5b6200034988828901620002b1565b955050602086015167ffffffffffffffff8111156200036d576200036c62000553565b5b6200037b88828901620002b1565b945050604086015167ffffffffffffffff8111156200039f576200039e62000553565b5b620003ad88828901620002b1565b9350506060620003c088828901620002e4565b9250506080620003d388828901620002e4565b9150509295509295909350565b6000620003ec620003ff565b9050620003fa8282620004b5565b919050565b6000604051905090565b600067ffffffffffffffff8211156200042757620004266200051a565b5b62000432826200055d565b9050602081019050919050565b6000819050919050565b60005b83811015620004695780820151818401526020810190506200044c565b8381111562000479576000848401525b50505050565b600060028204905060018216806200049857607f821691505b60208210811415620004af57620004ae620004eb565b5b50919050565b620004c0826200055d565b810181811067ffffffffffffffff82111715620004e257620004e16200051a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000579816200043f565b81146200058557600080fd5b50565b6080516131c8620005b26000396000818161074301528181610a120152610d1101526131c86000f3fe60806040526004361061019c5760003560e01c80636c343ffe116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461057d578063e985e9c5146105ba578063eb8d2444146105f7578063f2fde38b146106225761019c565b8063a0712d681461050f578063a22cb4651461052b578063b88d4fde146105545761019c565b80638da5cb5b116100c65780638da5cb5b1461046557806395d89b41146104905780639d1b464a146104bb578063a0000d8a146104e65761019c565b80636c343ffe146103fa57806370a0823114610411578063715018a61461044e5761019c565b806318b20071116101595780633c8463a1116101335780633c8463a11461034057806342842e0e1461036b57806355f804b3146103945780636352211e146103bd5761019c565b806318b20071146102c357806323b872dd146102ec57806332cb6b0c146103155761019c565b806301ffc9a7146101a157806303750983146101de57806306fdde0314610207578063081812fc14610232578063095ea7b31461026f57806318160ddd14610298575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612737565b61064b565b6040516101d59190612a34565b60405180910390f35b3480156101ea57600080fd5b50610205600480360381019061020091906126ca565b61072d565b005b34801561021357600080fd5b5061021c6107be565b6040516102299190612a4f565b60405180910390f35b34801561023e57600080fd5b50610259600480360381019061025491906127da565b610850565b60405161026691906129cd565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906126ca565b6108cc565b005b3480156102a457600080fd5b506102ad6109d7565b6040516102ba9190612b31565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906127da565b6109ee565b005b3480156102f857600080fd5b50610313600480360381019061030e91906125b4565b610a00565b005b34801561032157600080fd5b5061032a610a10565b6040516103379190612b31565b60405180910390f35b34801561034c57600080fd5b50610355610a34565b6040516103629190612b31565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906125b4565b610a3a565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612791565b610a5a565b005b3480156103c957600080fd5b506103e460048036038101906103df91906127da565b610a7c565b6040516103f191906129cd565b60405180910390f35b34801561040657600080fd5b5061040f610a92565b005b34801561041d57600080fd5b5061043860048036038101906104339190612547565b610ae9565b6040516104459190612b31565b60405180910390f35b34801561045a57600080fd5b50610463610bb9565b005b34801561047157600080fd5b5061047a610bcd565b60405161048791906129cd565b60405180910390f35b34801561049c57600080fd5b506104a5610bf7565b6040516104b29190612a4f565b60405180910390f35b3480156104c757600080fd5b506104d0610c89565b6040516104dd9190612b31565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061270a565b610c8f565b005b610529600480360381019061052491906127da565b610cb4565b005b34801561053757600080fd5b50610552600480360381019061054d919061268a565b610dda565b005b34801561056057600080fd5b5061057b60048036038101906105769190612607565b610f52565b005b34801561058957600080fd5b506105a4600480360381019061059f91906127da565b610fce565b6040516105b19190612a4f565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190612574565b61106d565b6040516105ee9190612a34565b60405180910390f35b34801561060357600080fd5b5061060c611101565b6040516106199190612a34565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190612547565b611114565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610726575061072582611198565b5b9050919050565b610735611202565b600061073f6109d7565b90507f0000000000000000000000000000000000000000000000000000000000000000828261076e9190612c16565b11156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690612a71565b60405180910390fd5b6107b98383611280565b505050565b6060600280546107cd90612de1565b80601f01602080910402602001604051908101604052809291908181526020018280546107f990612de1565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b5050505050905090565b600061085b8261129e565b610891576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d782610a7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095e6112ec565b73ffffffffffffffffffffffffffffffffffffffff1614158015610990575061098e816109896112ec565b61106d565b155b156109c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d28383836112f4565b505050565b60006109e16113a6565b6001546000540303905090565b6109f6611202565b80600a8190555050565b610a0b8383836113ab565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b5481565b610a5583838360405180602001604052806000815250610f52565b505050565b610a62611202565b8060099080519060200190610a78929190612318565b5050565b6000610a8782611861565b600001519050919050565b610a9a611202565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ae5573d6000803e3d6000fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b51576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bc1611202565b610bcb6000611af0565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c0690612de1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3290612de1565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b600a5481565b610c97611202565b80600860146101000a81548160ff02191690831515021790555050565b6000610cbe6109d7565b9050600860149054906101000a900460ff16610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690612b11565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008282610d3c9190612c16565b1115610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490612ab1565b60405180910390fd5b3482600a54610d8c9190612c9d565b14610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390612ad1565b60405180910390fd5b610dd63383611280565b5050565b610de26112ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e47576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e546112ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f016112ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f469190612a34565b60405180910390a35050565b610f5d8484846113ab565b610f7c8373ffffffffffffffffffffffffffffffffffffffff16611bb6565b8015610f915750610f8f84848484611bd9565b155b15610fc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610fd98261129e565b61100f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611019611d39565b905060008151141561103a5760405180602001604052806000815250611065565b8061104484611dcb565b6040516020016110559291906129a9565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860149054906101000a900460ff1681565b61111c611202565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390612a91565b60405180910390fd5b61119581611af0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61120a6112ec565b73ffffffffffffffffffffffffffffffffffffffff16611228610bcd565b73ffffffffffffffffffffffffffffffffffffffff161461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612af1565b60405180910390fd5b565b61129a828260405180602001604052806000815250611f2c565b5050565b6000816112a96113a6565b111580156112b8575060005482105b80156112e5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006113b682611861565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611421576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114426112ec565b73ffffffffffffffffffffffffffffffffffffffff16148061147157506114708561146b6112ec565b61106d565b5b806114b6575061147f6112ec565b73ffffffffffffffffffffffffffffffffffffffff1661149e84610850565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806114ef576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611556576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115638585856001611f3e565b61156f600084876112f4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156117ef5760005482146117ee57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461185a8585856001611f44565b5050505050565b61186961239e565b6000829050806118776113a6565b11158015611886575060005481105b15611ab9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611ab757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461199b578092505050611aeb565b5b600115611ab657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ab1578092505050611aeb565b61199c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bff6112ec565b8786866040518563ffffffff1660e01b8152600401611c2194939291906129e8565b602060405180830381600087803b158015611c3b57600080fd5b505af1925050508015611c6c57506040513d601f19601f82011682018060405250810190611c699190612764565b60015b611ce6573d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b50600081511415611cde576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611d4890612de1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7490612de1565b8015611dc15780601f10611d9657610100808354040283529160200191611dc1565b820191906000526020600020905b815481529060010190602001808311611da457829003601f168201915b5050505050905090565b60606000821415611e13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f27565b600082905060005b60008214611e45578080611e2e90612e44565b915050600a82611e3e9190612c6c565b9150611e1b565b60008167ffffffffffffffff811115611e6157611e60612f7a565b5b6040519080825280601f01601f191660200182016040528015611e935781602001600182028036833780820191505090505b5090505b60008514611f2057600182611eac9190612cf7565b9150600a85611ebb9190612e8d565b6030611ec79190612c16565b60f81b818381518110611edd57611edc612f4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f199190612c6c565b9450611e97565b8093505050505b919050565b611f398383836001611f4a565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fb7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415611ff2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fff6000868387611f3e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156121c957506121c88773ffffffffffffffffffffffffffffffffffffffff16611bb6565b5b1561228f575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461223e6000888480600101955088611bd9565b612274576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156121cf57826000541461228a57600080fd5b6122fb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612290575b8160008190555050506123116000868387611f44565b5050505050565b82805461232490612de1565b90600052602060002090601f016020900481019282612346576000855561238d565b82601f1061235f57805160ff191683800117855561238d565b8280016001018555821561238d579182015b8281111561238c578251825591602001919060010190612371565b5b50905061239a91906123e1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156123fa5760008160009055506001016123e2565b5090565b600061241161240c84612b71565b612b4c565b90508281526020810184848401111561242d5761242c612fae565b5b612438848285612d9f565b509392505050565b600061245361244e84612ba2565b612b4c565b90508281526020810184848401111561246f5761246e612fae565b5b61247a848285612d9f565b509392505050565b60008135905061249181613136565b92915050565b6000813590506124a68161314d565b92915050565b6000813590506124bb81613164565b92915050565b6000815190506124d081613164565b92915050565b600082601f8301126124eb576124ea612fa9565b5b81356124fb8482602086016123fe565b91505092915050565b600082601f83011261251957612518612fa9565b5b8135612529848260208601612440565b91505092915050565b6000813590506125418161317b565b92915050565b60006020828403121561255d5761255c612fb8565b5b600061256b84828501612482565b91505092915050565b6000806040838503121561258b5761258a612fb8565b5b600061259985828601612482565b92505060206125aa85828601612482565b9150509250929050565b6000806000606084860312156125cd576125cc612fb8565b5b60006125db86828701612482565b93505060206125ec86828701612482565b92505060406125fd86828701612532565b9150509250925092565b6000806000806080858703121561262157612620612fb8565b5b600061262f87828801612482565b945050602061264087828801612482565b935050604061265187828801612532565b925050606085013567ffffffffffffffff81111561267257612671612fb3565b5b61267e878288016124d6565b91505092959194509250565b600080604083850312156126a1576126a0612fb8565b5b60006126af85828601612482565b92505060206126c085828601612497565b9150509250929050565b600080604083850312156126e1576126e0612fb8565b5b60006126ef85828601612482565b925050602061270085828601612532565b9150509250929050565b6000602082840312156127205761271f612fb8565b5b600061272e84828501612497565b91505092915050565b60006020828403121561274d5761274c612fb8565b5b600061275b848285016124ac565b91505092915050565b60006020828403121561277a57612779612fb8565b5b6000612788848285016124c1565b91505092915050565b6000602082840312156127a7576127a6612fb8565b5b600082013567ffffffffffffffff8111156127c5576127c4612fb3565b5b6127d184828501612504565b91505092915050565b6000602082840312156127f0576127ef612fb8565b5b60006127fe84828501612532565b91505092915050565b61281081612d2b565b82525050565b61281f81612d3d565b82525050565b600061283082612bd3565b61283a8185612be9565b935061284a818560208601612dae565b61285381612fbd565b840191505092915050565b600061286982612bde565b6128738185612bfa565b9350612883818560208601612dae565b61288c81612fbd565b840191505092915050565b60006128a282612bde565b6128ac8185612c0b565b93506128bc818560208601612dae565b80840191505092915050565b60006128d5602483612bfa565b91506128e082612fce565b604082019050919050565b60006128f8602683612bfa565b91506129038261301d565b604082019050919050565b600061291b602083612bfa565b91506129268261306c565b602082019050919050565b600061293e601983612bfa565b915061294982613095565b602082019050919050565b6000612961602083612bfa565b915061296c826130be565b602082019050919050565b6000612984602283612bfa565b915061298f826130e7565b604082019050919050565b6129a381612d95565b82525050565b60006129b58285612897565b91506129c18284612897565b91508190509392505050565b60006020820190506129e26000830184612807565b92915050565b60006080820190506129fd6000830187612807565b612a0a6020830186612807565b612a17604083018561299a565b8181036060830152612a298184612825565b905095945050505050565b6000602082019050612a496000830184612816565b92915050565b60006020820190508181036000830152612a69818461285e565b905092915050565b60006020820190508181036000830152612a8a816128c8565b9050919050565b60006020820190508181036000830152612aaa816128eb565b9050919050565b60006020820190508181036000830152612aca8161290e565b9050919050565b60006020820190508181036000830152612aea81612931565b9050919050565b60006020820190508181036000830152612b0a81612954565b9050919050565b60006020820190508181036000830152612b2a81612977565b9050919050565b6000602082019050612b46600083018461299a565b92915050565b6000612b56612b67565b9050612b628282612e13565b919050565b6000604051905090565b600067ffffffffffffffff821115612b8c57612b8b612f7a565b5b612b9582612fbd565b9050602081019050919050565b600067ffffffffffffffff821115612bbd57612bbc612f7a565b5b612bc682612fbd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c2182612d95565b9150612c2c83612d95565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6157612c60612ebe565b5b828201905092915050565b6000612c7782612d95565b9150612c8283612d95565b925082612c9257612c91612eed565b5b828204905092915050565b6000612ca882612d95565b9150612cb383612d95565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cec57612ceb612ebe565b5b828202905092915050565b6000612d0282612d95565b9150612d0d83612d95565b925082821015612d2057612d1f612ebe565b5b828203905092915050565b6000612d3682612d75565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612dcc578082015181840152602081019050612db1565b83811115612ddb576000848401525b50505050565b60006002820490506001821680612df957607f821691505b60208210811415612e0d57612e0c612f1c565b5b50919050565b612e1c82612fbd565b810181811067ffffffffffffffff82111715612e3b57612e3a612f7a565b5b80604052505050565b6000612e4f82612d95565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8257612e81612ebe565b5b600182019050919050565b6000612e9882612d95565b9150612ea383612d95565b925082612eb357612eb2612eed565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f66726565206d696e74696e6720776f756c6420657863656564206d617820746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b61313f81612d2b565b811461314a57600080fd5b50565b61315681612d3d565b811461316157600080fd5b50565b61316d81612d49565b811461317857600080fd5b50565b61318481612d95565b811461318f57600080fd5b5056fea26469706673582212201514b37ca486ae93b68f27ca63b701629a8166a0c64dad3939271fdb16d2fd1d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000015af1d78b58c400000000000000000000000000000000000000000000000000000000000000000bb9000000000000000000000000000000000000000000000000000000000000000e5363726170204d6f6e7374657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c53435241504d4f4e535445520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696879366a337364747a3567346272666c6536656c3378697a376d73776b7966787a766b736a6e6d67727372376d61746c326462792f00000000000000
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636c343ffe116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461057d578063e985e9c5146105ba578063eb8d2444146105f7578063f2fde38b146106225761019c565b8063a0712d681461050f578063a22cb4651461052b578063b88d4fde146105545761019c565b80638da5cb5b116100c65780638da5cb5b1461046557806395d89b41146104905780639d1b464a146104bb578063a0000d8a146104e65761019c565b80636c343ffe146103fa57806370a0823114610411578063715018a61461044e5761019c565b806318b20071116101595780633c8463a1116101335780633c8463a11461034057806342842e0e1461036b57806355f804b3146103945780636352211e146103bd5761019c565b806318b20071146102c357806323b872dd146102ec57806332cb6b0c146103155761019c565b806301ffc9a7146101a157806303750983146101de57806306fdde0314610207578063081812fc14610232578063095ea7b31461026f57806318160ddd14610298575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612737565b61064b565b6040516101d59190612a34565b60405180910390f35b3480156101ea57600080fd5b50610205600480360381019061020091906126ca565b61072d565b005b34801561021357600080fd5b5061021c6107be565b6040516102299190612a4f565b60405180910390f35b34801561023e57600080fd5b50610259600480360381019061025491906127da565b610850565b60405161026691906129cd565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906126ca565b6108cc565b005b3480156102a457600080fd5b506102ad6109d7565b6040516102ba9190612b31565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906127da565b6109ee565b005b3480156102f857600080fd5b50610313600480360381019061030e91906125b4565b610a00565b005b34801561032157600080fd5b5061032a610a10565b6040516103379190612b31565b60405180910390f35b34801561034c57600080fd5b50610355610a34565b6040516103629190612b31565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906125b4565b610a3a565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612791565b610a5a565b005b3480156103c957600080fd5b506103e460048036038101906103df91906127da565b610a7c565b6040516103f191906129cd565b60405180910390f35b34801561040657600080fd5b5061040f610a92565b005b34801561041d57600080fd5b5061043860048036038101906104339190612547565b610ae9565b6040516104459190612b31565b60405180910390f35b34801561045a57600080fd5b50610463610bb9565b005b34801561047157600080fd5b5061047a610bcd565b60405161048791906129cd565b60405180910390f35b34801561049c57600080fd5b506104a5610bf7565b6040516104b29190612a4f565b60405180910390f35b3480156104c757600080fd5b506104d0610c89565b6040516104dd9190612b31565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061270a565b610c8f565b005b610529600480360381019061052491906127da565b610cb4565b005b34801561053757600080fd5b50610552600480360381019061054d919061268a565b610dda565b005b34801561056057600080fd5b5061057b60048036038101906105769190612607565b610f52565b005b34801561058957600080fd5b506105a4600480360381019061059f91906127da565b610fce565b6040516105b19190612a4f565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190612574565b61106d565b6040516105ee9190612a34565b60405180910390f35b34801561060357600080fd5b5061060c611101565b6040516106199190612a34565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190612547565b611114565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610726575061072582611198565b5b9050919050565b610735611202565b600061073f6109d7565b90507f0000000000000000000000000000000000000000000000000000000000000bb9828261076e9190612c16565b11156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690612a71565b60405180910390fd5b6107b98383611280565b505050565b6060600280546107cd90612de1565b80601f01602080910402602001604051908101604052809291908181526020018280546107f990612de1565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b5050505050905090565b600061085b8261129e565b610891576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d782610a7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095e6112ec565b73ffffffffffffffffffffffffffffffffffffffff1614158015610990575061098e816109896112ec565b61106d565b155b156109c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d28383836112f4565b505050565b60006109e16113a6565b6001546000540303905090565b6109f6611202565b80600a8190555050565b610a0b8383836113ab565b505050565b7f0000000000000000000000000000000000000000000000000000000000000bb981565b600b5481565b610a5583838360405180602001604052806000815250610f52565b505050565b610a62611202565b8060099080519060200190610a78929190612318565b5050565b6000610a8782611861565b600001519050919050565b610a9a611202565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ae5573d6000803e3d6000fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b51576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bc1611202565b610bcb6000611af0565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c0690612de1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3290612de1565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b600a5481565b610c97611202565b80600860146101000a81548160ff02191690831515021790555050565b6000610cbe6109d7565b9050600860149054906101000a900460ff16610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690612b11565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000bb98282610d3c9190612c16565b1115610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490612ab1565b60405180910390fd5b3482600a54610d8c9190612c9d565b14610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390612ad1565b60405180910390fd5b610dd63383611280565b5050565b610de26112ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e47576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e546112ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f016112ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f469190612a34565b60405180910390a35050565b610f5d8484846113ab565b610f7c8373ffffffffffffffffffffffffffffffffffffffff16611bb6565b8015610f915750610f8f84848484611bd9565b155b15610fc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610fd98261129e565b61100f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611019611d39565b905060008151141561103a5760405180602001604052806000815250611065565b8061104484611dcb565b6040516020016110559291906129a9565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860149054906101000a900460ff1681565b61111c611202565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390612a91565b60405180910390fd5b61119581611af0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61120a6112ec565b73ffffffffffffffffffffffffffffffffffffffff16611228610bcd565b73ffffffffffffffffffffffffffffffffffffffff161461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612af1565b60405180910390fd5b565b61129a828260405180602001604052806000815250611f2c565b5050565b6000816112a96113a6565b111580156112b8575060005482105b80156112e5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006113b682611861565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611421576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114426112ec565b73ffffffffffffffffffffffffffffffffffffffff16148061147157506114708561146b6112ec565b61106d565b5b806114b6575061147f6112ec565b73ffffffffffffffffffffffffffffffffffffffff1661149e84610850565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806114ef576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611556576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115638585856001611f3e565b61156f600084876112f4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156117ef5760005482146117ee57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461185a8585856001611f44565b5050505050565b61186961239e565b6000829050806118776113a6565b11158015611886575060005481105b15611ab9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611ab757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461199b578092505050611aeb565b5b600115611ab657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ab1578092505050611aeb565b61199c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bff6112ec565b8786866040518563ffffffff1660e01b8152600401611c2194939291906129e8565b602060405180830381600087803b158015611c3b57600080fd5b505af1925050508015611c6c57506040513d601f19601f82011682018060405250810190611c699190612764565b60015b611ce6573d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b50600081511415611cde576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611d4890612de1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7490612de1565b8015611dc15780601f10611d9657610100808354040283529160200191611dc1565b820191906000526020600020905b815481529060010190602001808311611da457829003601f168201915b5050505050905090565b60606000821415611e13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f27565b600082905060005b60008214611e45578080611e2e90612e44565b915050600a82611e3e9190612c6c565b9150611e1b565b60008167ffffffffffffffff811115611e6157611e60612f7a565b5b6040519080825280601f01601f191660200182016040528015611e935781602001600182028036833780820191505090505b5090505b60008514611f2057600182611eac9190612cf7565b9150600a85611ebb9190612e8d565b6030611ec79190612c16565b60f81b818381518110611edd57611edc612f4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f199190612c6c565b9450611e97565b8093505050505b919050565b611f398383836001611f4a565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fb7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415611ff2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fff6000868387611f3e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156121c957506121c88773ffffffffffffffffffffffffffffffffffffffff16611bb6565b5b1561228f575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461223e6000888480600101955088611bd9565b612274576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156121cf57826000541461228a57600080fd5b6122fb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612290575b8160008190555050506123116000868387611f44565b5050505050565b82805461232490612de1565b90600052602060002090601f016020900481019282612346576000855561238d565b82601f1061235f57805160ff191683800117855561238d565b8280016001018555821561238d579182015b8281111561238c578251825591602001919060010190612371565b5b50905061239a91906123e1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156123fa5760008160009055506001016123e2565b5090565b600061241161240c84612b71565b612b4c565b90508281526020810184848401111561242d5761242c612fae565b5b612438848285612d9f565b509392505050565b600061245361244e84612ba2565b612b4c565b90508281526020810184848401111561246f5761246e612fae565b5b61247a848285612d9f565b509392505050565b60008135905061249181613136565b92915050565b6000813590506124a68161314d565b92915050565b6000813590506124bb81613164565b92915050565b6000815190506124d081613164565b92915050565b600082601f8301126124eb576124ea612fa9565b5b81356124fb8482602086016123fe565b91505092915050565b600082601f83011261251957612518612fa9565b5b8135612529848260208601612440565b91505092915050565b6000813590506125418161317b565b92915050565b60006020828403121561255d5761255c612fb8565b5b600061256b84828501612482565b91505092915050565b6000806040838503121561258b5761258a612fb8565b5b600061259985828601612482565b92505060206125aa85828601612482565b9150509250929050565b6000806000606084860312156125cd576125cc612fb8565b5b60006125db86828701612482565b93505060206125ec86828701612482565b92505060406125fd86828701612532565b9150509250925092565b6000806000806080858703121561262157612620612fb8565b5b600061262f87828801612482565b945050602061264087828801612482565b935050604061265187828801612532565b925050606085013567ffffffffffffffff81111561267257612671612fb3565b5b61267e878288016124d6565b91505092959194509250565b600080604083850312156126a1576126a0612fb8565b5b60006126af85828601612482565b92505060206126c085828601612497565b9150509250929050565b600080604083850312156126e1576126e0612fb8565b5b60006126ef85828601612482565b925050602061270085828601612532565b9150509250929050565b6000602082840312156127205761271f612fb8565b5b600061272e84828501612497565b91505092915050565b60006020828403121561274d5761274c612fb8565b5b600061275b848285016124ac565b91505092915050565b60006020828403121561277a57612779612fb8565b5b6000612788848285016124c1565b91505092915050565b6000602082840312156127a7576127a6612fb8565b5b600082013567ffffffffffffffff8111156127c5576127c4612fb3565b5b6127d184828501612504565b91505092915050565b6000602082840312156127f0576127ef612fb8565b5b60006127fe84828501612532565b91505092915050565b61281081612d2b565b82525050565b61281f81612d3d565b82525050565b600061283082612bd3565b61283a8185612be9565b935061284a818560208601612dae565b61285381612fbd565b840191505092915050565b600061286982612bde565b6128738185612bfa565b9350612883818560208601612dae565b61288c81612fbd565b840191505092915050565b60006128a282612bde565b6128ac8185612c0b565b93506128bc818560208601612dae565b80840191505092915050565b60006128d5602483612bfa565b91506128e082612fce565b604082019050919050565b60006128f8602683612bfa565b91506129038261301d565b604082019050919050565b600061291b602083612bfa565b91506129268261306c565b602082019050919050565b600061293e601983612bfa565b915061294982613095565b602082019050919050565b6000612961602083612bfa565b915061296c826130be565b602082019050919050565b6000612984602283612bfa565b915061298f826130e7565b604082019050919050565b6129a381612d95565b82525050565b60006129b58285612897565b91506129c18284612897565b91508190509392505050565b60006020820190506129e26000830184612807565b92915050565b60006080820190506129fd6000830187612807565b612a0a6020830186612807565b612a17604083018561299a565b8181036060830152612a298184612825565b905095945050505050565b6000602082019050612a496000830184612816565b92915050565b60006020820190508181036000830152612a69818461285e565b905092915050565b60006020820190508181036000830152612a8a816128c8565b9050919050565b60006020820190508181036000830152612aaa816128eb565b9050919050565b60006020820190508181036000830152612aca8161290e565b9050919050565b60006020820190508181036000830152612aea81612931565b9050919050565b60006020820190508181036000830152612b0a81612954565b9050919050565b60006020820190508181036000830152612b2a81612977565b9050919050565b6000602082019050612b46600083018461299a565b92915050565b6000612b56612b67565b9050612b628282612e13565b919050565b6000604051905090565b600067ffffffffffffffff821115612b8c57612b8b612f7a565b5b612b9582612fbd565b9050602081019050919050565b600067ffffffffffffffff821115612bbd57612bbc612f7a565b5b612bc682612fbd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c2182612d95565b9150612c2c83612d95565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6157612c60612ebe565b5b828201905092915050565b6000612c7782612d95565b9150612c8283612d95565b925082612c9257612c91612eed565b5b828204905092915050565b6000612ca882612d95565b9150612cb383612d95565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cec57612ceb612ebe565b5b828202905092915050565b6000612d0282612d95565b9150612d0d83612d95565b925082821015612d2057612d1f612ebe565b5b828203905092915050565b6000612d3682612d75565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612dcc578082015181840152602081019050612db1565b83811115612ddb576000848401525b50505050565b60006002820490506001821680612df957607f821691505b60208210811415612e0d57612e0c612f1c565b5b50919050565b612e1c82612fbd565b810181811067ffffffffffffffff82111715612e3b57612e3a612f7a565b5b80604052505050565b6000612e4f82612d95565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8257612e81612ebe565b5b600182019050919050565b6000612e9882612d95565b9150612ea383612d95565b925082612eb357612eb2612eed565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f66726565206d696e74696e6720776f756c6420657863656564206d617820746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b61313f81612d2b565b811461314a57600080fd5b50565b61315681612d3d565b811461316157600080fd5b50565b61316d81612d49565b811461317857600080fd5b50565b61318481612d95565b811461318f57600080fd5b5056fea26469706673582212201514b37ca486ae93b68f27ca63b701629a8166a0c64dad3939271fdb16d2fd1d64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000015af1d78b58c400000000000000000000000000000000000000000000000000000000000000000bb9000000000000000000000000000000000000000000000000000000000000000e5363726170204d6f6e7374657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c53435241504d4f4e535445520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696879366a337364747a3567346272666c6536656c3378697a376d73776b7966787a766b736a6e6d67727372376d61746c326462792f00000000000000
-----Decoded View---------------
Arg [0] : _name (string): Scrap Monsters
Arg [1] : _symbol (string): SCRAPMONSTER
Arg [2] : _uri (string): https://nftstorage.link/ipfs/bafybeihy6j3sdtz5g4brfle6el3xiz7mswkyfxzvksjnmgrsr7matl2dby/
Arg [3] : price (uint256): 25000000000000000000
Arg [4] : maxSupply (uint256): 3001
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000bb9
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 5363726170204d6f6e7374657273000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 53435241504d4f4e535445520000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [10] : 68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166
Arg [11] : 796265696879366a337364747a3567346272666c6536656c3378697a376d7377
Arg [12] : 6b7966787a766b736a6e6d67727372376d61746c326462792f00000000000000
Deployed Bytecode Sourcemap
2035:3034:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5568:344:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3732:223:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8668:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10212:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9789:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4839:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4598:96:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11159:164:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2161:35:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2264:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11389:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4839:107:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8483:123:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4049:147:6;;;;;;;;;;;;;:::i;:::-;;5971:203:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3083:101:12;;;;;;;;;;;;;:::i;:::-;;2453:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8830:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2231:27:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4337:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3090:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10515:310:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11634:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8998:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10891:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2086:31:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3333:198:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5568:344:4;5710:4;5764:25;5749:40;;;:11;:40;;;;:104;;;;5820:33;5805:48;;;:11;:48;;;;5749:104;:156;;;;5869:36;5893:11;5869:23;:36::i;:::-;5749:156;5730:175;;5568:344;;;:::o;3732:223:6:-;2346:13:12;:11;:13::i;:::-;3807:10:6::1;3820:13;:11;:13::i;:::-;3807:26;;3866:10;3856:6;3851:2;:11;;;;:::i;:::-;:25;;3843:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3927:21;3937:2;3941:6;3927:9;:21::i;:::-;3797:158;3732:223:::0;;:::o;8668:98:4:-;8722:13;8754:5;8747:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8668:98;:::o;10212:236::-;10312:7;10340:16;10348:7;10340;:16::i;:::-;10335:64;;10365:34;;;;;;;;;;;;;;10335:64;10417:15;:24;10433:7;10417:24;;;;;;;;;;;;;;;;;;;;;10410:31;;10212:236;;;:::o;9789:362::-;9861:13;9877:24;9893:7;9877:15;:24::i;:::-;9861:40;;9921:5;9915:11;;:2;:11;;;9911:48;;;9935:24;;;;;;;;;;;;;;9911:48;9990:5;9974:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;10000:37;10017:5;10024:12;:10;:12::i;:::-;10000:16;:37::i;:::-;9999:38;9974:63;9970:136;;;10060:35;;;;;;;;;;;;;;9970:136;10116:28;10125:2;10129:7;10138:5;10116:8;:28::i;:::-;9851:300;9789:362;;:::o;4839:297::-;4883:7;5104:15;:13;:15::i;:::-;5089:12;;5073:13;;:28;:46;5066:53;;4839:297;:::o;4598:96:6:-;2346:13:12;:11;:13::i;:::-;4682:5:6::1;4667:12;:20;;;;4598:96:::0;:::o;11159:164:4:-;11288:28;11298:4;11304:2;11308:7;11288:9;:28::i;:::-;11159:164;;;:::o;2161:35:6:-;;;:::o;2264:26::-;;;;:::o;11389:179:4:-;11522:39;11539:4;11545:2;11549:7;11522:39;;;;;;;;;;;;:16;:39::i;:::-;11389:179;;;:::o;4839:107:6:-;2346:13:12;:11;:13::i;:::-;4931:8:6::1;4912:16;:27;;;;;;;;;;;;:::i;:::-;;4839:107:::0;:::o;8483:123:4:-;8547:7;8573:21;8586:7;8573:12;:21::i;:::-;:26;;;8566:33;;8483:123;;;:::o;4049:147:6:-;2346:13:12;:11;:13::i;:::-;4103:15:6::1;4121:21;4103:39;;4160:10;4152:28;;:37;4181:7;4152:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4093:103;4049:147::o:0;5971:203:4:-;6035:7;6075:1;6058:19;;:5;:19;;;6054:60;;;6086:28;;;;;;;;;;;;;;6054:60;6139:12;:19;6152:5;6139:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6131:36;;6124:43;;5971:203;;;:::o;3083:101:12:-;2346:13;:11;:13::i;:::-;3147:30:::1;3174:1;3147:18;:30::i;:::-;3083:101::o:0;2453:85::-;2499:7;2525:6;;;;;;;;;;;2518:13;;2453:85;:::o;8830:102:4:-;8886:13;8918:7;8911:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8830:102;:::o;2231:27:6:-;;;;:::o;4337:94::-;2346:13:12;:11;:13::i;:::-;4416:8:6::1;4401:12;;:23;;;;;;;;;;;;;;;;;;4337:94:::0;:::o;3090:396::-;3147:10;3160:13;:11;:13::i;:::-;3147:26;;3192:12;;;;;;;;;;;3184:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3276:10;3266:6;3261:2;:11;;;;:::i;:::-;:25;;3253:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3379:9;3369:6;3354:12;;:21;;;;:::i;:::-;:34;3333:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;3450:29;3460:10;3472:6;3450:9;:29::i;:::-;3137:349;3090:396;:::o;10515:310:4:-;10653:12;:10;:12::i;:::-;10641:24;;:8;:24;;;10637:54;;;10674:17;;;;;;;;;;;;;;10637:54;10747:8;10702:18;:32;10721:12;:10;:12::i;:::-;10702:32;;;;;;;;;;;;;;;:42;10735:8;10702:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10799:8;10770:48;;10785:12;:10;:12::i;:::-;10770:48;;;10809:8;10770:48;;;;;;:::i;:::-;;;;;;;;10515:310;;:::o;11634:393::-;11795:28;11805:4;11811:2;11815:7;11795:9;:28::i;:::-;11850:15;:2;:13;;;:15::i;:::-;:88;;;;;11882:56;11913:4;11919:2;11923:7;11932:5;11882:30;:56::i;:::-;11881:57;11850:88;11833:188;;;11970:40;;;;;;;;;;;;;;11833:188;11634:393;;;;:::o;8998:401::-;9111:13;9145:16;9153:7;9145;:16::i;:::-;9140:59;;9170:29;;;;;;;;;;;;;;9140:59;9210:21;9234:10;:8;:10::i;:::-;9210:34;;9298:1;9279:7;9273:21;:26;;:119;;;;;;;;;;;;;;;;;9342:7;9351:18;:7;:16;:18::i;:::-;9325:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9273:119;9254:138;;;8998:401;;;:::o;10891:206::-;11028:4;11055:18;:25;11074:5;11055:25;;;;;;;;;;;;;;;:35;11081:8;11055:35;;;;;;;;;;;;;;;;;;;;;;;;;11048:42;;10891:206;;;;:::o;2086:31:6:-;;;;;;;;;;;;;:::o;3333:198:12:-;2346:13;:11;:13::i;:::-;3441:1:::1;3421:22;;:8;:22;;;;3413:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3496:28;3515:8;3496:18;:28::i;:::-;3333:198:::0;:::o;2088:155:2:-;2173:4;2211:25;2196:40;;;:11;:40;;;;2189:47;;2088:155;;;:::o;2611:130:12:-;2685:12;:10;:12::i;:::-;2674:23;;:7;:5;:7::i;:::-;:23;;;2666:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2611:130::o;12487:102:4:-;12555:27;12565:2;12569:8;12555:27;;;;;;;;;;;;:9;:27::i;:::-;12487:102;;:::o;12273:208::-;12330:4;12384:7;12365:15;:13;:15::i;:::-;:26;;:65;;;;;12417:13;;12407:7;:23;12365:65;:109;;;;;12447:11;:20;12459:7;12447:20;;;;;;;;;;;:27;;;;;;;;;;;;12446:28;12365:109;12346:128;;12273:208;;;:::o;1899:96:1:-;1952:7;1978:10;1971:17;;1899:96;:::o;20433:189:4:-;20570:2;20543:15;:24;20559:7;20543:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20607:7;20603:2;20587:28;;20596:5;20587:28;;;;;;;;;;;;20433:189;;;:::o;4620:90::-;4676:7;4620:90;:::o;15503:2082::-;15613:35;15651:21;15664:7;15651:12;:21::i;:::-;15613:59;;15709:4;15687:26;;:13;:18;;;:26;;;15683:67;;15722:28;;;;;;;;;;;;;;15683:67;15761:22;15803:4;15787:20;;:12;:10;:12::i;:::-;:20;;;:72;;;;15823:36;15840:4;15846:12;:10;:12::i;:::-;15823:16;:36::i;:::-;15787:72;:124;;;;15899:12;:10;:12::i;:::-;15875:36;;:20;15887:7;15875:11;:20::i;:::-;:36;;;15787:124;15761:151;;15928:17;15923:66;;15954:35;;;;;;;;;;;;;;15923:66;16017:1;16003:16;;:2;:16;;;15999:52;;;16028:23;;;;;;;;;;;;;;15999:52;16062:43;16084:4;16090:2;16094:7;16103:1;16062:21;:43::i;:::-;16167:35;16184:1;16188:7;16197:4;16167:8;:35::i;:::-;16522:1;16492:12;:18;16505:4;16492:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16565:1;16537:12;:16;16550:2;16537:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16581:31;16615:11;:20;16627:7;16615:20;;;;;;;;;;;16581:54;;16665:2;16649:8;:13;;;:18;;;;;;;;;;;;;;;;;;16714:15;16681:8;:23;;;:49;;;;;;;;;;;;;;;;;;16978:19;17010:1;17000:7;:11;16978:33;;17025:31;17059:11;:24;17071:11;17059:24;;;;;;;;;;;17025:58;;17126:1;17101:27;;:8;:13;;;;;;;;;;;;:27;;;17097:377;;;17308:13;;17293:11;:28;17289:171;;17361:4;17345:8;:13;;;:20;;;;;;;;;;;;;;;;;;17413:13;:28;;;17387:8;:23;;;:54;;;;;;;;;;;;;;;;;;17289:171;17097:377;16468:1016;;;17518:7;17514:2;17499:27;;17508:4;17499:27;;;;;;;;;;;;17536:42;17557:4;17563:2;17567:7;17576:1;17536:20;:42::i;:::-;15603:1982;;15503:2082;;;:::o;7314:1112::-;7400:21;;:::i;:::-;7437:12;7452:7;7437:22;;7517:4;7498:15;:13;:15::i;:::-;:23;;:47;;;;;7532:13;;7525:4;:20;7498:47;7494:868;;;7565:31;7599:11;:17;7611:4;7599:17;;;;;;;;;;;7565:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:9;:16;;;7634:714;;7709:1;7683:28;;:9;:14;;;:28;;;7679:99;;7746:9;7739:16;;;;;;7679:99;8075:255;8082:4;8075:255;;;8114:6;;;;;;;;8158:11;:17;8170:4;8158:17;;;;;;;;;;;8146:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8231:1;8205:28;;:9;:14;;;:28;;;8201:107;;8272:9;8265:16;;;;;;8201:107;8075:255;;;7634:714;7547:815;7494:868;8388:31;;;;;;;;;;;;;;7314:1112;;;;:::o;3685:187:12:-;3758:16;3777:6;;;;;;;;;;;3758:25;;3802:8;3793:6;;:17;;;;;;;;;;;;;;;;;;3856:8;3825:40;;3846:8;3825:40;;;;;;;;;;;;3748:124;3685:187;:::o;2434:320:0:-;2494:4;2746:1;2724:7;:19;;;:23;2717:30;;2434:320;;;:::o;21103:748:4:-;21261:4;21309:2;21293:36;;;21347:12;:10;:12::i;:::-;21377:4;21399:7;21424:5;21293:150;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21277:568;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21627:1;21610:6;:13;:18;21606:229;;;21655:40;;;;;;;;;;;;;;21606:229;21795:6;21789:13;21780:6;21776:2;21772:15;21765:38;21277:568;21507:45;;;21497:55;;;:6;:55;;;;21490:62;;;21103:748;;;;;;:::o;4952:115:6:-;5012:13;5044:16;5037:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:115;:::o;1651:703:13:-;1707:13;1933:1;1924:5;:10;1920:51;;;1950:10;;;;;;;;;;;;;;;;;;;;;1920:51;1980:12;1995:5;1980:20;;2010:14;2034:75;2049:1;2041:4;:9;2034:75;;2066:8;;;;;:::i;:::-;;;;2096:2;2088:10;;;;;:::i;:::-;;;2034:75;;;2118:19;2150:6;2140:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2118:39;;2167:150;2183:1;2174:5;:10;2167:150;;2210:1;2200:11;;;;;:::i;:::-;;;2276:2;2268:5;:10;;;;:::i;:::-;2255:2;:24;;;;:::i;:::-;2242:39;;2225:6;2232;2225:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2304:2;2295:11;;;;;:::i;:::-;;;2167:150;;;2340:6;2326:21;;;;;1651:703;;;;:::o;12940:157:4:-;13058:32;13064:2;13068:8;13078:5;13085:4;13058:5;:32::i;:::-;12940:157;;;:::o;22482:154::-;;;;;:::o;23277:153::-;;;;;:::o;13344:1917::-;13477:20;13500:13;;13477:36;;13541:1;13527:16;;:2;:16;;;13523:48;;;13552:19;;;;;;;;;;;;;;13523:48;13597:1;13585:8;:13;13581:44;;;13607:18;;;;;;;;;;;;;;13581:44;13636:61;13666:1;13670:2;13674:12;13688:8;13636:21;:61::i;:::-;14003:8;13968:12;:16;13981:2;13968:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14066:8;14026:12;:16;14039:2;14026:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14123:2;14090:11;:25;14102:12;14090:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14189:15;14139:11;:25;14151:12;14139:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14220:20;14243:12;14220:35;;14269:11;14298:8;14283:12;:23;14269:37;;14325:4;:23;;;;;14333:15;:2;:13;;;:15::i;:::-;14325:23;14321:812;;;14368:493;14423:12;14419:2;14398:38;;14415:1;14398:38;;;;;;;;;;;;14488:207;14556:1;14588:2;14620:14;;;;;;14664:5;14488:30;:207::i;:::-;14458:356;;14751:40;;;;;;;;;;;;;;14458:356;14856:3;14840:12;:19;;14368:493;;14940:12;14923:13;;:29;14919:43;;14954:8;;;14919:43;14321:812;;;15001:118;15056:14;;;;;;15052:2;15031:40;;15048:1;15031:40;;;;;;;;;;;;15114:3;15098:12;:19;;15001:118;;14321:812;15162:12;15146:13;:28;;;;13944:1241;;15194:60;15223:1;15227:2;15231:12;15245:8;15194:20;:60::i;:::-;13467:1794;13344:1917;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:118::-;11164:24;11182:5;11164:24;:::i;:::-;11159:3;11152:37;11077:118;;:::o;11201:435::-;11381:3;11403:95;11494:3;11485:6;11403:95;:::i;:::-;11396:102;;11515:95;11606:3;11597:6;11515:95;:::i;:::-;11508:102;;11627:3;11620:10;;11201:435;;;;;:::o;11642:222::-;11735:4;11773:2;11762:9;11758:18;11750:26;;11786:71;11854:1;11843:9;11839:17;11830:6;11786:71;:::i;:::-;11642:222;;;;:::o;11870:640::-;12065:4;12103:3;12092:9;12088:19;12080:27;;12117:71;12185:1;12174:9;12170:17;12161:6;12117:71;:::i;:::-;12198:72;12266:2;12255:9;12251:18;12242:6;12198:72;:::i;:::-;12280;12348:2;12337:9;12333:18;12324:6;12280:72;:::i;:::-;12399:9;12393:4;12389:20;12384:2;12373:9;12369:18;12362:48;12427:76;12498:4;12489:6;12427:76;:::i;:::-;12419:84;;11870:640;;;;;;;:::o;12516:210::-;12603:4;12641:2;12630:9;12626:18;12618:26;;12654:65;12716:1;12705:9;12701:17;12692:6;12654:65;:::i;:::-;12516:210;;;;:::o;12732:313::-;12845:4;12883:2;12872:9;12868:18;12860:26;;12932:9;12926:4;12922:20;12918:1;12907:9;12903:17;12896:47;12960:78;13033:4;13024:6;12960:78;:::i;:::-;12952:86;;12732:313;;;;:::o;13051:419::-;13217:4;13255:2;13244:9;13240:18;13232:26;;13304:9;13298:4;13294:20;13290:1;13279:9;13275:17;13268:47;13332:131;13458:4;13332:131;:::i;:::-;13324:139;;13051:419;;;:::o;13476:::-;13642:4;13680:2;13669:9;13665:18;13657:26;;13729:9;13723:4;13719:20;13715:1;13704:9;13700:17;13693:47;13757:131;13883:4;13757:131;:::i;:::-;13749:139;;13476:419;;;:::o;13901:::-;14067:4;14105:2;14094:9;14090:18;14082:26;;14154:9;14148:4;14144:20;14140:1;14129:9;14125:17;14118:47;14182:131;14308:4;14182:131;:::i;:::-;14174:139;;13901:419;;;:::o;14326:::-;14492:4;14530:2;14519:9;14515:18;14507:26;;14579:9;14573:4;14569:20;14565:1;14554:9;14550:17;14543:47;14607:131;14733:4;14607:131;:::i;:::-;14599:139;;14326:419;;;:::o;14751:::-;14917:4;14955:2;14944:9;14940:18;14932:26;;15004:9;14998:4;14994:20;14990:1;14979:9;14975:17;14968:47;15032:131;15158:4;15032:131;:::i;:::-;15024:139;;14751:419;;;:::o;15176:::-;15342:4;15380:2;15369:9;15365:18;15357:26;;15429:9;15423:4;15419:20;15415:1;15404:9;15400:17;15393:47;15457:131;15583:4;15457:131;:::i;:::-;15449:139;;15176:419;;;:::o;15601:222::-;15694:4;15732:2;15721:9;15717:18;15709:26;;15745:71;15813:1;15802:9;15798:17;15789:6;15745:71;:::i;:::-;15601:222;;;;:::o;15829:129::-;15863:6;15890:20;;:::i;:::-;15880:30;;15919:33;15947:4;15939:6;15919:33;:::i;:::-;15829:129;;;:::o;15964:75::-;15997:6;16030:2;16024:9;16014:19;;15964:75;:::o;16045:307::-;16106:4;16196:18;16188:6;16185:30;16182:56;;;16218:18;;:::i;:::-;16182:56;16256:29;16278:6;16256:29;:::i;:::-;16248:37;;16340:4;16334;16330:15;16322:23;;16045:307;;;:::o;16358:308::-;16420:4;16510:18;16502:6;16499:30;16496:56;;;16532:18;;:::i;:::-;16496:56;16570:29;16592:6;16570:29;:::i;:::-;16562:37;;16654:4;16648;16644:15;16636:23;;16358:308;;;:::o;16672:98::-;16723:6;16757:5;16751:12;16741:22;;16672:98;;;:::o;16776:99::-;16828:6;16862:5;16856:12;16846:22;;16776:99;;;:::o;16881:168::-;16964:11;16998:6;16993:3;16986:19;17038:4;17033:3;17029:14;17014:29;;16881:168;;;;:::o;17055:169::-;17139:11;17173:6;17168:3;17161:19;17213:4;17208:3;17204:14;17189:29;;17055:169;;;;:::o;17230:148::-;17332:11;17369:3;17354:18;;17230:148;;;;:::o;17384:305::-;17424:3;17443:20;17461:1;17443:20;:::i;:::-;17438:25;;17477:20;17495:1;17477:20;:::i;:::-;17472:25;;17631:1;17563:66;17559:74;17556:1;17553:81;17550:107;;;17637:18;;:::i;:::-;17550:107;17681:1;17678;17674:9;17667:16;;17384:305;;;;:::o;17695:185::-;17735:1;17752:20;17770:1;17752:20;:::i;:::-;17747:25;;17786:20;17804:1;17786:20;:::i;:::-;17781:25;;17825:1;17815:35;;17830:18;;:::i;:::-;17815:35;17872:1;17869;17865:9;17860:14;;17695:185;;;;:::o;17886:348::-;17926:7;17949:20;17967:1;17949:20;:::i;:::-;17944:25;;17983:20;18001:1;17983:20;:::i;:::-;17978:25;;18171:1;18103:66;18099:74;18096:1;18093:81;18088:1;18081:9;18074:17;18070:105;18067:131;;;18178:18;;:::i;:::-;18067:131;18226:1;18223;18219:9;18208:20;;17886:348;;;;:::o;18240:191::-;18280:4;18300:20;18318:1;18300:20;:::i;:::-;18295:25;;18334:20;18352:1;18334:20;:::i;:::-;18329:25;;18373:1;18370;18367:8;18364:34;;;18378:18;;:::i;:::-;18364:34;18423:1;18420;18416:9;18408:17;;18240:191;;;;:::o;18437:96::-;18474:7;18503:24;18521:5;18503:24;:::i;:::-;18492:35;;18437:96;;;:::o;18539:90::-;18573:7;18616:5;18609:13;18602:21;18591:32;;18539:90;;;:::o;18635:149::-;18671:7;18711:66;18704:5;18700:78;18689:89;;18635:149;;;:::o;18790:126::-;18827:7;18867:42;18860:5;18856:54;18845:65;;18790:126;;;:::o;18922:77::-;18959:7;18988:5;18977:16;;18922:77;;;:::o;19005:154::-;19089:6;19084:3;19079;19066:30;19151:1;19142:6;19137:3;19133:16;19126:27;19005:154;;;:::o;19165:307::-;19233:1;19243:113;19257:6;19254:1;19251:13;19243:113;;;19342:1;19337:3;19333:11;19327:18;19323:1;19318:3;19314:11;19307:39;19279:2;19276:1;19272:10;19267:15;;19243:113;;;19374:6;19371:1;19368:13;19365:101;;;19454:1;19445:6;19440:3;19436:16;19429:27;19365:101;19214:258;19165:307;;;:::o;19478:320::-;19522:6;19559:1;19553:4;19549:12;19539:22;;19606:1;19600:4;19596:12;19627:18;19617:81;;19683:4;19675:6;19671:17;19661:27;;19617:81;19745:2;19737:6;19734:14;19714:18;19711:38;19708:84;;;19764:18;;:::i;:::-;19708:84;19529:269;19478:320;;;:::o;19804:281::-;19887:27;19909:4;19887:27;:::i;:::-;19879:6;19875:40;20017:6;20005:10;20002:22;19981:18;19969:10;19966:34;19963:62;19960:88;;;20028:18;;:::i;:::-;19960:88;20068:10;20064:2;20057:22;19847:238;19804:281;;:::o;20091:233::-;20130:3;20153:24;20171:5;20153:24;:::i;:::-;20144:33;;20199:66;20192:5;20189:77;20186:103;;;20269:18;;:::i;:::-;20186:103;20316:1;20309:5;20305:13;20298:20;;20091:233;;;:::o;20330:176::-;20362:1;20379:20;20397:1;20379:20;:::i;:::-;20374:25;;20413:20;20431:1;20413:20;:::i;:::-;20408:25;;20452:1;20442:35;;20457:18;;:::i;:::-;20442:35;20498:1;20495;20491:9;20486:14;;20330:176;;;;:::o;20512:180::-;20560:77;20557:1;20550:88;20657:4;20654:1;20647:15;20681:4;20678:1;20671:15;20698:180;20746:77;20743:1;20736:88;20843:4;20840:1;20833:15;20867:4;20864:1;20857:15;20884:180;20932:77;20929:1;20922:88;21029:4;21026:1;21019:15;21053:4;21050:1;21043:15;21070:180;21118:77;21115:1;21108:88;21215:4;21212:1;21205:15;21239:4;21236:1;21229:15;21256:180;21304:77;21301:1;21294:88;21401:4;21398:1;21391:15;21425:4;21422:1;21415:15;21442:117;21551:1;21548;21541:12;21565:117;21674:1;21671;21664:12;21688:117;21797:1;21794;21787:12;21811:117;21920:1;21917;21910:12;21934:102;21975:6;22026:2;22022:7;22017:2;22010:5;22006:14;22002:28;21992:38;;21934:102;;;:::o;22042:223::-;22182:34;22178:1;22170:6;22166:14;22159:58;22251:6;22246:2;22238:6;22234:15;22227:31;22042:223;:::o;22271:225::-;22411:34;22407:1;22399:6;22395:14;22388:58;22480:8;22475:2;22467:6;22463:15;22456:33;22271:225;:::o;22502:182::-;22642:34;22638:1;22630:6;22626:14;22619:58;22502:182;:::o;22690:175::-;22830:27;22826:1;22818:6;22814:14;22807:51;22690:175;:::o;22871:182::-;23011:34;23007:1;22999:6;22995:14;22988:58;22871:182;:::o;23059:221::-;23199:34;23195:1;23187:6;23183:14;23176:58;23268:4;23263:2;23255:6;23251:15;23244:29;23059:221;:::o;23286:122::-;23359:24;23377:5;23359:24;:::i;:::-;23352:5;23349:35;23339:63;;23398:1;23395;23388:12;23339:63;23286:122;:::o;23414:116::-;23484:21;23499:5;23484:21;:::i;:::-;23477:5;23474:32;23464:60;;23520:1;23517;23510:12;23464:60;23414:116;:::o;23536:120::-;23608:23;23625:5;23608:23;:::i;:::-;23601:5;23598:34;23588:62;;23646:1;23643;23636:12;23588:62;23536:120;:::o;23662:122::-;23735:24;23753:5;23735:24;:::i;:::-;23728:5;23725:35;23715:63;;23774:1;23771;23764:12;23715:63;23662:122;:::o
Swarm Source
ipfs://1514b37ca486ae93b68f27ca63b701629a8166a0c64dad3939271fdb16d2fd1d
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.