Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15992607 | 664 days ago | IN | 0 ETH | 0.06320645 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintingFacet
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT ///Adapted from Azuki's ERC721A https://github.com/chiru-labs/ERC721A as of 4/28/22 pragma solidity 0.8.13; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import {IERC721} from "../interfaces/IERC721.sol"; import "../libraries/LibERC721.sol"; import {AddressData, AppStorage, TokenOwnership, Modifiers} from "../libraries/LibAppStorage.sol"; error OwnerQueryForNonexistentToken(); error TransferToNonERC721ReceiverImplementer(); contract MintingFacet is IERC721, Modifiers { using Address for address; using Strings for uint256; /// Main purchase function function purchase(address targetAddress, uint256 quantity) external payable { /// Revert if sale is not open require(s.publicMintOpen, "Sale is not open"); /// Revert if quantity more than allowed require(quantity < s._maxAllowed, "Quantity more than allowed per transaction"); /// Revert if outside sale limit require(totalMinted() + quantity < s.saleLimit, "Quantity more than remaining"); /// Revert if incorrect amount sent require(msg.value == s.priceWEI * quantity, "Incorrect amount sent"); _mint(targetAddress, quantity, "", true); } /// Set an address as a contract editor function setEditor(address editor) external onlyOwner { s._editors[editor] = true; } /// Set baseURI for metadata function setBaseURI(string memory uri) external onlyEditor { s.baseURI = uri; } /// Set price for the token function setPrice(uint256 price) external onlyEditor { s.priceWEI = price; } /// Set mintStarted to enable and disable the general sale function setPublicMintOpen(bool newPublicMintOpenValue) external onlyEditor { s.publicMintOpen = newPublicMintOpenValue; } /// Set royaltyTarget for the address to receive royalties /// This is assuming marketplaces will adopt IERC2981 function setRoyaltyTarget(address targetAddress) external onlyEditor { require(address(targetAddress) != address(0), "Address is Zero"); s._royaltyTarget = targetAddress; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external { address owner = ownerOf(tokenId); require(to != owner, "Approval to current owner"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "Approval denied"); _approve(to, tokenId, owner); } /** * @dev Burns `tokenId`. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external virtual { _burn(tokenId, true); } //Bulk burns if address provided owns token. Only callable by set editor including external contracts. function bulkBurn(uint256[] memory burnTokens, address tokenOwner) external onlyEditor { for (uint256 i = 0; i < burnTokens.length; i++) { bool isApproved = _ownershipOf(burnTokens[i]).addr == tokenOwner; require(isApproved, "Token not owned by address"); _burn(burnTokens[i], false); } } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) external { require(operator != msg.sender, "Approve to caller"); s._operatorApprovals[msg.sender][operator] = approved; emit LibERC721.ApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external virtual { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external virtual { _transfer(from, to, tokenId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "Token does not exist"); string memory baseURI = s.baseURI; return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Burned tokens are calculated here, use totalMinted() if you want to count just minted tokens. */ function totalSupply() external view returns (uint256) { // Counter underflow is impossible as __burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return s._currentIndex - s._burnCounter - _startTokenId(); } } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) external view returns (uint256) { require(owner != address(0), "Address is Zero"); return uint256(s._addressData[owner].balance); } /// Returns whether `tokenId` exists. function exists(uint256 tokenId) external view returns (bool) { return _exists(tokenId); } /** * Returns the number of tokens minted by `owner`. */ function numberMinted(address owner) external view returns (uint256) { return uint256(s._addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function numberBurned(address owner) external view returns (uint256) { return uint256(s._addressData[owner].numberBurned); } /// Return the universal name of the NFT function name() external view returns (string memory) { return s.name; } /// Returns price in WEI function priceWEI() external view returns (uint256) { return s.priceWEI; } /// Returns if public mint is open function publicMintOpen() external view returns (bool) { return s.publicMintOpen; } /// Royalty info per IERC2981 function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { _tokenId; // to silence unused variable warnings return (s._royaltyTarget, (_salePrice * 15) / 200); /// To get 7.5% } /// Returns the limit of the sale function saleLimit() external view returns (uint256) { return s.saleLimit; } /// An abbreviated name for NFTs in this contract function symbol() external view returns (string memory) { return s.symbol; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "Token does not exist"); return s._tokenApprovals[tokenId]; } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return s._operatorApprovals[owner][operator]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view returns (address) { return _ownershipOf(tokenId).addr; } /** * Returns the total amount of tokens minted in the contract. */ function totalMinted() public view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return s._currentIndex - _startTokenId(); } } /** * @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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (msg.sender == from || isApprovedForAll(from, msg.sender) || getApproved(tokenId) == msg.sender); require(isApprovedOrOwner, "Transfer caller not owner nor approved"); } _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 = s._addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = s._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 = s._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 != s._currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit LibERC721.Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as __burnCounter cannot be exceed _currentIndex times. unchecked { s._burnCounter++; } } /** * @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 _startingId = s._currentIndex; require(to != address(0), "Address is zero"); require(quantity != 0, "Quantity is zero"); _beforeTokenTransfers(address(0), to, _startingId, 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 { s._addressData[to].balance += uint64(quantity); s._addressData[to].numberMinted += uint64(quantity); s._ownerships[_startingId].addr = to; s._ownerships[_startingId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = _startingId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit LibERC721.Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (s._currentIndex != _startingId) revert(); } else { do { emit LibERC721.Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } s._currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, _startingId, quantity); } /** * @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 _startingId, 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. * * _startingId - 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 _startingId, uint256 quantity ) internal virtual {} /** * @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 < s._currentIndex && !s._ownerships[tokenId].burned; } /// Sets the first token id function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * 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 < s._currentIndex) { TokenOwnership memory ownership = s._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 = s._ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @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); require(prevOwnership.addr == from, "Transfer from incorrect owner"); bool isApprovedOrOwner = (msg.sender == from || isApprovedForAll(from, msg.sender) || getApproved(tokenId) == msg.sender); require(isApprovedOrOwner, "Transfer caller not owner nor approved"); require(to != address(0), "Address is zero"); _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 { s._addressData[from].balance -= 1; s._addressData[to].balance += 1; TokenOwnership storage currSlot = s._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 = s._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 != s._currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit LibERC721.Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { s._tokenApprovals[tokenId] = to; emit LibERC721.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(msg.sender, 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)) } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. /* is ERC165 */ interface IERC721 { /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata data ) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom( address _from, address _to, uint256 _tokenId ) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "../interfaces/IERC721TokenReceiver.sol"; library LibERC721 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; function checkOnERC721Received( address _operator, address _from, address _to, uint256 _tokenId, bytes memory _data ) internal { uint256 size; assembly { size := extcodesize(_to) } if (size > 0) { require( ERC721_RECEIVED == IERC721TokenReceiver(_to).onERC721Received(_operator, _from, _tokenId, _data), "Transfer rejected/failed by _to" ); } } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.13; import {LibDiamond} from "../../shared/libraries/LibDiamond.sol"; /// 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; } /// Defines attributes stored in diamond /// Many come from ERC721A struct AppStorage { /// Name of contract string name; /// Symbol for contract string symbol; /// Base URI string baseURI; /// If true the public mint is open bool publicMintOpen; /// Price in WEI uint256 priceWEI; /// Total allowed to be minted uint256 saleLimit; /// If true the paid allow list mint is open bool allowListPaidOpen; /// If true the free allow list mint is open bool allowListFreeOpen; /// Royalty target address for ERC2981 address _royaltyTarget; /// The max tokens allowed to be purchased in one transaction uint256 _maxAllowed; /// The tokenId of the next token to be minted uint256 _currentIndex; /// The number of tokens burned uint256 _burnCounter; /// Total revenue shares uint256 _totalShares; /// Total revenue released uint256 _totalReleased; /// 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) _ownerships; /// Mapping owner address to address data mapping(address => AddressData) _addressData; /// Mapping from token ID to approved address mapping(uint256 => address) _tokenApprovals; /// Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; /// Mapping of Editors to contract mapping(address => bool) _editors; /// Mapping of revenue shares mapping(address => uint256) _shares; /// Mapping of total revenue released to each address mapping(address => uint256) _released; /// Mapping of allowed addresses to pay for minting before mint starts mapping(address => uint16) _allowListPaid; /// Mapping of allowed addresses to mint for free plus gas mapping(address => uint16) _allowListFree; /// Address of signer for verified mints address signer; /// Mapping of used verified messages mapping(uint32 => bool) _usedVerifiedMessages; /// If true the paid public max per wallet is open bool maxPerWalletPaidOpen; /// If true the free public max per wallet is open bool maxPerWalletFreeOpen; /// The max tokens allowed to be purchased per wallet uint256 _maxPerWallet; /// If true the paid public max per wallet is open bool bulkBurningOpen; //always add new state variables at the end } library LibAppStorage { function diamondStorage() internal pure returns (AppStorage storage ds) { assembly { ds.slot := 0 } } } error CallerIsNotEditor(); contract Modifiers { AppStorage internal s; modifier onlyEditor() { if (!s._editors[msg.sender]) revert CallerIsNotEditor(); _; } modifier onlyOwner() { LibDiamond.enforceIsContractOwner(); _; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface IERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes calldata _data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; library LibDiamond { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct DiamondStorage { // maps function selectors to the facets that execute the functions. // and maps the selectors to their position in the selectorSlots array. // func selector => address facet, selector position mapping(bytes4 => bytes32) facets; // array of slots of function selectors. // each slot holds 8 function selectors. mapping(uint256 => bytes32) selectorSlots; // The number of function selectors in selectorSlots uint16 selectorCount; // Used to query if a contract implements an interface. // Used to implement ERC-165. mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); bytes32 constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff)); bytes32 constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224)); // Internal function version of diamondCut // This code is almost the same as the external diamondCut, // except it is using 'Facet[] memory _diamondCut' instead of // 'Facet[] calldata _diamondCut'. // The code is duplicated to prevent copying calldata to memory which // causes an error for a two dimensional array. function diamondCut( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { DiamondStorage storage ds = diamondStorage(); uint256 originalSelectorCount = ds.selectorCount; uint256 selectorCount = originalSelectorCount; bytes32 selectorSlot; // Check if last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // get last selectorSlot // "selectorSlot >> 3" is a gas efficient division by 8 "selectorSlot / 8" selectorSlot = ds.selectorSlots[selectorCount >> 3]; } // loop through diamond cut for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { (selectorCount, selectorSlot) = addReplaceRemoveFacetSelectors( selectorCount, selectorSlot, _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].action, _diamondCut[facetIndex].functionSelectors ); } if (selectorCount != originalSelectorCount) { ds.selectorCount = uint16(selectorCount); } // If last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // "selectorSlot >> 3" is a gas efficient division by 8 "selectorSlot / 8" ds.selectorSlots[selectorCount >> 3] = selectorSlot; } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addReplaceRemoveFacetSelectors( uint256 _selectorCount, bytes32 _selectorSlot, address _newFacetAddress, IDiamondCut.FacetCutAction _action, bytes4[] memory _selectors ) internal returns (uint256, bytes32) { DiamondStorage storage ds = diamondStorage(); require(_selectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); if (_action == IDiamondCut.FacetCutAction.Add) { enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Add facet has no code"); for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) == address(0), "LibDiamondCut: Can't add function that already exists"); // add facet for selector ds.facets[selector] = bytes20(_newFacetAddress) | bytes32(_selectorCount); // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" uint256 selectorInSlotPosition = (_selectorCount & 7) << 5; // clear selector position in slot and add selector _selectorSlot = (_selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition); // if slot is full then write it to storage if (selectorInSlotPosition == 224) { // "_selectorSlot >> 3" is a gas efficient division by 8 "_selectorSlot / 8" ds.selectorSlots[_selectorCount >> 3] = _selectorSlot; _selectorSlot = 0; } _selectorCount++; } } else if (_action == IDiamondCut.FacetCutAction.Replace) { enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Replace facet has no code"); for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; address oldFacetAddress = address(bytes20(oldFacet)); // only useful if immutable functions exist require(oldFacetAddress != address(this), "LibDiamondCut: Can't replace immutable function"); require(oldFacetAddress != _newFacetAddress, "LibDiamondCut: Can't replace function with same function"); require(oldFacetAddress != address(0), "LibDiamondCut: Can't replace function that doesn't exist"); // replace old facet address ds.facets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(_newFacetAddress); } } else if (_action == IDiamondCut.FacetCutAction.Remove) { require(_newFacetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); // "_selectorCount >> 3" is a gas efficient division by 8 "_selectorCount / 8" uint256 selectorSlotCount = _selectorCount >> 3; // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" uint256 selectorInSlotIndex = _selectorCount & 7; for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { if (_selectorSlot == 0) { // get last selectorSlot selectorSlotCount--; _selectorSlot = ds.selectorSlots[selectorSlotCount]; selectorInSlotIndex = 7; } else { selectorInSlotIndex--; } bytes4 lastSelector; uint256 oldSelectorsSlotCount; uint256 oldSelectorInSlotPosition; // adding a block here prevents stack too deep error { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // only useful if immutable functions exist require(address(bytes20(oldFacet)) != address(this), "LibDiamondCut: Can't remove immutable function"); // replace selector with last selector in ds.facets // gets the last selector lastSelector = bytes4(_selectorSlot << (selectorInSlotIndex << 5)); if (lastSelector != selector) { // update last selector slot position info ds.facets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(ds.facets[lastSelector]); } delete ds.facets[selector]; uint256 oldSelectorCount = uint16(uint256(oldFacet)); // "oldSelectorCount >> 3" is a gas efficient division by 8 "oldSelectorCount / 8" oldSelectorsSlotCount = oldSelectorCount >> 3; // "oldSelectorCount & 7" is a gas efficient modulo by eight "oldSelectorCount % 8" oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5; } if (oldSelectorsSlotCount != selectorSlotCount) { bytes32 oldSelectorSlot = ds.selectorSlots[oldSelectorsSlotCount]; // clears the selector we are deleting and puts the last selector in its place. oldSelectorSlot = (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); // update storage with the modified slot ds.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot; } else { // clears the selector we are deleting and puts the last selector in its place. _selectorSlot = (_selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); } if (selectorInSlotIndex == 0) { delete ds.selectorSlots[selectorSlotCount]; _selectorSlot = 0; } } _selectorCount = selectorSlotCount * 8 + selectorInSlotIndex; } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } return (_selectorCount, _selectorSlot); } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { require(_calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty"); } else { require(_calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)"); if (_init != address(this)) { enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); } (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("LibDiamondCut: _init function reverted"); } } } } function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } require(contractSize > 0, _errorMessage); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"CallerIsNotEditor","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"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":[{"internalType":"uint256[]","name":"burnTokens","type":"uint256[]"},{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"bulkBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWEI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"saleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"editor","type":"address"}],"name":"setEditor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newPublicMintOpenValue","type":"bool"}],"name":"setPublicMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"setRoyaltyTarget","outputs":[],"stateMutability":"nonpayable","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]
Contract Creation Code
608060405234801561001057600080fd5b50613e53806100206000396000f3fe6080604052600436106101c25760003560e01c80637266408d116100f7578063a2309ff811610095578063c87b56dd11610064578063c87b56dd14610640578063dc33e6811461067d578063e985e9c5146106ba578063f176ea12146106f7576101c2565b8063a2309ff814610598578063acf1941c146105c3578063b88d4fde146105ec578063bcc9ca5b14610615576101c2565b80638de93222116100d15780638de93222146104ff57806391b7f5ed1461051b57806395d89b4114610544578063a22cb4651461056f576101c2565b80637266408d146104825780637e26639f146104ab578063825a229e146104d6576101c2565b806342842e0e1161016457806355f804b31161013e57806355f804b3146103b65780636352211e146103df5780636387f8041461041c57806370a0823114610445576101c2565b806342842e0e1461032757806342966c68146103505780634f558e7914610379576101c2565b806318160ddd116101a057806318160ddd1461025857806323b872dd146102835780632478d639146102ac5780632a55205a146102e9576101c2565b806306fdde03146101c7578063081812fc146101f2578063095ea7b31461022f575b600080fd5b3480156101d357600080fd5b506101dc610722565b6040516101e99190612c0d565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190612c79565b6107b6565b6040516102269190612ce7565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612d2e565b61083e565b005b34801561026457600080fd5b5061026d610948565b60405161027a9190612d7d565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612d98565b610965565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612deb565b610975565b6040516102e09190612d7d565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e18565b6109e1565b60405161031e929190612e58565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190612d98565b610a2e565b005b34801561035c57600080fd5b5061037760048036038101906103729190612c79565b610a4e565b005b34801561038557600080fd5b506103a0600480360381019061039b9190612c79565b610a5c565b6040516103ad9190612e9c565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190612fec565b610a6e565b005b3480156103eb57600080fd5b5061040660048036038101906104019190612c79565b610b11565b6040516104139190612ce7565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613061565b610b27565b005b34801561045157600080fd5b5061046c60048036038101906104679190612deb565b610bcd565b6040516104799190612d7d565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612deb565b610ca8565b005b3480156104b757600080fd5b506104c0610de4565b6040516104cd9190612d7d565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190612deb565b610df0565b005b61051960048036038101906105149190612d2e565b610e56565b005b34801561052757600080fd5b50610542600480360381019061053d9190612c79565b610fba565b005b34801561055057600080fd5b5061055961104d565b6040516105669190612c0d565b60405180910390f35b34801561057b57600080fd5b506105966004803603810190610591919061308e565b6110e2565b005b3480156105a457600080fd5b506105ad611250565b6040516105ba9190612d7d565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613196565b611266565b005b3480156105f857600080fd5b50610613600480360381019061060e9190613293565b6113cf565b005b34801561062157600080fd5b5061062a61144b565b6040516106379190612e9c565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612c79565b611464565b6040516106749190612c0d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612deb565b611590565b6040516106b19190612d7d565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613316565b6115fc565b6040516106ee9190612e9c565b60405180910390f35b34801561070357600080fd5b5061070c611692565b6040516107199190612d7d565b60405180910390f35b606060008001805461073390613385565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90613385565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c18261169e565b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613402565b60405180910390fd5b6000600e01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084982610b11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b09061346e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108f957506108f881336115fc565b5b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906134da565b60405180910390fd5b6109438383836116f2565b505050565b60006109526117a7565b6000600901546000600801540303905090565b6109708383836117b0565b505050565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080600060060160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660c8600f85610a199190613529565b610a2391906135b2565b915091509250929050565b610a49838383604051806020016040528060008152506113cf565b505050565b610a59816001611c77565b50565b6000610a678261169e565b9050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610af4576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006002019080519060200190610b0d929190612a8e565b5050565b6000610b1c82612066565b600001519050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bad576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600060030160006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c349061362f565b60405180910390fd5b6000600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d2e576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d949061362f565b60405180910390fd5b80600060060160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060050154905090565b610df86122fd565b6001600060100160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060030160009054906101000a900460ff16610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f9061369b565b60405180910390fd5b6000600701548110610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee69061372d565b60405180910390fd5b60006005015481610efe611250565b610f08919061374d565b10610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906137ef565b60405180910390fd5b80600060040154610f599190613529565b3414610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f919061385b565b60405180910390fd5b610fb68282604051806020016040528060008152506001612398565b5050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611040576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006004018190555050565b60606000600101805461105f90613385565b80601f016020809104026020016040519081016040528092919081815260200182805461108b90613385565b80156110d85780601f106110ad576101008083540402835291602001916110d8565b820191906000526020600020905b8154815290600101906020018083116110bb57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611147906138c7565b60405180910390fd5b806000600f0160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112449190612e9c565b60405180910390a35050565b600061125a6117a7565b60006008015403905090565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112ec576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156113ca5760008273ffffffffffffffffffffffffffffffffffffffff16611334858481518110611327576113266138e7565b5b6020026020010151612066565b6000015173ffffffffffffffffffffffffffffffffffffffff1614905080611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890613962565b60405180910390fd5b6113b68483815181106113a7576113a66138e7565b5b60200260200101516000611c77565b5080806113c290613982565b9150506112ef565b505050565b6113da8484846117b0565b6113f98373ffffffffffffffffffffffffffffffffffffffff16612789565b801561140e575061140c848484846127ac565b155b15611445576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60008060030160009054906101000a900460ff16905090565b606061146f8261169e565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590613402565b60405180910390fd5b60008060020180546114bf90613385565b80601f01602080910402602001604051908101604052809291908181526020018280546114eb90613385565b80156115385780601f1061150d57610100808354040283529160200191611538565b820191906000526020600020905b81548152906001019060200180831161151b57829003601f168201915b50505050509050600081510361155d5760405180602001604052806000815250611588565b80611567846128f5565b604051602001611578929190613a06565b6040516020818303038152906040525b915050919050565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080600f0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060040154905090565b6000816116a96117a7565b111580156116bb575060006008015482105b80156116eb57506000600c016000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826000600e01600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006117bb82612066565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613a76565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611871575061187085336115fc565b5b806118af57503373ffffffffffffffffffffffffffffffffffffffff16611897846107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e890613b08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195790613b74565b60405180910390fd5b61196d8585856001612a55565b611979600084876116f2565b60016000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016000600d0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600080600c0160008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600080600c0160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c05576000600801548214611c0457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c708585856001612a5b565b5050505050565b6000611c8283612066565b90506000816000015190508215611d575760008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cd55750611cd482336115fc565b5b80611d1357503373ffffffffffffffffffffffffffffffffffffffff16611cfb866107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613b08565b60405180910390fd5b505b611d65816000866001612a55565b611d71600085836116f2565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600080600c0160008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff0219169083151502179055506000600187019050600080600c0160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611fdd576000600801548214611fdc57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461204b816000866001612a5b565b60006009016000815480929190600101919050555050505050565b61206e612b14565b60008290508061207c6117a7565b1115801561208e575060006008015481105b156122c657600080600c0160008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122c457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121a55780925050506122f8565b5b6001156122c3578180600190039250506000600c0160008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122be5780925050506122f8565b6121a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612305612a61565b60040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d90613c06565b60405180910390fd5b565b600080600801549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790613b74565b60405180910390fd5b60008403612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a90613c72565b60405180910390fd5b6124606000868387612a55565b836000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846000600c01600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426000600c01600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561263657506126358773ffffffffffffffffffffffffffffffffffffffff16612789565b5b156126fe575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ab60008884806001019550886127ac565b6126e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361263c5782600060080154146126f957600080fd5b612769565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036126ff575b8160006008018190555050506127826000868387612a5b565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016127ed9493929190613ce7565b6020604051808303816000875af192505050801561282957506040513d601f19601f820116820180604052508101906128269190613d8b565b60015b6128a2573d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b50600081510361289a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000820361293c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a50565b600082905060005b6000821461296e57808061295790613982565b915050600a8261296791906135b2565b9150612944565b60008167ffffffffffffffff81111561298a57612989612ec1565b5b6040519080825280601f01601f1916602001820160405280156129bc5781602001600182028036833780820191505090505b5090505b60008514612a49576001826129d59190613db8565b9150600a856129e49190613dec565b60306129f0919061374d565b60f81b818381518110612a0657612a056138e7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a4291906135b2565b94506129c0565b8093505050505b919050565b50505050565b50505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b828054612a9a90613385565b90600052602060002090601f016020900481019282612abc5760008555612b03565b82601f10612ad557805160ff1916838001178555612b03565b82800160010185558215612b03579182015b82811115612b02578251825591602001919060010190612ae7565b5b509050612b109190612b57565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612b70576000816000905550600101612b58565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bae578082015181840152602081019050612b93565b83811115612bbd576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bdf82612b74565b612be98185612b7f565b9350612bf9818560208601612b90565b612c0281612bc3565b840191505092915050565b60006020820190508181036000830152612c278184612bd4565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612c5681612c43565b8114612c6157600080fd5b50565b600081359050612c7381612c4d565b92915050565b600060208284031215612c8f57612c8e612c39565b5b6000612c9d84828501612c64565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cd182612ca6565b9050919050565b612ce181612cc6565b82525050565b6000602082019050612cfc6000830184612cd8565b92915050565b612d0b81612cc6565b8114612d1657600080fd5b50565b600081359050612d2881612d02565b92915050565b60008060408385031215612d4557612d44612c39565b5b6000612d5385828601612d19565b9250506020612d6485828601612c64565b9150509250929050565b612d7781612c43565b82525050565b6000602082019050612d926000830184612d6e565b92915050565b600080600060608486031215612db157612db0612c39565b5b6000612dbf86828701612d19565b9350506020612dd086828701612d19565b9250506040612de186828701612c64565b9150509250925092565b600060208284031215612e0157612e00612c39565b5b6000612e0f84828501612d19565b91505092915050565b60008060408385031215612e2f57612e2e612c39565b5b6000612e3d85828601612c64565b9250506020612e4e85828601612c64565b9150509250929050565b6000604082019050612e6d6000830185612cd8565b612e7a6020830184612d6e565b9392505050565b60008115159050919050565b612e9681612e81565b82525050565b6000602082019050612eb16000830184612e8d565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ef982612bc3565b810181811067ffffffffffffffff82111715612f1857612f17612ec1565b5b80604052505050565b6000612f2b612c2f565b9050612f378282612ef0565b919050565b600067ffffffffffffffff821115612f5757612f56612ec1565b5b612f6082612bc3565b9050602081019050919050565b82818337600083830152505050565b6000612f8f612f8a84612f3c565b612f21565b905082815260208101848484011115612fab57612faa612ebc565b5b612fb6848285612f6d565b509392505050565b600082601f830112612fd357612fd2612eb7565b5b8135612fe3848260208601612f7c565b91505092915050565b60006020828403121561300257613001612c39565b5b600082013567ffffffffffffffff8111156130205761301f612c3e565b5b61302c84828501612fbe565b91505092915050565b61303e81612e81565b811461304957600080fd5b50565b60008135905061305b81613035565b92915050565b60006020828403121561307757613076612c39565b5b60006130858482850161304c565b91505092915050565b600080604083850312156130a5576130a4612c39565b5b60006130b385828601612d19565b92505060206130c48582860161304c565b9150509250929050565b600067ffffffffffffffff8211156130e9576130e8612ec1565b5b602082029050602081019050919050565b600080fd5b600061311261310d846130ce565b612f21565b90508083825260208201905060208402830185811115613135576131346130fa565b5b835b8181101561315e578061314a8882612c64565b845260208401935050602081019050613137565b5050509392505050565b600082601f83011261317d5761317c612eb7565b5b813561318d8482602086016130ff565b91505092915050565b600080604083850312156131ad576131ac612c39565b5b600083013567ffffffffffffffff8111156131cb576131ca612c3e565b5b6131d785828601613168565b92505060206131e885828601612d19565b9150509250929050565b600067ffffffffffffffff82111561320d5761320c612ec1565b5b61321682612bc3565b9050602081019050919050565b6000613236613231846131f2565b612f21565b90508281526020810184848401111561325257613251612ebc565b5b61325d848285612f6d565b509392505050565b600082601f83011261327a57613279612eb7565b5b813561328a848260208601613223565b91505092915050565b600080600080608085870312156132ad576132ac612c39565b5b60006132bb87828801612d19565b94505060206132cc87828801612d19565b93505060406132dd87828801612c64565b925050606085013567ffffffffffffffff8111156132fe576132fd612c3e565b5b61330a87828801613265565b91505092959194509250565b6000806040838503121561332d5761332c612c39565b5b600061333b85828601612d19565b925050602061334c85828601612d19565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339d57607f821691505b6020821081036133b0576133af613356565b5b50919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b60006133ec601483612b7f565b91506133f7826133b6565b602082019050919050565b6000602082019050818103600083015261341b816133df565b9050919050565b7f417070726f76616c20746f2063757272656e74206f776e657200000000000000600082015250565b6000613458601983612b7f565b915061346382613422565b602082019050919050565b600060208201905081810360008301526134878161344b565b9050919050565b7f417070726f76616c2064656e6965640000000000000000000000000000000000600082015250565b60006134c4600f83612b7f565b91506134cf8261348e565b602082019050919050565b600060208201905081810360008301526134f3816134b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353482612c43565b915061353f83612c43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613578576135776134fa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135bd82612c43565b91506135c883612c43565b9250826135d8576135d7613583565b5b828204905092915050565b7f41646472657373206973205a65726f0000000000000000000000000000000000600082015250565b6000613619600f83612b7f565b9150613624826135e3565b602082019050919050565b600060208201905081810360008301526136488161360c565b9050919050565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b6000613685601083612b7f565b91506136908261364f565b602082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f5175616e74697479206d6f7265207468616e20616c6c6f77656420706572207460008201527f72616e73616374696f6e00000000000000000000000000000000000000000000602082015250565b6000613717602a83612b7f565b9150613722826136bb565b604082019050919050565b600060208201905081810360008301526137468161370a565b9050919050565b600061375882612c43565b915061376383612c43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613798576137976134fa565b5b828201905092915050565b7f5175616e74697479206d6f7265207468616e2072656d61696e696e6700000000600082015250565b60006137d9601c83612b7f565b91506137e4826137a3565b602082019050919050565b60006020820190508181036000830152613808816137cc565b9050919050565b7f496e636f727265637420616d6f756e742073656e740000000000000000000000600082015250565b6000613845601583612b7f565b91506138508261380f565b602082019050919050565b6000602082019050818103600083015261387481613838565b9050919050565b7f417070726f766520746f2063616c6c6572000000000000000000000000000000600082015250565b60006138b1601183612b7f565b91506138bc8261387b565b602082019050919050565b600060208201905081810360008301526138e0816138a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e206e6f74206f776e65642062792061646472657373000000000000600082015250565b600061394c601a83612b7f565b915061395782613916565b602082019050919050565b6000602082019050818103600083015261397b8161393f565b9050919050565b600061398d82612c43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139bf576139be6134fa565b5b600182019050919050565b600081905092915050565b60006139e082612b74565b6139ea81856139ca565b93506139fa818560208601612b90565b80840191505092915050565b6000613a1282856139d5565b9150613a1e82846139d5565b91508190509392505050565b7f5472616e736665722066726f6d20696e636f7272656374206f776e6572000000600082015250565b6000613a60601d83612b7f565b9150613a6b82613a2a565b602082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b7f5472616e736665722063616c6c6572206e6f74206f776e6572206e6f7220617060008201527f70726f7665640000000000000000000000000000000000000000000000000000602082015250565b6000613af2602683612b7f565b9150613afd82613a96565b604082019050919050565b60006020820190508181036000830152613b2181613ae5565b9050919050565b7f41646472657373206973207a65726f0000000000000000000000000000000000600082015250565b6000613b5e600f83612b7f565b9150613b6982613b28565b602082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f4c69624469616d6f6e643a204d75737420626520636f6e7472616374206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf0602283612b7f565b9150613bfb82613b94565b604082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b7f5175616e74697479206973207a65726f00000000000000000000000000000000600082015250565b6000613c5c601083612b7f565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cb982613c92565b613cc38185613c9d565b9350613cd3818560208601612b90565b613cdc81612bc3565b840191505092915050565b6000608082019050613cfc6000830187612cd8565b613d096020830186612cd8565b613d166040830185612d6e565b8181036060830152613d288184613cae565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d6881613d33565b8114613d7357600080fd5b50565b600081519050613d8581613d5f565b92915050565b600060208284031215613da157613da0612c39565b5b6000613daf84828501613d76565b91505092915050565b6000613dc382612c43565b9150613dce83612c43565b925082821015613de157613de06134fa565b5b828203905092915050565b6000613df782612c43565b9150613e0283612c43565b925082613e1257613e11613583565b5b82820690509291505056fea264697066735822122093199c392f89bafc45667441976fef8ac0627a0b85ebd97c75c52915d2378ab264736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80637266408d116100f7578063a2309ff811610095578063c87b56dd11610064578063c87b56dd14610640578063dc33e6811461067d578063e985e9c5146106ba578063f176ea12146106f7576101c2565b8063a2309ff814610598578063acf1941c146105c3578063b88d4fde146105ec578063bcc9ca5b14610615576101c2565b80638de93222116100d15780638de93222146104ff57806391b7f5ed1461051b57806395d89b4114610544578063a22cb4651461056f576101c2565b80637266408d146104825780637e26639f146104ab578063825a229e146104d6576101c2565b806342842e0e1161016457806355f804b31161013e57806355f804b3146103b65780636352211e146103df5780636387f8041461041c57806370a0823114610445576101c2565b806342842e0e1461032757806342966c68146103505780634f558e7914610379576101c2565b806318160ddd116101a057806318160ddd1461025857806323b872dd146102835780632478d639146102ac5780632a55205a146102e9576101c2565b806306fdde03146101c7578063081812fc146101f2578063095ea7b31461022f575b600080fd5b3480156101d357600080fd5b506101dc610722565b6040516101e99190612c0d565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190612c79565b6107b6565b6040516102269190612ce7565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612d2e565b61083e565b005b34801561026457600080fd5b5061026d610948565b60405161027a9190612d7d565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612d98565b610965565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612deb565b610975565b6040516102e09190612d7d565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e18565b6109e1565b60405161031e929190612e58565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190612d98565b610a2e565b005b34801561035c57600080fd5b5061037760048036038101906103729190612c79565b610a4e565b005b34801561038557600080fd5b506103a0600480360381019061039b9190612c79565b610a5c565b6040516103ad9190612e9c565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190612fec565b610a6e565b005b3480156103eb57600080fd5b5061040660048036038101906104019190612c79565b610b11565b6040516104139190612ce7565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613061565b610b27565b005b34801561045157600080fd5b5061046c60048036038101906104679190612deb565b610bcd565b6040516104799190612d7d565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612deb565b610ca8565b005b3480156104b757600080fd5b506104c0610de4565b6040516104cd9190612d7d565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190612deb565b610df0565b005b61051960048036038101906105149190612d2e565b610e56565b005b34801561052757600080fd5b50610542600480360381019061053d9190612c79565b610fba565b005b34801561055057600080fd5b5061055961104d565b6040516105669190612c0d565b60405180910390f35b34801561057b57600080fd5b506105966004803603810190610591919061308e565b6110e2565b005b3480156105a457600080fd5b506105ad611250565b6040516105ba9190612d7d565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190613196565b611266565b005b3480156105f857600080fd5b50610613600480360381019061060e9190613293565b6113cf565b005b34801561062157600080fd5b5061062a61144b565b6040516106379190612e9c565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612c79565b611464565b6040516106749190612c0d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612deb565b611590565b6040516106b19190612d7d565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613316565b6115fc565b6040516106ee9190612e9c565b60405180910390f35b34801561070357600080fd5b5061070c611692565b6040516107199190612d7d565b60405180910390f35b606060008001805461073390613385565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90613385565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c18261169e565b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613402565b60405180910390fd5b6000600e01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084982610b11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b09061346e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108f957506108f881336115fc565b5b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906134da565b60405180910390fd5b6109438383836116f2565b505050565b60006109526117a7565b6000600901546000600801540303905090565b6109708383836117b0565b505050565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080600060060160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660c8600f85610a199190613529565b610a2391906135b2565b915091509250929050565b610a49838383604051806020016040528060008152506113cf565b505050565b610a59816001611c77565b50565b6000610a678261169e565b9050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610af4576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006002019080519060200190610b0d929190612a8e565b5050565b6000610b1c82612066565b600001519050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bad576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600060030160006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c349061362f565b60405180910390fd5b6000600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d2e576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d949061362f565b60405180910390fd5b80600060060160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060050154905090565b610df86122fd565b6001600060100160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060030160009054906101000a900460ff16610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f9061369b565b60405180910390fd5b6000600701548110610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee69061372d565b60405180910390fd5b60006005015481610efe611250565b610f08919061374d565b10610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906137ef565b60405180910390fd5b80600060040154610f599190613529565b3414610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f919061385b565b60405180910390fd5b610fb68282604051806020016040528060008152506001612398565b5050565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611040576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006004018190555050565b60606000600101805461105f90613385565b80601f016020809104026020016040519081016040528092919081815260200182805461108b90613385565b80156110d85780601f106110ad576101008083540402835291602001916110d8565b820191906000526020600020905b8154815290600101906020018083116110bb57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611147906138c7565b60405180910390fd5b806000600f0160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112449190612e9c565b60405180910390a35050565b600061125a6117a7565b60006008015403905090565b600060100160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112ec576040517f344e1b3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156113ca5760008273ffffffffffffffffffffffffffffffffffffffff16611334858481518110611327576113266138e7565b5b6020026020010151612066565b6000015173ffffffffffffffffffffffffffffffffffffffff1614905080611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890613962565b60405180910390fd5b6113b68483815181106113a7576113a66138e7565b5b60200260200101516000611c77565b5080806113c290613982565b9150506112ef565b505050565b6113da8484846117b0565b6113f98373ffffffffffffffffffffffffffffffffffffffff16612789565b801561140e575061140c848484846127ac565b155b15611445576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60008060030160009054906101000a900460ff16905090565b606061146f8261169e565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590613402565b60405180910390fd5b60008060020180546114bf90613385565b80601f01602080910402602001604051908101604052809291908181526020018280546114eb90613385565b80156115385780601f1061150d57610100808354040283529160200191611538565b820191906000526020600020905b81548152906001019060200180831161151b57829003601f168201915b50505050509050600081510361155d5760405180602001604052806000815250611588565b80611567846128f5565b604051602001611578929190613a06565b6040516020818303038152906040525b915050919050565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080600f0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060040154905090565b6000816116a96117a7565b111580156116bb575060006008015482105b80156116eb57506000600c016000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826000600e01600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006117bb82612066565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613a76565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611871575061187085336115fc565b5b806118af57503373ffffffffffffffffffffffffffffffffffffffff16611897846107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e890613b08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195790613b74565b60405180910390fd5b61196d8585856001612a55565b611979600084876116f2565b60016000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016000600d0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600080600c0160008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600080600c0160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c05576000600801548214611c0457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c708585856001612a5b565b5050505050565b6000611c8283612066565b90506000816000015190508215611d575760008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cd55750611cd482336115fc565b5b80611d1357503373ffffffffffffffffffffffffffffffffffffffff16611cfb866107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613b08565b60405180910390fd5b505b611d65816000866001612a55565b611d71600085836116f2565b600080600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600080600c0160008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff0219169083151502179055506000600187019050600080600c0160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611fdd576000600801548214611fdc57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461204b816000866001612a5b565b60006009016000815480929190600101919050555050505050565b61206e612b14565b60008290508061207c6117a7565b1115801561208e575060006008015481105b156122c657600080600c0160008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122c457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121a55780925050506122f8565b5b6001156122c3578180600190039250506000600c0160008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122be5780925050506122f8565b6121a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612305612a61565b60040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d90613c06565b60405180910390fd5b565b600080600801549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790613b74565b60405180910390fd5b60008403612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a90613c72565b60405180910390fd5b6124606000868387612a55565b836000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836000600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846000600c01600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426000600c01600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561263657506126358773ffffffffffffffffffffffffffffffffffffffff16612789565b5b156126fe575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ab60008884806001019550886127ac565b6126e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361263c5782600060080154146126f957600080fd5b612769565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036126ff575b8160006008018190555050506127826000868387612a5b565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016127ed9493929190613ce7565b6020604051808303816000875af192505050801561282957506040513d601f19601f820116820180604052508101906128269190613d8b565b60015b6128a2573d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b50600081510361289a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000820361293c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a50565b600082905060005b6000821461296e57808061295790613982565b915050600a8261296791906135b2565b9150612944565b60008167ffffffffffffffff81111561298a57612989612ec1565b5b6040519080825280601f01601f1916602001820160405280156129bc5781602001600182028036833780820191505090505b5090505b60008514612a49576001826129d59190613db8565b9150600a856129e49190613dec565b60306129f0919061374d565b60f81b818381518110612a0657612a056138e7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a4291906135b2565b94506129c0565b8093505050505b919050565b50505050565b50505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b828054612a9a90613385565b90600052602060002090601f016020900481019282612abc5760008555612b03565b82601f10612ad557805160ff1916838001178555612b03565b82800160010185558215612b03579182015b82811115612b02578251825591602001919060010190612ae7565b5b509050612b109190612b57565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612b70576000816000905550600101612b58565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bae578082015181840152602081019050612b93565b83811115612bbd576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bdf82612b74565b612be98185612b7f565b9350612bf9818560208601612b90565b612c0281612bc3565b840191505092915050565b60006020820190508181036000830152612c278184612bd4565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612c5681612c43565b8114612c6157600080fd5b50565b600081359050612c7381612c4d565b92915050565b600060208284031215612c8f57612c8e612c39565b5b6000612c9d84828501612c64565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cd182612ca6565b9050919050565b612ce181612cc6565b82525050565b6000602082019050612cfc6000830184612cd8565b92915050565b612d0b81612cc6565b8114612d1657600080fd5b50565b600081359050612d2881612d02565b92915050565b60008060408385031215612d4557612d44612c39565b5b6000612d5385828601612d19565b9250506020612d6485828601612c64565b9150509250929050565b612d7781612c43565b82525050565b6000602082019050612d926000830184612d6e565b92915050565b600080600060608486031215612db157612db0612c39565b5b6000612dbf86828701612d19565b9350506020612dd086828701612d19565b9250506040612de186828701612c64565b9150509250925092565b600060208284031215612e0157612e00612c39565b5b6000612e0f84828501612d19565b91505092915050565b60008060408385031215612e2f57612e2e612c39565b5b6000612e3d85828601612c64565b9250506020612e4e85828601612c64565b9150509250929050565b6000604082019050612e6d6000830185612cd8565b612e7a6020830184612d6e565b9392505050565b60008115159050919050565b612e9681612e81565b82525050565b6000602082019050612eb16000830184612e8d565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ef982612bc3565b810181811067ffffffffffffffff82111715612f1857612f17612ec1565b5b80604052505050565b6000612f2b612c2f565b9050612f378282612ef0565b919050565b600067ffffffffffffffff821115612f5757612f56612ec1565b5b612f6082612bc3565b9050602081019050919050565b82818337600083830152505050565b6000612f8f612f8a84612f3c565b612f21565b905082815260208101848484011115612fab57612faa612ebc565b5b612fb6848285612f6d565b509392505050565b600082601f830112612fd357612fd2612eb7565b5b8135612fe3848260208601612f7c565b91505092915050565b60006020828403121561300257613001612c39565b5b600082013567ffffffffffffffff8111156130205761301f612c3e565b5b61302c84828501612fbe565b91505092915050565b61303e81612e81565b811461304957600080fd5b50565b60008135905061305b81613035565b92915050565b60006020828403121561307757613076612c39565b5b60006130858482850161304c565b91505092915050565b600080604083850312156130a5576130a4612c39565b5b60006130b385828601612d19565b92505060206130c48582860161304c565b9150509250929050565b600067ffffffffffffffff8211156130e9576130e8612ec1565b5b602082029050602081019050919050565b600080fd5b600061311261310d846130ce565b612f21565b90508083825260208201905060208402830185811115613135576131346130fa565b5b835b8181101561315e578061314a8882612c64565b845260208401935050602081019050613137565b5050509392505050565b600082601f83011261317d5761317c612eb7565b5b813561318d8482602086016130ff565b91505092915050565b600080604083850312156131ad576131ac612c39565b5b600083013567ffffffffffffffff8111156131cb576131ca612c3e565b5b6131d785828601613168565b92505060206131e885828601612d19565b9150509250929050565b600067ffffffffffffffff82111561320d5761320c612ec1565b5b61321682612bc3565b9050602081019050919050565b6000613236613231846131f2565b612f21565b90508281526020810184848401111561325257613251612ebc565b5b61325d848285612f6d565b509392505050565b600082601f83011261327a57613279612eb7565b5b813561328a848260208601613223565b91505092915050565b600080600080608085870312156132ad576132ac612c39565b5b60006132bb87828801612d19565b94505060206132cc87828801612d19565b93505060406132dd87828801612c64565b925050606085013567ffffffffffffffff8111156132fe576132fd612c3e565b5b61330a87828801613265565b91505092959194509250565b6000806040838503121561332d5761332c612c39565b5b600061333b85828601612d19565b925050602061334c85828601612d19565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339d57607f821691505b6020821081036133b0576133af613356565b5b50919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b60006133ec601483612b7f565b91506133f7826133b6565b602082019050919050565b6000602082019050818103600083015261341b816133df565b9050919050565b7f417070726f76616c20746f2063757272656e74206f776e657200000000000000600082015250565b6000613458601983612b7f565b915061346382613422565b602082019050919050565b600060208201905081810360008301526134878161344b565b9050919050565b7f417070726f76616c2064656e6965640000000000000000000000000000000000600082015250565b60006134c4600f83612b7f565b91506134cf8261348e565b602082019050919050565b600060208201905081810360008301526134f3816134b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353482612c43565b915061353f83612c43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613578576135776134fa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135bd82612c43565b91506135c883612c43565b9250826135d8576135d7613583565b5b828204905092915050565b7f41646472657373206973205a65726f0000000000000000000000000000000000600082015250565b6000613619600f83612b7f565b9150613624826135e3565b602082019050919050565b600060208201905081810360008301526136488161360c565b9050919050565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b6000613685601083612b7f565b91506136908261364f565b602082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f5175616e74697479206d6f7265207468616e20616c6c6f77656420706572207460008201527f72616e73616374696f6e00000000000000000000000000000000000000000000602082015250565b6000613717602a83612b7f565b9150613722826136bb565b604082019050919050565b600060208201905081810360008301526137468161370a565b9050919050565b600061375882612c43565b915061376383612c43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613798576137976134fa565b5b828201905092915050565b7f5175616e74697479206d6f7265207468616e2072656d61696e696e6700000000600082015250565b60006137d9601c83612b7f565b91506137e4826137a3565b602082019050919050565b60006020820190508181036000830152613808816137cc565b9050919050565b7f496e636f727265637420616d6f756e742073656e740000000000000000000000600082015250565b6000613845601583612b7f565b91506138508261380f565b602082019050919050565b6000602082019050818103600083015261387481613838565b9050919050565b7f417070726f766520746f2063616c6c6572000000000000000000000000000000600082015250565b60006138b1601183612b7f565b91506138bc8261387b565b602082019050919050565b600060208201905081810360008301526138e0816138a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e206e6f74206f776e65642062792061646472657373000000000000600082015250565b600061394c601a83612b7f565b915061395782613916565b602082019050919050565b6000602082019050818103600083015261397b8161393f565b9050919050565b600061398d82612c43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139bf576139be6134fa565b5b600182019050919050565b600081905092915050565b60006139e082612b74565b6139ea81856139ca565b93506139fa818560208601612b90565b80840191505092915050565b6000613a1282856139d5565b9150613a1e82846139d5565b91508190509392505050565b7f5472616e736665722066726f6d20696e636f7272656374206f776e6572000000600082015250565b6000613a60601d83612b7f565b9150613a6b82613a2a565b602082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b7f5472616e736665722063616c6c6572206e6f74206f776e6572206e6f7220617060008201527f70726f7665640000000000000000000000000000000000000000000000000000602082015250565b6000613af2602683612b7f565b9150613afd82613a96565b604082019050919050565b60006020820190508181036000830152613b2181613ae5565b9050919050565b7f41646472657373206973207a65726f0000000000000000000000000000000000600082015250565b6000613b5e600f83612b7f565b9150613b6982613b28565b602082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f4c69624469616d6f6e643a204d75737420626520636f6e7472616374206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf0602283612b7f565b9150613bfb82613b94565b604082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b7f5175616e74697479206973207a65726f00000000000000000000000000000000600082015250565b6000613c5c601083612b7f565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cb982613c92565b613cc38185613c9d565b9350613cd3818560208601612b90565b613cdc81612bc3565b840191505092915050565b6000608082019050613cfc6000830187612cd8565b613d096020830186612cd8565b613d166040830185612d6e565b8181036060830152613d288184613cae565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d6881613d33565b8114613d7357600080fd5b50565b600081519050613d8581613d5f565b92915050565b600060208284031215613da157613da0612c39565b5b6000613daf84828501613d76565b91505092915050565b6000613dc382612c43565b9150613dce83612c43565b925082821015613de157613de06134fa565b5b828203905092915050565b6000613df782612c43565b9150613e0283612c43565b925082613e1257613e11613583565b5b82820690509291505056fea264697066735822122093199c392f89bafc45667441976fef8ac0627a0b85ebd97c75c52915d2378ab264736f6c634300080d0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.