Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
4,623 MFGACHA
Holders
1,219
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MFGACHA
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.17; import {ERC1155} from "@thirdweb-dev/contracts/eip/ERC1155.sol"; import "@thirdweb-dev/contracts/extension/Ownable.sol"; import "@thirdweb-dev/contracts/extension/BatchMintMetadata.sol"; import "@thirdweb-dev/contracts/extension/LazyMint.sol"; import "@thirdweb-dev/contracts/lib/TWStrings.sol"; import "@thirdweb-dev/contracts/openzeppelin-presets/security/ReentrancyGuard.sol"; /** * WWWWWWWWW WNNNW * WNXK0OkkxxxxxxkkOO0XNW N0xdddx0N * WNX0kxoooooooooooooooooodkOKNW NOoooooookN * WXOxooooooooooooooooooooooooooxOXW NkoooooooxX * WXkdoooooooooooooooooooooooooooooookKW WKxoooooxKW * NOdoooooooooooooooooooooooooooooooooodK NX000KN * WKxoooooooooooooooooooodkOOOxooooooooodKW * WKdoooooooooooooooooooxOKW WNOdooooooxXW * Kxoooooooooooooooooood0WW WKxooookX W * NkoooooooooooddxdoooooON NOooON WKOX * W0dooooooooodOXNNXOdooxX WKKW WKdoOW * WOoooooooood0W WXkxKW N0dooxN * NkoooooooookN WNW NKX NkooooxX * NkooooooooxX WOoxKW WXxoooooxX * WOoooooooo0W WKdoodON WKxooooookN * XdooooookN WXN Xxooooox0KKKkdooooooo0W * WOooooodKW W0dkXW NOoooooooooooooooooookN * NkooooOW XxoodOKXX00koooooooooooooooooooxXW * XkoooOW NOoooooodooooooooooooooooooooooxKW * NOdodOKXXKkdooooooooooooooooooooooooooookXW * WKkoooddooooooooooooooooooooooooooooox0N * WKkdooooooooooooooooooooooooooooox0NW * WXOxdoooooooooooooooooooooooxOKN * WXKOkxdooooooooooooddxO0XN * WNXKK00OOOO000KXNW * WWWWWWWWW * * BASE: ERC1155Base * EXTENSION: LazyMint * * The `MFGACHA` smart contract implements the ERC1155 NFT standard. * It includes the following additions to standard ERC1155 logic: * * - Lazy minting * * - Ability to mint NFTs via the provided `mintTo` and `batchMintTo` functions. * * - Ownership of the contract, with the ability to restrict certain functions to * only be called by the contract's owner. * * * The `MFGACHA` contract uses the `LazyMint` extension. * * 'Lazy minting' means defining the metadata of NFTs without minting it to an address. Regular 'minting' * of NFTs means actually assigning an owner to an NFT. * * As a contract admin, this lets you prepare the metadata for NFTs that will be minted by an external party, * without paying the gas cost for actually minting the NFTs. * */ contract MFGACHA is ERC1155, Ownable, BatchMintMetadata, LazyMint, ReentrancyGuard { using TWStrings for uint256; /// @notice The end time(unix timestamp) of the claim duration uint256 public claimEndTimestamp; /*////////////////////////////////////////////////////////////// Mappings //////////////////////////////////////////////////////////////*/ /** * @notice Returns the total supply of NFTs of a given tokenId * @dev Mapping from tokenId => total circulating supply of NFTs of that tokenId. */ mapping(uint256 => uint256) public totalSupply; /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint256 _claimEndTimestamp ) ERC1155(_name, _symbol) { _setupOwner(msg.sender); claimEndTimestamp = _claimEndTimestamp; } /*////////////////////////////////////////////////////////////// Overriden metadata logic //////////////////////////////////////////////////////////////*/ /// @notice Returns the metadata URI for the given tokenId. function uri( uint256 _tokenId ) public view virtual override returns (string memory) { string memory batchUri = _getBaseURI(_tokenId); return string(abi.encodePacked(batchUri, _tokenId.toString())); } /*////////////////////////////////////////////////////////////// CLAIM LOGIC //////////////////////////////////////////////////////////////*/ /// @dev Emitted when tokens are claimed event TokensClaimed( address indexed claimer, uint256 indexed tokenId, uint256 quantityClaimed ); /** * @dev The logic in `verifyClaim` determines whether the caller is authorized to mint NFTs. * The logic in `transferTokensOnClaim` does actual minting of tokens, * can also be used to apply other state changes. * * @param _tokenId The tokenId of the lazy minted NFT to mint. */ function _claim(uint256 _tokenId) internal { verifyClaim(_tokenId); // Add your claim verification logic by overriding this function. _mint(msg.sender, _tokenId, 1, ""); emit TokensClaimed(msg.sender, _tokenId, 1); } /** * @notice Lets an address claim multiple lazy minted NFTs at once to a recipient. * This function prevents any reentrant calls, and is not allowed to be overridden. * * Contract creators should override `verifyClaim` and `transferTokensOnClaim` * functions to create custom logic for verification and claiming, * for e.g. price collection, allowlist, max quantity, etc. * * @param _tokenId The tokenId of the lazy minted NFT to mint. */ function claim(uint256 _tokenId) public nonReentrant { _claim(_tokenId); } /** * @notice Let's try if you can't get the NFT you want. */ function claimAll() public nonReentrant { for (uint256 tokenId = 0; tokenId < nextTokenIdToMint(); tokenId++) { _claim(tokenId); } } /** * @notice Override this function to add logic for claim verification, based on conditions * such as allowlist, price, max quantity etc. * * @dev Checks a request to claim NFTs against a custom condition. * * @param _tokenId The tokenId of the lazy minted NFT to mint. */ function verifyClaim(uint256 _tokenId) public view { require(_tokenId < nextTokenIdToMint(), "invalid id"); require( block.timestamp < claimEndTimestamp, "The claimable period has ended." ); } /** * @notice Lets an owner or approved operator burn NFTs of the given tokenId. * * @param _owner The owner of the NFT to burn. * @param _tokenId The tokenId of the NFT to burn. * @param _amount The amount of the NFT to burn. */ function burn( address _owner, uint256 _tokenId, uint256 _amount ) external virtual { address caller = msg.sender; require( caller == _owner || isApprovedForAll[_owner][caller], "Unapproved caller" ); require( balanceOf[_owner][_tokenId] >= _amount, "Not enough tokens owned" ); _burn(_owner, _tokenId, _amount); } /** * @notice Lets an owner or approved operator burn NFTs of the given tokenIds. * * @param _owner The owner of the NFTs to burn. * @param _tokenIds The tokenIds of the NFTs to burn. * @param _amounts The amounts of the NFTs to burn. */ function burnBatch( address _owner, uint256[] memory _tokenIds, uint256[] memory _amounts ) external virtual { address caller = msg.sender; require( caller == _owner || isApprovedForAll[_owner][caller], "Unapproved caller" ); require(_tokenIds.length == _amounts.length, "Length mismatch"); for (uint256 i = 0; i < _tokenIds.length; i += 1) { require( balanceOf[_owner][_tokenIds[i]] >= _amounts[i], "Not enough tokens owned" ); } _burnBatch(_owner, _tokenIds, _amounts); } /** * @notice For owner to update claimEndTimestamp. * * @param _timestamp The end time(unix timestamp) of the claim duration. */ function setClaimEndTimestamp(uint256 _timestamp) external onlyOwner { claimEndTimestamp = _timestamp; } /*////////////////////////////////////////////////////////////// View functions //////////////////////////////////////////////////////////////*/ /// @notice The tokenId assigned to the next new NFT to be lazy minted. function nextTokenIdToMint() public view virtual returns (uint256) { return nextTokenIdToLazyMint; } /*////////////////////////////////////////////////////////////// Internal functions //////////////////////////////////////////////////////////////*/ /// @dev Returns whether lazy minting can be done in the given execution context. function _canLazyMint() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @dev Returns whether owner can be set in the given execution context. function _canSetOwner() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @dev Runs before every token transfer / mint / burn. function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { totalSupply[ids[i]] -= amounts[i]; } } } }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; import "./interface/IERC1155.sol"; import "./interface/IERC1155Metadata.sol"; import "./interface/IERC1155Receiver.sol"; contract ERC1155 is IERC1155, IERC1155Metadata { /*////////////////////////////////////////////////////////////// State variables //////////////////////////////////////////////////////////////*/ string public name; string public symbol; /*////////////////////////////////////////////////////////////// Mappings //////////////////////////////////////////////////////////////*/ mapping(address => mapping(uint256 => uint256)) public override balanceOf; mapping(address => mapping(address => bool)) public override isApprovedForAll; mapping(uint256 => string) internal _uri; /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// View functions //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI } function uri(uint256 tokenId) public view virtual override returns (string memory) { return _uri[tokenId]; } function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "LENGTH_MISMATCH"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf[accounts[i]][ids[i]]; } return batchBalances; } /*////////////////////////////////////////////////////////////// ERC1155 logic //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual override { address owner = msg.sender; require(owner != operator, "APPROVING_SELF"); isApprovedForAll[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED"); _safeTransferFrom(from, to, id, amount, data); } function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED"); _safeBatchTransferFrom(from, to, ids, amounts, data); } /*////////////////////////////////////////////////////////////// Internal logic //////////////////////////////////////////////////////////////*/ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "TO_ZERO_ADDR"); address operator = msg.sender; _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = balanceOf[from][id]; require(fromBalance >= amount, "INSUFFICIENT_BAL"); unchecked { balanceOf[from][id] = fromBalance - amount; } balanceOf[to][id] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "LENGTH_MISMATCH"); require(to != address(0), "TO_ZERO_ADDR"); address operator = msg.sender; _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = balanceOf[from][id]; require(fromBalance >= amount, "INSUFFICIENT_BAL"); unchecked { balanceOf[from][id] = fromBalance - amount; } balanceOf[to][id] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } function _setTokenURI(uint256 tokenId, string memory newuri) internal virtual { _uri[tokenId] = newuri; } function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "TO_ZERO_ADDR"); address operator = msg.sender; _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); balanceOf[to][id] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "TO_ZERO_ADDR"); require(ids.length == amounts.length, "LENGTH_MISMATCH"); address operator = msg.sender; _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { balanceOf[to][ids[i]] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "FROM_ZERO_ADDR"); address operator = msg.sender; _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = balanceOf[from][id]; require(fromBalance >= amount, "INSUFFICIENT_BAL"); unchecked { balanceOf[from][id] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "FROM_ZERO_ADDR"); require(ids.length == amounts.length, "LENGTH_MISMATCH"); address operator = msg.sender; _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = balanceOf[from][id]; require(fromBalance >= amount, "INSUFFICIENT_BAL"); unchecked { balanceOf[from][id] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.code.length > 0) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("TOKENS_REJECTED"); } } catch Error(string memory reason) { revert(reason); } catch { revert("!ERC1155RECEIVER"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.code.length > 0) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("TOKENS_REJECTED"); } } catch Error(string memory reason) { revert(reason); } catch { revert("!ERC1155RECEIVER"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** @title ERC-1155 Multi Token Standard @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ interface IERC1155 { /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_id` argument MUST be the token type being transferred. The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferSingle( address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value ); /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_ids` argument MUST be the list of tokens being transferred. The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferBatch( address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values ); /** @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled). */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". */ event URI(string _value, uint256 indexed _id); /** @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if balance of holder for token `_id` is lower than the `_value` sent. MUST revert on any other error. MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _id ID of the token type @param _value Transfer amount @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` */ function safeTransferFrom( address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data ) external; /** @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if length of `_ids` is not the same as length of `_values`. MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. MUST revert on any other error. MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _ids IDs of each token type (order and length must match _values array) @param _values Transfer amounts per token type (order and length must match _ids array) @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` */ function safeBatchTransferFrom( address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data ) external; /** @notice Get the balance of an account's Tokens. @param _owner The address of the token holder @param _id ID of the Token @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** @notice Get the balance of multiple account/token pairs @param _owners The addresses of the token holders @param _ids ID of the Tokens @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. @dev MUST emit the ApprovalForAll event on success. @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 Queries the approval status of an operator for a given owner. @param _owner The owner of the Tokens @param _operator Address of authorized operator @return True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** Note: The ERC-165 identifier for this interface is 0x0e89341c. */ interface IERC1155Metadata { /** @notice A distinct Uniform Resource Identifier (URI) for a given token. @dev URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". @return URI string */ function uri(uint256 _id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * @title Batch-mint Metadata * @notice The `BatchMintMetadata` is a contract extension for any base NFT contract. It lets the smart contract * using this extension set metadata for `n` number of NFTs all at once. This is enabled by storing a single * base URI for a batch of `n` NFTs, where the metadata for each NFT in a relevant batch is `baseURI/tokenId`. */ contract BatchMintMetadata { /// @dev Largest tokenId of each batch of tokens with the same baseURI. uint256[] private batchIds; /// @dev Mapping from id of a batch of tokens => to base URI for the respective batch of tokens. mapping(uint256 => string) private baseURI; /** * @notice Returns the count of batches of NFTs. * @dev Each batch of tokens has an in ID and an associated `baseURI`. * See {batchIds}. */ function getBaseURICount() public view returns (uint256) { return batchIds.length; } /** * @notice Returns the ID for the batch of tokens the given tokenId belongs to. * @dev See {getBaseURICount}. * @param _index ID of a token. */ function getBatchIdAtIndex(uint256 _index) public view returns (uint256) { if (_index >= getBaseURICount()) { revert("Invalid index"); } return batchIds[_index]; } /// @dev Returns the id for the batch of tokens the given tokenId belongs to. function _getBatchId(uint256 _tokenId) internal view returns (uint256 batchId, uint256 index) { uint256 numOfTokenBatches = getBaseURICount(); uint256[] memory indices = batchIds; for (uint256 i = 0; i < numOfTokenBatches; i += 1) { if (_tokenId < indices[i]) { index = i; batchId = indices[i]; return (batchId, index); } } revert("Invalid tokenId"); } /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId. function _getBaseURI(uint256 _tokenId) internal view returns (string memory) { uint256 numOfTokenBatches = getBaseURICount(); uint256[] memory indices = batchIds; for (uint256 i = 0; i < numOfTokenBatches; i += 1) { if (_tokenId < indices[i]) { return baseURI[indices[i]]; } } revert("Invalid tokenId"); } /// @dev Sets the base URI for the batch of tokens with the given batchId. function _setBaseURI(uint256 _batchId, string memory _baseURI) internal { baseURI[_batchId] = _baseURI; } /// @dev Mints a batch of tokenIds and associates a common baseURI to all those Ids. function _batchMintMetadata( uint256 _startId, uint256 _amountToMint, string memory _baseURIForTokens ) internal returns (uint256 nextTokenIdToMint, uint256 batchId) { batchId = _startId + _amountToMint; nextTokenIdToMint = batchId; batchIds.push(batchId); baseURI[batchId] = _baseURIForTokens; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "./interface/ILazyMint.sol"; import "./BatchMintMetadata.sol"; /** * The `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs * at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually * minting a non-zero balance of NFTs of those tokenIds. */ abstract contract LazyMint is ILazyMint, BatchMintMetadata { uint256 internal nextTokenIdToLazyMint; /** * @notice Lets an authorized address lazy mint a given amount of NFTs. * * @param _amount The number of NFTs to lazy mint. * @param _baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each * of those NFTs is `${baseURIForTokens}/${tokenId}`. * @param _data Additional bytes data to be used at the discretion of the consumer of the contract. * @return batchId A unique integer identifier for the batch of NFTs lazy minted together. */ function lazyMint( uint256 _amount, string calldata _baseURIForTokens, bytes calldata _data ) public virtual override returns (uint256 batchId) { if (!_canLazyMint()) { revert("Not authorized"); } if (_amount == 0) { revert("0 amt"); } uint256 startId = nextTokenIdToLazyMint; (nextTokenIdToLazyMint, batchId) = _batchMintMetadata(startId, _amount, _baseURIForTokens); emit TokensLazyMinted(startId, startId + _amount - 1, _baseURIForTokens, _data); return batchId; } /// @dev Returns whether lazy minting can be performed in the given execution context. function _canLazyMint() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "./interface/IOwnable.sol"; /** * @title Ownable * @notice Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ abstract contract Ownable is IOwnable { /// @dev Owner of the contract (purpose: OpenSea compatibility) address private _owner; /// @dev Reverts if caller is not the owner. modifier onlyOwner() { if (msg.sender != _owner) { revert("Not authorized"); } _; } /** * @notice Returns the owner of the contract. */ function owner() public view override returns (address) { return _owner; } /** * @notice Lets an authorized wallet set a new owner for the contract. * @param _newOwner The address to set as the new owner of the contract. */ function setOwner(address _newOwner) external override { if (!_canSetOwner()) { revert("Not authorized"); } _setupOwner(_newOwner); } /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin. function _setupOwner(address _newOwner) internal { address _prevOwner = _owner; _owner = _newOwner; emit OwnerUpdated(_prevOwner, _newOwner); } /// @dev Returns whether owner can be set in the given execution context. function _canSetOwner() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * Thirdweb's `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs * at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually * minting a non-zero balance of NFTs of those tokenIds. */ interface ILazyMint { /// @dev Emitted when tokens are lazy minted. event TokensLazyMinted(uint256 indexed startTokenId, uint256 endTokenId, string baseURI, bytes encryptedBaseURI); /** * @notice Lazy mints a given amount of NFTs. * * @param amount The number of NFTs to lazy mint. * * @param baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each * of those NFTs is `${baseURIForTokens}/${tokenId}`. * * @param extraData Additional bytes data to be used at the discretion of the consumer of the contract. * * @return batchId A unique integer identifier for the batch of NFTs lazy minted together. */ function lazyMint( uint256 amount, string calldata baseURIForTokens, bytes calldata extraData ) external returns (uint256 batchId); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ interface IOwnable { /// @dev Returns the owner of the contract. function owner() external view returns (address); /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin. function setOwner(address _newOwner) external; /// @dev Emitted when a new Owner is set. event OwnerUpdated(address indexed prevOwner, address indexed newOwner); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library TWStrings { 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 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "remappings": [ ":@thirdweb-dev/=node_modules/@thirdweb-dev/", ":ds-test/=lib/forge-std/lib/ds-test/src/", ":forge-std/=lib/forge-std/src/" ], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_claimEndTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantityClaimed","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"baseURI","type":"string"},{"indexed":false,"internalType":"bytes","name":"encryptedBaseURI","type":"bytes"}],"name":"TokensLazyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURICount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getBatchIdAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_baseURIForTokens","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"lazyMint","outputs":[{"internalType":"uint256","name":"batchId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setClaimEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"verifyClaim","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002a1338038062002a13833981016040819052620000349162000189565b828260006200004483826200028b565b5060016200005382826200028b565b5050600160095550620000663362000072565b600a5550620003579050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000ec57600080fd5b81516001600160401b0380821115620001095762000109620000c4565b604051601f8301601f19908116603f01168101908282118183101715620001345762000134620000c4565b816040528381526020925086838588010111156200015157600080fd5b600091505b8382101562000175578582018301518183018401529082019062000156565b600093810190920192909252949350505050565b6000806000606084860312156200019f57600080fd5b83516001600160401b0380821115620001b757600080fd5b620001c587838801620000da565b94506020860151915080821115620001dc57600080fd5b50620001eb86828701620000da565b925050604084015190509250925092565b600181811c908216806200021157607f821691505b6020821081036200023257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028657600081815260208120601f850160051c81016020861015620002615750805b601f850160051c820191505b8181101562000282578281556001016200026d565b5050505b505050565b81516001600160401b03811115620002a757620002a7620000c4565b620002bf81620002b88454620001fc565b8462000238565b602080601f831160018114620002f75760008415620002de5750858301515b600019600386901b1c1916600185901b17855562000282565b600085815260208120601f198616915b82811015620003285788860151825594840194600190910190840162000307565b5085821015620003475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126ac80620003676000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c80636b20c454116100c3578063c52645f21161007c578063c52645f2146102e8578063d1058e59146102fb578063d37c353b14610303578063e985e9c514610316578063f242432a14610344578063f5298aca1461035757600080fd5b80636b20c4541461026c5780638da5cb5b1461027f57806395d89b411461029a578063a22cb465146102a2578063bd85b039146102b5578063c0d7e2b6146102d557600080fd5b8063265385cd11610115578063265385cd1461020d5780632eb2c2d614610216578063379607f5146102295780633b1475a71461023c5780634e1273f41461024457806363b45e2d1461026457600080fd5b8062fdd58e1461015c57806301ffc9a71461019a57806306fdde03146101bd5780630e89341c146101d257806313af4035146101e55780632419f51b146101fa575b600080fd5b61018761016a366004611b91565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101ad6101a8366004611bd1565b61036a565b6040519015158152602001610191565b6101c56103bc565b6040516101919190611c45565b6101c56101e0366004611c58565b61044a565b6101f86101f3366004611c71565b61048b565b005b610187610208366004611c58565b6104c4565b610187600a5481565b6101f8610224366004611dd5565b610532565b6101f8610237366004611c58565b6105c1565b600854610187565b610257610252366004611e7e565b610629565b6040516101919190611f83565b600654610187565b6101f861027a366004611f96565b61073d565b6005546040516001600160a01b039091168152602001610191565b6101c56108df565b6101f86102b0366004612009565b6108ec565b6101876102c3366004611c58565b600b6020526000908152604090205481565b6101f86102e3366004611c58565b6109a3565b6101f86102f6366004611c58565b610a32565b6101f8610a61565b61018761031136600461208d565b610ae0565b6101ad610324366004612106565b600360209081526000928352604080842090915290825290205460ff1681565b6101f8610352366004612139565b610bed565b6101f861036536600461219d565b610c75565b60006301ffc9a760e01b6001600160e01b03198316148061039b5750636cdb3d1360e11b6001600160e01b03198316145b806103b657506303a24d0760e21b6001600160e01b03198316145b92915050565b600080546103c9906121d0565b80601f01602080910402602001604051908101604052809291908181526020018280546103f5906121d0565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b505050505081565b6060600061045783610d6a565b90508061046384610f06565b60405160200161047492919061220a565b604051602081830303815290604052915050919050565b61049361100e565b6104b85760405162461bcd60e51b81526004016104af90612239565b60405180910390fd5b6104c18161103b565b50565b60006104cf60065490565b821061050d5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016104af565b6006828154811061052057610520612261565b90600052602060002001549050919050565b6001600160a01b03851633148061056c57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b6105ad5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba858585858561108d565b5050505050565b6002600954036106135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095561062181611248565b506001600955565b6060815183511461064c5760405162461bcd60e51b81526004016104af90612277565b600083516001600160401b0381111561066757610667611c8c565b604051908082528060200260200182016040528015610690578160200160208202803683370190505b50905060005b845181101561073557600260008683815181106106b5576106b5612261565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008583815181106106f1576106f1612261565b602002602001015181526020019081526020016000205482828151811061071a5761071a612261565b602090810291909101015261072e816122b6565b9050610696565b509392505050565b336001600160a01b03841681148061077a57506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6107ba5760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b81518351146107fd5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016104af565b60005b83518110156108cd5782818151811061081b5761081b612261565b602002602001015160026000876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061085c5761085c612261565b602002602001015181526020019081526020016000205410156108bb5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108c66001826122cf565b9050610800565b506108d98484846112a8565b50505050565b600180546103c9906121d0565b336001600160a01b03831681036109365760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016104af565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60085481106109e15760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016104af565b600a5442106104c15760405162461bcd60e51b815260206004820152601f60248201527f54686520636c61696d61626c6520706572696f642068617320656e6465642e0060448201526064016104af565b6005546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016104af90612239565b600a55565b600260095403610ab35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095560005b60085481101561062157610ace81611248565b80610ad8816122b6565b915050610abb565b6000610aea61100e565b610b065760405162461bcd60e51b81526004016104af90612239565b85600003610b3e5760405162461bcd60e51b81526020600482015260056024820152640c08185b5d60da1b60448201526064016104af565b60006008549050610b86818888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061145d92505050565b6008919091559150807f2a0365091ef1a40953c670dce28177e37520648a6fdc91506bffac0ab045570d6001610bbc8a846122cf565b610bc691906122e2565b88888888604051610bdb95949392919061231e565b60405180910390a25095945050505050565b6001600160a01b038516331480610c2757506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b610c685760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba85858585856114c1565b336001600160a01b038416811480610cb257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610cf25760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b6001600160a01b0384166000908152600260209081526040808320868452909152902054821115610d5f5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108d98484846115ff565b60606000610d7760065490565b905060006006805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050905060005b82811015610ecb57818181518110610deb57610deb612261565b6020026020010151851015610eb95760076000838381518110610e1057610e10612261565b602002602001015181526020019081526020016000208054610e31906121d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d906121d0565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b50505050509350505050919050565b610ec46001826122cf565b9050610dd1565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016104af565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f41816122b6565b9150610f509050600a8361236d565b9150610f31565b6000816001600160401b03811115610f7157610f71611c8c565b6040519080825280601f01601f191660200182016040528015610f9b576020820181803683370190505b5090505b841561100657610fb06001836122e2565b9150610fbd600a86612381565b610fc89060306122cf565b60f81b818381518110610fdd57610fdd612261565b60200101906001600160f81b031916908160001a905350610fff600a8661236d565b9450610f9f565b949350505050565b60006110226005546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b81518351146110ae5760405162461bcd60e51b81526004016104af90612277565b6001600160a01b0384166110d45760405162461bcd60e51b81526004016104af90612395565b336110e3818787878787611724565b60005b84518110156111da57600085828151811061110357611103612261565b60200260200101519050600085838151811061112157611121612261565b6020908102919091018101516001600160a01b038b1660009081526002835260408082208683529093529190912054909150818110156111735760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d168352908152828220868352905290812080548492906111bf9084906122cf565b92505081905550505050806111d3906122b6565b90506110e6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161122a9291906123e5565b60405180910390a4611240818787878787611830565b505050505050565b611251816109a3565b61126d3382600160405180602001604052806000815250611983565b60405160018152819033907f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b9060200160405180910390a350565b6001600160a01b0383166112ef5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b80518251146113105760405162461bcd60e51b81526004016104af90612277565b600033905061133381856000868660405180602001604052806000815250611724565b60005b83518110156113fe57600084828151811061135357611353612261565b60200260200101519050600084838151811061137157611371612261565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156113c35760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03881660009081526002602090815260408083209583529490529290922091039055806113f6816122b6565b915050611336565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161144f9291906123e5565b60405180910390a450505050565b60008061146a84866122cf565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560008181526007602052604090209092508291506114b8848261245e565b50935093915050565b6001600160a01b0384166114e75760405162461bcd60e51b81526004016104af90612395565b336115068187876114f788611a4d565b61150088611a4d565b87611724565b6001600160a01b03861660009081526002602090815260408083208784529091529020548381101561154a5760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a168352908152828220888352905290812080548692906115969084906122cf565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f6828888888888611a98565b50505050505050565b6001600160a01b0383166116465760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b336116758185600061165787611a4d565b61166087611a4d565b60405180602001604052806000815250611724565b6001600160a01b0384166000908152600260209081526040808320868452909152902054828110156116b95760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0385166117ab5760005b83518110156117a95782818151811061175057611750612261565b6020026020010151600b600086848151811061176e5761176e612261565b60200260200101518152602001908152602001600020600082825461179391906122cf565b909155506117a29050816122b6565b9050611735565b505b6001600160a01b0384166112405760005b83518110156115f6578281815181106117d7576117d7612261565b6020026020010151600b60008684815181106117f5576117f5612261565b60200260200101518152602001908152602001600020600082825461181a91906122e2565b909155506118299050816122b6565b90506117bc565b6001600160a01b0384163b156112405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611874908990899088908890889060040161251d565b6020604051808303816000875af19250505080156118af575060408051601f3d908101601f191682019092526118ac9181019061256f565b60015b611931576118bb61258c565b806308c379a0036118f457506118cf6125a8565b806118da57506118f6565b8060405162461bcd60e51b81526004016104af9190611c45565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016104af565b6001600160e01b0319811663bc197c8160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b6001600160a01b0384166119a95760405162461bcd60e51b81526004016104af90612395565b336119ba816000876114f788611a4d565b6001600160a01b0385166000908152600260209081526040808320878452909152812080548592906119ed9084906122cf565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46105ba81600087878787611a98565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a8757611a87612261565b602090810291909101015292915050565b6001600160a01b0384163b156112405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611adc9089908990889088908890600401612631565b6020604051808303816000875af1925050508015611b17575060408051601f3d908101601f19168201909252611b149181019061256f565b60015b611b23576118bb61258c565b6001600160e01b0319811663f23a6e6160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b80356001600160a01b0381168114611b8c57600080fd5b919050565b60008060408385031215611ba457600080fd5b611bad83611b75565b946020939093013593505050565b6001600160e01b0319811681146104c157600080fd5b600060208284031215611be357600080fd5b8135611bee81611bbb565b9392505050565b60005b83811015611c10578181015183820152602001611bf8565b50506000910152565b60008151808452611c31816020860160208601611bf5565b601f01601f19169290920160200192915050565b602081526000611bee6020830184611c19565b600060208284031215611c6a57600080fd5b5035919050565b600060208284031215611c8357600080fd5b611bee82611b75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611cc757611cc7611c8c565b6040525050565b60006001600160401b03821115611ce757611ce7611c8c565b5060051b60200190565b600082601f830112611d0257600080fd5b81356020611d0f82611cce565b604051611d1c8282611ca2565b83815260059390931b8501820192828101915086841115611d3c57600080fd5b8286015b84811015611d575780358352918301918301611d40565b509695505050505050565b600082601f830112611d7357600080fd5b81356001600160401b03811115611d8c57611d8c611c8c565b604051611da3601f8301601f191660200182611ca2565b818152846020838601011115611db857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611ded57600080fd5b611df686611b75565b9450611e0460208701611b75565b935060408601356001600160401b0380821115611e2057600080fd5b611e2c89838a01611cf1565b94506060880135915080821115611e4257600080fd5b611e4e89838a01611cf1565b93506080880135915080821115611e6457600080fd5b50611e7188828901611d62565b9150509295509295909350565b60008060408385031215611e9157600080fd5b82356001600160401b0380821115611ea857600080fd5b818501915085601f830112611ebc57600080fd5b81356020611ec982611cce565b604051611ed68282611ca2565b83815260059390931b8501820192828101915089841115611ef657600080fd5b948201945b83861015611f1b57611f0c86611b75565b82529482019490820190611efb565b96505086013592505080821115611f3157600080fd5b50611f3e85828601611cf1565b9150509250929050565b600081518084526020808501945080840160005b83811015611f7857815187529582019590820190600101611f5c565b509495945050505050565b602081526000611bee6020830184611f48565b600080600060608486031215611fab57600080fd5b611fb484611b75565b925060208401356001600160401b0380821115611fd057600080fd5b611fdc87838801611cf1565b93506040860135915080821115611ff257600080fd5b50611fff86828701611cf1565b9150509250925092565b6000806040838503121561201c57600080fd5b61202583611b75565b91506020830135801515811461203a57600080fd5b809150509250929050565b60008083601f84011261205757600080fd5b5081356001600160401b0381111561206e57600080fd5b60208301915083602082850101111561208657600080fd5b9250929050565b6000806000806000606086880312156120a557600080fd5b8535945060208601356001600160401b03808211156120c357600080fd5b6120cf89838a01612045565b909650945060408801359150808211156120e857600080fd5b506120f588828901612045565b969995985093965092949392505050565b6000806040838503121561211957600080fd5b61212283611b75565b915061213060208401611b75565b90509250929050565b600080600080600060a0868803121561215157600080fd5b61215a86611b75565b945061216860208701611b75565b9350604086013592506060860135915060808601356001600160401b0381111561219157600080fd5b611e7188828901611d62565b6000806000606084860312156121b257600080fd5b6121bb84611b75565b95602085013595506040909401359392505050565b600181811c908216806121e457607f821691505b60208210810361220457634e487b7160e01b600052602260045260246000fd5b50919050565b6000835161221c818460208801611bf5565b835190830190612230818360208801611bf5565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016122c8576122c86122a0565b5060010190565b808201808211156103b6576103b66122a0565b818103818111156103b6576103b66122a0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8581526060602082015260006123386060830186886122f5565b828103604084015261234b8185876122f5565b98975050505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261237c5761237c612357565b500490565b60008261239057612390612357565b500690565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b6040815260006123f86040830185611f48565b828103602084015261240a8185611f48565b95945050505050565b601f82111561245957600081815260208120601f850160051c8101602086101561243a5750805b601f850160051c820191505b8181101561124057828155600101612446565b505050565b81516001600160401b0381111561247757612477611c8c565b61248b8161248584546121d0565b84612413565b602080601f8311600181146124c057600084156124a85750858301515b600019600386901b1c1916600185901b178555611240565b600085815260208120601f198616915b828110156124ef578886015182559484019460019091019084016124d0565b508582101561250d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a06040820181905260009061254990830186611f48565b828103606084015261255b8186611f48565b9050828103608084015261234b8185611c19565b60006020828403121561258157600080fd5b8151611bee81611bbb565b600060033d11156125a55760046000803e5060005160e01c5b90565b600060443d10156125b65790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156125e557505050505090565b82850191508151818111156125fd5750505050505090565b843d87010160208285010111156126175750505050505090565b61262660208286010187611ca2565b509095945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061266b90830184611c19565b97965050505050505056fea2646970667358221220d1a1f97110885c7651aec829c719a856586fc0e05975ac844ad93671b6821da164736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d4620474143484100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d46474143484100000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101575760003560e01c80636b20c454116100c3578063c52645f21161007c578063c52645f2146102e8578063d1058e59146102fb578063d37c353b14610303578063e985e9c514610316578063f242432a14610344578063f5298aca1461035757600080fd5b80636b20c4541461026c5780638da5cb5b1461027f57806395d89b411461029a578063a22cb465146102a2578063bd85b039146102b5578063c0d7e2b6146102d557600080fd5b8063265385cd11610115578063265385cd1461020d5780632eb2c2d614610216578063379607f5146102295780633b1475a71461023c5780634e1273f41461024457806363b45e2d1461026457600080fd5b8062fdd58e1461015c57806301ffc9a71461019a57806306fdde03146101bd5780630e89341c146101d257806313af4035146101e55780632419f51b146101fa575b600080fd5b61018761016a366004611b91565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101ad6101a8366004611bd1565b61036a565b6040519015158152602001610191565b6101c56103bc565b6040516101919190611c45565b6101c56101e0366004611c58565b61044a565b6101f86101f3366004611c71565b61048b565b005b610187610208366004611c58565b6104c4565b610187600a5481565b6101f8610224366004611dd5565b610532565b6101f8610237366004611c58565b6105c1565b600854610187565b610257610252366004611e7e565b610629565b6040516101919190611f83565b600654610187565b6101f861027a366004611f96565b61073d565b6005546040516001600160a01b039091168152602001610191565b6101c56108df565b6101f86102b0366004612009565b6108ec565b6101876102c3366004611c58565b600b6020526000908152604090205481565b6101f86102e3366004611c58565b6109a3565b6101f86102f6366004611c58565b610a32565b6101f8610a61565b61018761031136600461208d565b610ae0565b6101ad610324366004612106565b600360209081526000928352604080842090915290825290205460ff1681565b6101f8610352366004612139565b610bed565b6101f861036536600461219d565b610c75565b60006301ffc9a760e01b6001600160e01b03198316148061039b5750636cdb3d1360e11b6001600160e01b03198316145b806103b657506303a24d0760e21b6001600160e01b03198316145b92915050565b600080546103c9906121d0565b80601f01602080910402602001604051908101604052809291908181526020018280546103f5906121d0565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b505050505081565b6060600061045783610d6a565b90508061046384610f06565b60405160200161047492919061220a565b604051602081830303815290604052915050919050565b61049361100e565b6104b85760405162461bcd60e51b81526004016104af90612239565b60405180910390fd5b6104c18161103b565b50565b60006104cf60065490565b821061050d5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016104af565b6006828154811061052057610520612261565b90600052602060002001549050919050565b6001600160a01b03851633148061056c57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b6105ad5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba858585858561108d565b5050505050565b6002600954036106135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095561062181611248565b506001600955565b6060815183511461064c5760405162461bcd60e51b81526004016104af90612277565b600083516001600160401b0381111561066757610667611c8c565b604051908082528060200260200182016040528015610690578160200160208202803683370190505b50905060005b845181101561073557600260008683815181106106b5576106b5612261565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008583815181106106f1576106f1612261565b602002602001015181526020019081526020016000205482828151811061071a5761071a612261565b602090810291909101015261072e816122b6565b9050610696565b509392505050565b336001600160a01b03841681148061077a57506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6107ba5760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b81518351146107fd5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016104af565b60005b83518110156108cd5782818151811061081b5761081b612261565b602002602001015160026000876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061085c5761085c612261565b602002602001015181526020019081526020016000205410156108bb5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108c66001826122cf565b9050610800565b506108d98484846112a8565b50505050565b600180546103c9906121d0565b336001600160a01b03831681036109365760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016104af565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60085481106109e15760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016104af565b600a5442106104c15760405162461bcd60e51b815260206004820152601f60248201527f54686520636c61696d61626c6520706572696f642068617320656e6465642e0060448201526064016104af565b6005546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016104af90612239565b600a55565b600260095403610ab35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095560005b60085481101561062157610ace81611248565b80610ad8816122b6565b915050610abb565b6000610aea61100e565b610b065760405162461bcd60e51b81526004016104af90612239565b85600003610b3e5760405162461bcd60e51b81526020600482015260056024820152640c08185b5d60da1b60448201526064016104af565b60006008549050610b86818888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061145d92505050565b6008919091559150807f2a0365091ef1a40953c670dce28177e37520648a6fdc91506bffac0ab045570d6001610bbc8a846122cf565b610bc691906122e2565b88888888604051610bdb95949392919061231e565b60405180910390a25095945050505050565b6001600160a01b038516331480610c2757506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b610c685760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba85858585856114c1565b336001600160a01b038416811480610cb257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610cf25760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b6001600160a01b0384166000908152600260209081526040808320868452909152902054821115610d5f5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108d98484846115ff565b60606000610d7760065490565b905060006006805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050905060005b82811015610ecb57818181518110610deb57610deb612261565b6020026020010151851015610eb95760076000838381518110610e1057610e10612261565b602002602001015181526020019081526020016000208054610e31906121d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d906121d0565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b50505050509350505050919050565b610ec46001826122cf565b9050610dd1565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016104af565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f41816122b6565b9150610f509050600a8361236d565b9150610f31565b6000816001600160401b03811115610f7157610f71611c8c565b6040519080825280601f01601f191660200182016040528015610f9b576020820181803683370190505b5090505b841561100657610fb06001836122e2565b9150610fbd600a86612381565b610fc89060306122cf565b60f81b818381518110610fdd57610fdd612261565b60200101906001600160f81b031916908160001a905350610fff600a8661236d565b9450610f9f565b949350505050565b60006110226005546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b81518351146110ae5760405162461bcd60e51b81526004016104af90612277565b6001600160a01b0384166110d45760405162461bcd60e51b81526004016104af90612395565b336110e3818787878787611724565b60005b84518110156111da57600085828151811061110357611103612261565b60200260200101519050600085838151811061112157611121612261565b6020908102919091018101516001600160a01b038b1660009081526002835260408082208683529093529190912054909150818110156111735760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d168352908152828220868352905290812080548492906111bf9084906122cf565b92505081905550505050806111d3906122b6565b90506110e6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161122a9291906123e5565b60405180910390a4611240818787878787611830565b505050505050565b611251816109a3565b61126d3382600160405180602001604052806000815250611983565b60405160018152819033907f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b9060200160405180910390a350565b6001600160a01b0383166112ef5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b80518251146113105760405162461bcd60e51b81526004016104af90612277565b600033905061133381856000868660405180602001604052806000815250611724565b60005b83518110156113fe57600084828151811061135357611353612261565b60200260200101519050600084838151811061137157611371612261565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156113c35760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03881660009081526002602090815260408083209583529490529290922091039055806113f6816122b6565b915050611336565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161144f9291906123e5565b60405180910390a450505050565b60008061146a84866122cf565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560008181526007602052604090209092508291506114b8848261245e565b50935093915050565b6001600160a01b0384166114e75760405162461bcd60e51b81526004016104af90612395565b336115068187876114f788611a4d565b61150088611a4d565b87611724565b6001600160a01b03861660009081526002602090815260408083208784529091529020548381101561154a5760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a168352908152828220888352905290812080548692906115969084906122cf565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f6828888888888611a98565b50505050505050565b6001600160a01b0383166116465760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b336116758185600061165787611a4d565b61166087611a4d565b60405180602001604052806000815250611724565b6001600160a01b0384166000908152600260209081526040808320868452909152902054828110156116b95760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0385166117ab5760005b83518110156117a95782818151811061175057611750612261565b6020026020010151600b600086848151811061176e5761176e612261565b60200260200101518152602001908152602001600020600082825461179391906122cf565b909155506117a29050816122b6565b9050611735565b505b6001600160a01b0384166112405760005b83518110156115f6578281815181106117d7576117d7612261565b6020026020010151600b60008684815181106117f5576117f5612261565b60200260200101518152602001908152602001600020600082825461181a91906122e2565b909155506118299050816122b6565b90506117bc565b6001600160a01b0384163b156112405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611874908990899088908890889060040161251d565b6020604051808303816000875af19250505080156118af575060408051601f3d908101601f191682019092526118ac9181019061256f565b60015b611931576118bb61258c565b806308c379a0036118f457506118cf6125a8565b806118da57506118f6565b8060405162461bcd60e51b81526004016104af9190611c45565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016104af565b6001600160e01b0319811663bc197c8160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b6001600160a01b0384166119a95760405162461bcd60e51b81526004016104af90612395565b336119ba816000876114f788611a4d565b6001600160a01b0385166000908152600260209081526040808320878452909152812080548592906119ed9084906122cf565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46105ba81600087878787611a98565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a8757611a87612261565b602090810291909101015292915050565b6001600160a01b0384163b156112405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611adc9089908990889088908890600401612631565b6020604051808303816000875af1925050508015611b17575060408051601f3d908101601f19168201909252611b149181019061256f565b60015b611b23576118bb61258c565b6001600160e01b0319811663f23a6e6160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b80356001600160a01b0381168114611b8c57600080fd5b919050565b60008060408385031215611ba457600080fd5b611bad83611b75565b946020939093013593505050565b6001600160e01b0319811681146104c157600080fd5b600060208284031215611be357600080fd5b8135611bee81611bbb565b9392505050565b60005b83811015611c10578181015183820152602001611bf8565b50506000910152565b60008151808452611c31816020860160208601611bf5565b601f01601f19169290920160200192915050565b602081526000611bee6020830184611c19565b600060208284031215611c6a57600080fd5b5035919050565b600060208284031215611c8357600080fd5b611bee82611b75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611cc757611cc7611c8c565b6040525050565b60006001600160401b03821115611ce757611ce7611c8c565b5060051b60200190565b600082601f830112611d0257600080fd5b81356020611d0f82611cce565b604051611d1c8282611ca2565b83815260059390931b8501820192828101915086841115611d3c57600080fd5b8286015b84811015611d575780358352918301918301611d40565b509695505050505050565b600082601f830112611d7357600080fd5b81356001600160401b03811115611d8c57611d8c611c8c565b604051611da3601f8301601f191660200182611ca2565b818152846020838601011115611db857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611ded57600080fd5b611df686611b75565b9450611e0460208701611b75565b935060408601356001600160401b0380821115611e2057600080fd5b611e2c89838a01611cf1565b94506060880135915080821115611e4257600080fd5b611e4e89838a01611cf1565b93506080880135915080821115611e6457600080fd5b50611e7188828901611d62565b9150509295509295909350565b60008060408385031215611e9157600080fd5b82356001600160401b0380821115611ea857600080fd5b818501915085601f830112611ebc57600080fd5b81356020611ec982611cce565b604051611ed68282611ca2565b83815260059390931b8501820192828101915089841115611ef657600080fd5b948201945b83861015611f1b57611f0c86611b75565b82529482019490820190611efb565b96505086013592505080821115611f3157600080fd5b50611f3e85828601611cf1565b9150509250929050565b600081518084526020808501945080840160005b83811015611f7857815187529582019590820190600101611f5c565b509495945050505050565b602081526000611bee6020830184611f48565b600080600060608486031215611fab57600080fd5b611fb484611b75565b925060208401356001600160401b0380821115611fd057600080fd5b611fdc87838801611cf1565b93506040860135915080821115611ff257600080fd5b50611fff86828701611cf1565b9150509250925092565b6000806040838503121561201c57600080fd5b61202583611b75565b91506020830135801515811461203a57600080fd5b809150509250929050565b60008083601f84011261205757600080fd5b5081356001600160401b0381111561206e57600080fd5b60208301915083602082850101111561208657600080fd5b9250929050565b6000806000806000606086880312156120a557600080fd5b8535945060208601356001600160401b03808211156120c357600080fd5b6120cf89838a01612045565b909650945060408801359150808211156120e857600080fd5b506120f588828901612045565b969995985093965092949392505050565b6000806040838503121561211957600080fd5b61212283611b75565b915061213060208401611b75565b90509250929050565b600080600080600060a0868803121561215157600080fd5b61215a86611b75565b945061216860208701611b75565b9350604086013592506060860135915060808601356001600160401b0381111561219157600080fd5b611e7188828901611d62565b6000806000606084860312156121b257600080fd5b6121bb84611b75565b95602085013595506040909401359392505050565b600181811c908216806121e457607f821691505b60208210810361220457634e487b7160e01b600052602260045260246000fd5b50919050565b6000835161221c818460208801611bf5565b835190830190612230818360208801611bf5565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016122c8576122c86122a0565b5060010190565b808201808211156103b6576103b66122a0565b818103818111156103b6576103b66122a0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8581526060602082015260006123386060830186886122f5565b828103604084015261234b8185876122f5565b98975050505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261237c5761237c612357565b500490565b60008261239057612390612357565b500690565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b6040815260006123f86040830185611f48565b828103602084015261240a8185611f48565b95945050505050565b601f82111561245957600081815260208120601f850160051c8101602086101561243a5750805b601f850160051c820191505b8181101561124057828155600101612446565b505050565b81516001600160401b0381111561247757612477611c8c565b61248b8161248584546121d0565b84612413565b602080601f8311600181146124c057600084156124a85750858301515b600019600386901b1c1916600185901b178555611240565b600085815260208120601f198616915b828110156124ef578886015182559484019460019091019084016124d0565b508582101561250d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a06040820181905260009061254990830186611f48565b828103606084015261255b8186611f48565b9050828103608084015261234b8185611c19565b60006020828403121561258157600080fd5b8151611bee81611bbb565b600060033d11156125a55760046000803e5060005160e01c5b90565b600060443d10156125b65790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156125e557505050505090565b82850191508151818111156125fd5750505050505090565b843d87010160208285010111156126175750505050505090565b61262660208286010187611ca2565b509095945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061266b90830184611c19565b97965050505050505056fea2646970667358221220d1a1f97110885c7651aec829c719a856586fc0e05975ac844ad93671b6821da164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d4620474143484100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d46474143484100000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): MF GACHA
Arg [1] : _symbol (string): MFGACHA
Arg [2] : _claimEndTimestamp (uint256): 0
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4d46204741434841000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 4d46474143484100000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.