当前位置: 首页 > news >正文

NFT合约部署

  1. 部署合约:
    1.web3 NFT合约部署工具
    https://remix.ethereum.org/
    2.tron NFT合约部署工具
    https://www.tronide.io/
    3.部署 web3 ERC721代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";contract HuskyArt is ERC721, ERC721URIStorage, Ownable {using Counters for Counters.Counter;Counters.Counter private _tokenIdCounter;constructor() ERC721("HuskyArt", "HSA") {}function _baseURI() internal pure override returns (string memory) {return "https://example.com/nft/";}function safeMint(address to, string memory uri) public onlyOwner {uint256 tokenId = _tokenIdCounter.current();_tokenIdCounter.increment();_safeMint(to, tokenId);_setTokenURI(tokenId, uri);}// The following functions are overrides required by Solidity.function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {super._burn(tokenId);}function tokenURI(uint256 tokenId)publicviewoverride(ERC721, ERC721URIStorage)returns (string memory){return super.tokenURI(tokenId);}
}

部署 web3 ERC1155代码:

// Sources flattened with hardhat v2.10.1 https://hardhat.org// File @openzeppelin/contracts/utils/Strings.sol@v4.7.3// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)pragma solidity ^0.8.0;/*** @dev String operations.*/
library Strings {bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {// Inspired by OraclizeAPI's implementation - MIT licence// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.solif (value == 0) {return "0";}uint256 temp = value;uint256 digits;while (temp != 0) {digits++;temp /= 10;}bytes memory buffer = new bytes(digits);while (value != 0) {digits -= 1;buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));value /= 10;}return string(buffer);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.*/function toHexString(uint256 value) internal pure returns (string memory) {if (value == 0) {return "0x00";}uint256 temp = value;uint256 length = 0;while (temp != 0) {length++;temp >>= 8;}return toHexString(value, length);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.*/function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {bytes memory buffer = new bytes(2 * length + 2);buffer[0] = "0";buffer[1] = "x";for (uint256 i = 2 * length + 1; i > 1; --i) {buffer[i] = _HEX_SYMBOLS[value & 0xf];value >>= 4;}require(value == 0, "Strings: hex length insufficient");return string(buffer);}/*** @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.*/function toHexString(address addr) internal pure returns (string memory) {return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);}
}// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.7.3/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/
interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// File @openzeppelin/contracts/token/ERC1155/IERC1155.sol@v4.7.3/*** @dev Required interface of an ERC1155 compliant contract, as defined in the* https://eips.ethereum.org/EIPS/eip-1155[EIP].** _Available since v3.1._*/
interface IERC1155 is IERC165 {/*** @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.*/event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);/*** @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all* transfers.*/event TransferBatch(address indexed operator,address indexed from,address indexed to,uint256[] ids,uint256[] values);/*** @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to* `approved`.*/event ApprovalForAll(address indexed account, address indexed operator, bool approved);/*** @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.** If an {URI} event was emitted for `id`, the standard* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value* returned by {IERC1155MetadataURI-uri}.*/event URI(string value, uint256 indexed id);/*** @dev Returns the amount of tokens of token type `id` owned by `account`.** Requirements:** - `account` cannot be the zero address.*/function balanceOf(address account, uint256 id) external view returns (uint256);/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.** Requirements:** - `accounts` and `ids` must have the same length.*/function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)externalviewreturns (uint256[] memory);/*** @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,** Emits an {ApprovalForAll} event.** Requirements:** - `operator` cannot be the caller.*/function setApprovalForAll(address operator, bool approved) external;/*** @dev Returns true if `operator` is approved to transfer ``account``'s tokens.** See {setApprovalForAll}.*/function isApprovedForAll(address account, address operator) external view returns (bool);/*** @dev Transfers `amount` tokens of token type `id` from `from` to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.* - `from` must have a balance of tokens of type `id` of at least `amount`.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes calldata data) external;/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function safeBatchTransferFrom(address from,address to,uint256[] calldata ids,uint256[] calldata amounts,bytes calldata data) external;
}// File @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol@v4.7.3/*** @dev _Available since v3.1._*/
interface IERC1155Receiver is IERC165 {/*** @dev Handles the receipt of a single ERC1155 token type. This function is* called at the end of a `safeTransferFrom` after the balance has been updated.** NOTE: To accept the transfer, this must return* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`* (i.e. 0xf23a6e61, or its own function selector).** @param operator The address which initiated the transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param id The ID of the token being transferred* @param value The amount of tokens being transferred* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed*/function onERC1155Received(address operator,address from,uint256 id,uint256 value,bytes calldata data) external returns (bytes4);/*** @dev Handles the receipt of a multiple ERC1155 token types. This function* is called at the end of a `safeBatchTransferFrom` after the balances have* been updated.** NOTE: To accept the transfer(s), this must return* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`* (i.e. 0xbc197c81, or its own function selector).** @param operator The address which initiated the batch transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param ids An array containing ids of each token being transferred (order and length must match values array)* @param values An array containing amounts of each token being transferred (order and length must match ids array)* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed*/function onERC1155BatchReceived(address operator,address from,uint256[] calldata ids,uint256[] calldata values,bytes calldata data) external returns (bytes4);
}// File @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol@v4.7.3/*** @dev Interface of the optional ERC1155MetadataExtension interface, as defined* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].** _Available since v3.1._*/
interface IERC1155MetadataURI is IERC1155 {/*** @dev Returns the URI for token type `id`.** If the `\{id\}` substring is present in the URI, it must be replaced by* clients with the actual token type ID.*/function uri(uint256 id) external view returns (string memory);
}// File @openzeppelin/contracts/utils/Address.sol@v4.7.3/*** @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 presentif (returndata.length > 0) {// The easiest way to bubble the revert reason is using memory via assembly/// @solidity memory-safe-assemblyassembly {let returndata_size := mload(returndata)revert(add(32, returndata), returndata_size)}} else {revert(errorMessage);}}}
}// File @openzeppelin/contracts/utils/Context.sol@v4.7.3/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/
abstract contract Context {function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}
}// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.7.3/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {*     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/
abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}
}// File @openzeppelin/contracts/token/ERC1155/ERC1155.sol@v4.7.3/*** @dev Implementation of the basic standard multi-token.* See https://eips.ethereum.org/EIPS/eip-1155* Originally based on code by Enjin: https://github.com/enjin/erc-1155** _Available since v3.1._*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {using Address for address;// Mapping from token ID to account balancesmapping(uint256 => mapping(address => uint256)) private _balances;// Mapping from account to operator approvalsmapping(address => mapping(address => bool)) private _operatorApprovals;// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.jsonstring private _uri;/*** @dev See {_setURI}.*/constructor(string memory uri_) {_setURI(uri_);}/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {returninterfaceId == type(IERC1155).interfaceId ||interfaceId == type(IERC1155MetadataURI).interfaceId ||super.supportsInterface(interfaceId);}/*** @dev See {IERC1155MetadataURI-uri}.** This implementation returns the same URI for *all* token types. It relies* on the token type ID substitution mechanism* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].** Clients calling this function must replace the `\{id\}` substring with the* actual token type ID.*/function uri(uint256) public view virtual override returns (string memory) {return _uri;}/*** @dev See {IERC1155-balanceOf}.** Requirements:** - `account` cannot be the zero address.*/function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {require(account != address(0), "ERC1155: address zero is not a valid owner");return _balances[id][account];}/*** @dev See {IERC1155-balanceOfBatch}.** Requirements:** - `accounts` and `ids` must have the same length.*/function balanceOfBatch(address[] memory accounts, uint256[] memory ids)publicviewvirtualoverridereturns (uint256[] memory){require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");uint256[] memory batchBalances = new uint256[](accounts.length);for (uint256 i = 0; i < accounts.length; ++i) {batchBalances[i] = balanceOf(accounts[i], ids[i]);}return batchBalances;}/*** @dev See {IERC1155-setApprovalForAll}.*/function setApprovalForAll(address operator, bool approved) public virtual override {_setApprovalForAll(_msgSender(), operator, approved);}/*** @dev See {IERC1155-isApprovedForAll}.*/function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {return _operatorApprovals[account][operator];}/*** @dev See {IERC1155-safeTransferFrom}.*/function safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes memory data) public virtual override {require(from == _msgSender() || isApprovedForAll(from, _msgSender()),"ERC1155: caller is not token owner nor approved");_safeTransferFrom(from, to, id, amount, data);}/*** @dev See {IERC1155-safeBatchTransferFrom}.*/function safeBatchTransferFrom(address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) public virtual override {require(from == _msgSender() || isApprovedForAll(from, _msgSender()),"ERC1155: caller is not token owner nor approved");_safeBatchTransferFrom(from, to, ids, amounts, data);}/*** @dev Transfers `amount` tokens of token type `id` from `from` to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - `from` must have a balance of tokens of type `id` of at least `amount`.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function _safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes memory data) internal virtual {require(to != address(0), "ERC1155: transfer to the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, from, to, ids, amounts, data);uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");unchecked {_balances[id][from] = fromBalance - amount;}_balances[id][to] += amount;emit TransferSingle(operator, from, to, id, amount);_afterTokenTransfer(operator, from, to, ids, amounts, data);_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.** Emits a {TransferBatch} event.** Requirements:** - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function _safeBatchTransferFrom(address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");require(to != address(0), "ERC1155: transfer to the zero address");address operator = _msgSender();_beforeTokenTransfer(operator, from, to, ids, amounts, data);for (uint256 i = 0; i < ids.length; ++i) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");unchecked {_balances[id][from] = fromBalance - amount;}_balances[id][to] += amount;}emit TransferBatch(operator, from, to, ids, amounts);_afterTokenTransfer(operator, from, to, ids, amounts, data);_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);}/*** @dev Sets a new URI for all token types, by relying on the token type ID* substitution mechanism* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].** By this mechanism, any occurrence of the `\{id\}` substring in either the* URI or any of the amounts in the JSON file at said URI will be replaced by* clients with the token type ID.** For example, the `https://token-cdn-domain/\{id\}.json` URI would be* interpreted by clients as* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`* for token type ID 0x4cce0.** See {uri}.** Because these URIs cannot be meaningfully represented by the {URI} event,* this function emits no events.*/function _setURI(string memory newuri) internal virtual {_uri = newuri;}/*** @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function _mint(address to,uint256 id,uint256 amount,bytes memory data) internal virtual {require(to != address(0), "ERC1155: mint to the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);_balances[id][to] += amount;emit TransferSingle(operator, address(0), to, id, amount);_afterTokenTransfer(operator, address(0), to, ids, amounts, data);_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function _mintBatch(address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {require(to != address(0), "ERC1155: mint to the zero address");require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");address operator = _msgSender();_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);for (uint256 i = 0; i < ids.length; i++) {_balances[ids[i]][to] += amounts[i];}emit TransferBatch(operator, address(0), to, ids, amounts);_afterTokenTransfer(operator, address(0), to, ids, amounts, data);_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);}/*** @dev Destroys `amount` tokens of token type `id` from `from`** Emits a {TransferSingle} event.** Requirements:** - `from` cannot be the zero address.* - `from` must have at least `amount` tokens of token type `id`.*/function _burn(address from,uint256 id,uint256 amount) internal virtual {require(from != address(0), "ERC1155: burn from the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");unchecked {_balances[id][from] = fromBalance - amount;}emit TransferSingle(operator, from, address(0), id, amount);_afterTokenTransfer(operator, from, address(0), ids, amounts, "");}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.*/function _burnBatch(address from,uint256[] memory ids,uint256[] memory amounts) internal virtual {require(from != address(0), "ERC1155: burn from the zero address");require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");address operator = _msgSender();_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");for (uint256 i = 0; i < ids.length; i++) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");unchecked {_balances[id][from] = fromBalance - amount;}}emit TransferBatch(operator, from, address(0), ids, amounts);_afterTokenTransfer(operator, from, address(0), ids, amounts, "");}/*** @dev Approve `operator` to operate on all of `owner` tokens** Emits an {ApprovalForAll} event.*/function _setApprovalForAll(address owner,address operator,bool approved) internal virtual {require(owner != operator, "ERC1155: setting approval status for self");_operatorApprovals[owner][operator] = approved;emit ApprovalForAll(owner, operator, approved);}/*** @dev Hook that is called before any token transfer. This includes minting* and burning, as well as batched variants.** The same hook is called on both single and batched variants. For single* transfers, the length of the `ids` and `amounts` arrays will be 1.** Calling conditions (for each `id` and `amount` pair):** - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens* of token type `id` will be  transferred to `to`.* - When `from` is zero, `amount` tokens of token type `id` will be minted* for `to`.* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`* will be burned.* - `from` and `to` are never both zero.* - `ids` and `amounts` have the same, non-zero length.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _beforeTokenTransfer(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {}/*** @dev Hook that is called after any token transfer. This includes minting* and burning, as well as batched variants.** The same hook is called on both single and batched variants. For single* transfers, the length of the `id` and `amount` arrays will be 1.** Calling conditions (for each `id` and `amount` pair):** - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens* of token type `id` will be  transferred to `to`.* - When `from` is zero, `amount` tokens of token type `id` will be minted* for `to`.* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`* will be burned.* - `from` and `to` are never both zero.* - `ids` and `amounts` have the same, non-zero length.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _afterTokenTransfer(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {}function _doSafeTransferAcceptanceCheck(address operator,address from,address to,uint256 id,uint256 amount,bytes memory data) private {if (to.isContract()) {try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {if (response != IERC1155Receiver.onERC1155Received.selector) {revert("ERC1155: ERC1155Receiver rejected tokens");}} catch Error(string memory reason) {revert(reason);} catch {revert("ERC1155: transfer to non ERC1155Receiver implementer");}}}function _doSafeBatchTransferAcceptanceCheck(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) private {if (to.isContract()) {try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {revert("ERC1155: ERC1155Receiver rejected tokens");}} catch Error(string memory reason) {revert(reason);} catch {revert("ERC1155: transfer to non ERC1155Receiver implementer");}}}function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {uint256[] memory array = new uint256[](1);array[0] = element;return array;}
}// File @openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol@v4.7.3/*** @dev ERC1155 token with storage based token URI management.* Inspired by the ERC721URIStorage extension** _Available since v4.6._*/
abstract contract ERC1155URIStorage is ERC1155 {using Strings for uint256;// Optional base URIstring private _baseURI = "";// Optional mapping for token URIsmapping(uint256 => string) private _tokenURIs;/*** @dev See {IERC1155MetadataURI-uri}.** This implementation returns the concatenation of the `_baseURI`* and the token-specific uri if the latter is set** This enables the following behaviors:** - if `_tokenURIs[tokenId]` is set, then the result is the concatenation*   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`*   is empty per default);** - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`*   which in most cases will contain `ERC1155._uri`;** - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a*   uri value set, then the result is empty.*/function uri(uint256 tokenId) public view virtual override returns (string memory) {string memory tokenURI = _tokenURIs[tokenId];// If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);}/*** @dev Sets `tokenURI` as the tokenURI of `tokenId`.*/function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {_tokenURIs[tokenId] = tokenURI;emit URI(uri(tokenId), tokenId);}/*** @dev Sets `baseURI` as the `_baseURI` for all tokens*/function _setBaseURI(string memory baseURI) internal virtual {_baseURI = baseURI;}
}// File @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol@v4.7.3/*** @dev Extension of ERC1155 that adds tracking of total supply per id.** Useful for scenarios where Fungible and Non-fungible tokens have to be* clearly identified. Note: While a totalSupply of 1 might mean the* corresponding is an NFT, there is no guarantees that no other token with the* same id are not going to be minted.*/
abstract contract ERC1155Supply is ERC1155 {mapping(uint256 => uint256) private _totalSupply;/*** @dev Total amount of tokens in with a given id.*/function totalSupply(uint256 id) public view virtual returns (uint256) {return _totalSupply[id];}/*** @dev Indicates whether any token exist with a given id, or not.*/function exists(uint256 id) public view virtual returns (bool) {return ERC1155Supply.totalSupply(id) > 0;}/*** @dev See {ERC1155-_beforeTokenTransfer}.*/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) {require(ids[i] <= 7, "invalid number of id");_totalSupply[ids[i]] += amounts[i];if (ids[i] == 0) {require(_totalSupply[ids[i]] <= 200000, "0 max totalSupply");}if (ids[i] == 1) {require(_totalSupply[ids[i]] <= 200000, "1 max totalSupply");}if (ids[i] == 2) {require(_totalSupply[ids[i]] <= 100000, "2 max totalSupply");}if (ids[i] == 3) {require(_totalSupply[ids[i]] <= 50000, "3 max totalSupply");}if (ids[i] == 4) {require(_totalSupply[ids[i]] <= 25000, "4 max totalSupply");}if (ids[i] == 5) {require(_totalSupply[ids[i]] <= 12500, "5 max totalSupply");}if (ids[i] == 6) {require(_totalSupply[ids[i]] <= 6250, "5 max totalSupply");}if (ids[i] == 7) {require(_totalSupply[ids[i]] <= 3125, "5 max totalSupply");}}}if (to == address(0)) {for (uint256 i = 0; i < ids.length; ++i) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 supply = _totalSupply[id];require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");unchecked {_totalSupply[id] = supply - amount;}}}}
}/*** @dev Extension of {ERC1155} that allows token holders to destroy both their* own tokens and those that they have been approved to use.** _Available since v3.1._*/
abstract contract ERC1155Burnable is ERC1155 {function burn(address account,uint256 id,uint256 value) public virtual {require(account == _msgSender() || isApprovedForAll(account, _msgSender()),"ERC1155: caller is not token owner nor approved");_burn(account, id, value);}function burnBatch(address account,uint256[] memory ids,uint256[] memory values) public virtual {require(account == _msgSender() || isApprovedForAll(account, _msgSender()),"ERC1155: caller is not token owner nor approved");_burnBatch(account, ids, values);}
}// File @openzeppelin/contracts/access/Ownable.sol@v4.7.3/*** @dev Contract module which provides a basic access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership}.** This module is used through inheritance. It will make available the modifier* `onlyOwner`, which can be applied to your functions to restrict their use to* the owner.*/
abstract contract Ownable is Context {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/constructor() {_transferOwnership(_msgSender());}/*** @dev Throws if called by any account other than the owner.*/modifier onlyOwner() {_checkOwner();_;}/*** @dev Returns the address of the current owner.*/function owner() public view virtual returns (address) {return _owner;}/*** @dev Throws if the sender is not the owner.*/function _checkOwner() internal view virtual {require(owner() == _msgSender(), "Ownable: caller is not the owner");}/*** @dev Leaves the contract without owner. It will not be possible to call* `onlyOwner` functions anymore. Can only be called by the current owner.** NOTE: Renouncing ownership will leave the contract without an owner,* thereby removing any functionality that is only available to the owner.*/function renounceOwnership() public virtual onlyOwner {_transferOwnership(address(0));}/*** @dev Transfers ownership of the contract to a new account (`newOwner`).* Can only be called by the current owner.*/function transferOwnership(address newOwner) public virtual onlyOwner {require(newOwner != address(0), "Ownable: new owner is the zero address");_transferOwnership(newOwner);}/*** @dev Transfers ownership of the contract to a new account (`newOwner`).* Internal function without access restriction.*/function _transferOwnership(address newOwner) internal virtual {address oldOwner = _owner;_owner = newOwner;emit OwnershipTransferred(oldOwner, newOwner);}
}contract MyToken is ERC1155URIStorage, ERC1155Burnable, ERC1155Supply, Ownable {string public constant name = "MyToken";string public constant symbol = "TMT";constructor() ERC1155("") {}function uri(uint256 tokenId)publicviewoverride(ERC1155, ERC1155URIStorage)returns (string memory){return ERC1155URIStorage.uri(tokenId);}function mint(address account, uint256 id, uint256 amount, bytes memory data)publiconlyOwner{_mint(account, id, amount, data);}function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)publiconlyOwner{_mintBatch(to, ids, amounts, data);}function setURI(uint256 tokenId, string memory tokenURI) public onlyOwner {_setURI(tokenId, tokenURI);}function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)internaloverride(ERC1155, ERC1155Supply){super._beforeTokenTransfer(operator, from, to, ids, amounts, data);}
}

部署tron ERC1155代码

// Sources flattened with hardhat v2.10.1 https://hardhat.org// File @openzeppelin/contracts/utils/Strings.sol@v4.7.3// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)pragma solidity ^0.8.0;/*** @dev String operations.*/
library Strings {bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {// Inspired by OraclizeAPI's implementation - MIT licence// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.solif (value == 0) {return "0";}uint256 temp = value;uint256 digits;while (temp != 0) {digits++;temp /= 10;}bytes memory buffer = new bytes(digits);while (value != 0) {digits -= 1;buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));value /= 10;}return string(buffer);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.*/function toHexString(uint256 value) internal pure returns (string memory) {if (value == 0) {return "0x00";}uint256 temp = value;uint256 length = 0;while (temp != 0) {length++;temp >>= 8;}return toHexString(value, length);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.*/function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {bytes memory buffer = new bytes(2 * length + 2);buffer[0] = "0";buffer[1] = "x";for (uint256 i = 2 * length + 1; i > 1; --i) {buffer[i] = _HEX_SYMBOLS[value & 0xf];value >>= 4;}require(value == 0, "Strings: hex length insufficient");return string(buffer);}/*** @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.*/function toHexString(address addr) internal pure returns (string memory) {return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);}
}// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.7.3/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/
interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// File @openzeppelin/contracts/token/ERC1155/IERC1155.sol@v4.7.3/*** @dev Required interface of an ERC1155 compliant contract, as defined in the* https://eips.ethereum.org/EIPS/eip-1155[EIP].** _Available since v3.1._*/
interface IERC1155 is IERC165 {/*** @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.*/event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);/*** @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all* transfers.*/event TransferBatch(address indexed operator,address indexed from,address indexed to,uint256[] ids,uint256[] values);/*** @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to* `approved`.*/event ApprovalForAll(address indexed account, address indexed operator, bool approved);/*** @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.** If an {URI} event was emitted for `id`, the standard* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value* returned by {IERC1155MetadataURI-uri}.*/event URI(string value, uint256 indexed id);/*** @dev Returns the amount of tokens of token type `id` owned by `account`.** Requirements:** - `account` cannot be the zero address.*/function balanceOf(address account, uint256 id) external view returns (uint256);/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.** Requirements:** - `accounts` and `ids` must have the same length.*/function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)externalviewreturns (uint256[] memory);/*** @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,** Emits an {ApprovalForAll} event.** Requirements:** - `operator` cannot be the caller.*/function setApprovalForAll(address operator, bool approved) external;/*** @dev Returns true if `operator` is approved to transfer ``account``'s tokens.** See {setApprovalForAll}.*/function isApprovedForAll(address account, address operator) external view returns (bool);/*** @dev Transfers `amount` tokens of token type `id` from `from` to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.* - `from` must have a balance of tokens of type `id` of at least `amount`.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes calldata data) external;/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function safeBatchTransferFrom(address from,address to,uint256[] calldata ids,uint256[] calldata amounts,bytes calldata data) external;
}// File @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol@v4.7.3/*** @dev _Available since v3.1._*/
interface IERC1155Receiver is IERC165 {/*** @dev Handles the receipt of a single ERC1155 token type. This function is* called at the end of a `safeTransferFrom` after the balance has been updated.** NOTE: To accept the transfer, this must return* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`* (i.e. 0xf23a6e61, or its own function selector).** @param operator The address which initiated the transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param id The ID of the token being transferred* @param value The amount of tokens being transferred* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed*/function onERC1155Received(address operator,address from,uint256 id,uint256 value,bytes calldata data) external returns (bytes4);/*** @dev Handles the receipt of a multiple ERC1155 token types. This function* is called at the end of a `safeBatchTransferFrom` after the balances have* been updated.** NOTE: To accept the transfer(s), this must return* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`* (i.e. 0xbc197c81, or its own function selector).** @param operator The address which initiated the batch transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param ids An array containing ids of each token being transferred (order and length must match values array)* @param values An array containing amounts of each token being transferred (order and length must match ids array)* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed*/function onERC1155BatchReceived(address operator,address from,uint256[] calldata ids,uint256[] calldata values,bytes calldata data) external returns (bytes4);
}// File @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol@v4.7.3/*** @dev Interface of the optional ERC1155MetadataExtension interface, as defined* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].** _Available since v3.1._*/
interface IERC1155MetadataURI is IERC1155 {/*** @dev Returns the URI for token type `id`.** If the `\{id\}` substring is present in the URI, it must be replaced by* clients with the actual token type ID.*/function uri(uint256 id) external view returns (string memory);
}// File @openzeppelin/contracts/utils/Context.sol@v4.7.3/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/
abstract contract Context {function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}
}// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.7.3/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {*     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/
abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}
}// File @openzeppelin/contracts/token/ERC1155/ERC1155.sol@v4.7.3/*** @dev Implementation of the basic standard multi-token.* See https://eips.ethereum.org/EIPS/eip-1155* Originally based on code by Enjin: https://github.com/enjin/erc-1155** _Available since v3.1._*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {// Mapping from token ID to account balancesmapping(uint256 => mapping(address => uint256)) private _balances;// Mapping from account to operator approvalsmapping(address => mapping(address => bool)) private _operatorApprovals;// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.jsonstring private _uri;/*** @dev See {_setURI}.*/constructor(string memory uri_) {_setURI(uri_);}/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {returninterfaceId == type(IERC1155).interfaceId ||interfaceId == type(IERC1155MetadataURI).interfaceId ||super.supportsInterface(interfaceId);}/*** @dev See {IERC1155MetadataURI-uri}.** This implementation returns the same URI for *all* token types. It relies* on the token type ID substitution mechanism* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].** Clients calling this function must replace the `\{id\}` substring with the* actual token type ID.*/function uri(uint256) public view virtual override returns (string memory) {return _uri;}/*** @dev See {IERC1155-balanceOf}.** Requirements:** - `account` cannot be the zero address.*/function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {require(account != address(0), "ERC1155: address zero is not a valid owner");return _balances[id][account];}/*** @dev See {IERC1155-balanceOfBatch}.** Requirements:** - `accounts` and `ids` must have the same length.*/function balanceOfBatch(address[] memory accounts, uint256[] memory ids)publicviewvirtualoverridereturns (uint256[] memory){require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");uint256[] memory batchBalances = new uint256[](accounts.length);for (uint256 i = 0; i < accounts.length; ++i) {batchBalances[i] = balanceOf(accounts[i], ids[i]);}return batchBalances;}/*** @dev See {IERC1155-setApprovalForAll}.*/function setApprovalForAll(address operator, bool approved) public virtual override {_setApprovalForAll(_msgSender(), operator, approved);}/*** @dev See {IERC1155-isApprovedForAll}.*/function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {return _operatorApprovals[account][operator];}/*** @dev See {IERC1155-safeTransferFrom}.*/function safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes memory data) public virtual override {require(from == _msgSender() || isApprovedForAll(from, _msgSender()),"ERC1155: caller is not token owner nor approved");_safeTransferFrom(from, to, id, amount, data);}/*** @dev See {IERC1155-safeBatchTransferFrom}.*/function safeBatchTransferFrom(address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) public virtual override {require(from == _msgSender() || isApprovedForAll(from, _msgSender()),"ERC1155: caller is not token owner nor approved");_safeBatchTransferFrom(from, to, ids, amounts, data);}/*** @dev Transfers `amount` tokens of token type `id` from `from` to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - `from` must have a balance of tokens of type `id` of at least `amount`.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function _safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes memory data) internal virtual {require(to != address(0), "ERC1155: transfer to the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, from, to, ids, amounts, data);uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");unchecked {_balances[id][from] = fromBalance - amount;}_balances[id][to] += amount;emit TransferSingle(operator, from, to, id, amount);_afterTokenTransfer(operator, from, to, ids, amounts, data);_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.** Emits a {TransferBatch} event.** Requirements:** - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function _safeBatchTransferFrom(address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");require(to != address(0), "ERC1155: transfer to the zero address");address operator = _msgSender();_beforeTokenTransfer(operator, from, to, ids, amounts, data);for (uint256 i = 0; i < ids.length; ++i) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");unchecked {_balances[id][from] = fromBalance - amount;}_balances[id][to] += amount;}emit TransferBatch(operator, from, to, ids, amounts);_afterTokenTransfer(operator, from, to, ids, amounts, data);_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);}/*** @dev Sets a new URI for all token types, by relying on the token type ID* substitution mechanism* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].** By this mechanism, any occurrence of the `\{id\}` substring in either the* URI or any of the amounts in the JSON file at said URI will be replaced by* clients with the token type ID.** For example, the `https://token-cdn-domain/\{id\}.json` URI would be* interpreted by clients as* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`* for token type ID 0x4cce0.** See {uri}.** Because these URIs cannot be meaningfully represented by the {URI} event,* this function emits no events.*/function _setURI(string memory newuri) internal virtual {_uri = newuri;}/*** @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.** Emits a {TransferSingle} event.** Requirements:** - `to` cannot be the zero address.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the* acceptance magic value.*/function _mint(address to,uint256 id,uint256 amount,bytes memory data) internal virtual {require(to != address(0), "ERC1155: mint to the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);_balances[id][to] += amount;emit TransferSingle(operator, address(0), to, id, amount);_afterTokenTransfer(operator, address(0), to, ids, amounts, data);_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the* acceptance magic value.*/function _mintBatch(address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {require(to != address(0), "ERC1155: mint to the zero address");require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");address operator = _msgSender();_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);for (uint256 i = 0; i < ids.length; i++) {_balances[ids[i]][to] += amounts[i];}emit TransferBatch(operator, address(0), to, ids, amounts);_afterTokenTransfer(operator, address(0), to, ids, amounts, data);_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);}/*** @dev Destroys `amount` tokens of token type `id` from `from`** Emits a {TransferSingle} event.** Requirements:** - `from` cannot be the zero address.* - `from` must have at least `amount` tokens of token type `id`.*/function _burn(address from,uint256 id,uint256 amount) internal virtual {require(from != address(0), "ERC1155: burn from the zero address");address operator = _msgSender();uint256[] memory ids = _asSingletonArray(id);uint256[] memory amounts = _asSingletonArray(amount);_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");unchecked {_balances[id][from] = fromBalance - amount;}emit TransferSingle(operator, from, address(0), id, amount);_afterTokenTransfer(operator, from, address(0), ids, amounts, "");}/*** @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.** Emits a {TransferBatch} event.** Requirements:** - `ids` and `amounts` must have the same length.*/function _burnBatch(address from,uint256[] memory ids,uint256[] memory amounts) internal virtual {require(from != address(0), "ERC1155: burn from the zero address");require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");address operator = _msgSender();_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");for (uint256 i = 0; i < ids.length; i++) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 fromBalance = _balances[id][from];require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");unchecked {_balances[id][from] = fromBalance - amount;}}emit TransferBatch(operator, from, address(0), ids, amounts);_afterTokenTransfer(operator, from, address(0), ids, amounts, "");}/*** @dev Approve `operator` to operate on all of `owner` tokens** Emits an {ApprovalForAll} event.*/function _setApprovalForAll(address owner,address operator,bool approved) internal virtual {require(owner != operator, "ERC1155: setting approval status for self");_operatorApprovals[owner][operator] = approved;emit ApprovalForAll(owner, operator, approved);}/*** @dev Hook that is called before any token transfer. This includes minting* and burning, as well as batched variants.** The same hook is called on both single and batched variants. For single* transfers, the length of the `ids` and `amounts` arrays will be 1.** Calling conditions (for each `id` and `amount` pair):** - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens* of token type `id` will be  transferred to `to`.* - When `from` is zero, `amount` tokens of token type `id` will be minted* for `to`.* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`* will be burned.* - `from` and `to` are never both zero.* - `ids` and `amounts` have the same, non-zero length.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _beforeTokenTransfer(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {}/*** @dev Hook that is called after any token transfer. This includes minting* and burning, as well as batched variants.** The same hook is called on both single and batched variants. For single* transfers, the length of the `id` and `amount` arrays will be 1.** Calling conditions (for each `id` and `amount` pair):** - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens* of token type `id` will be  transferred to `to`.* - When `from` is zero, `amount` tokens of token type `id` will be minted* for `to`.* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`* will be burned.* - `from` and `to` are never both zero.* - `ids` and `amounts` have the same, non-zero length.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _afterTokenTransfer(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) internal virtual {}function _doSafeTransferAcceptanceCheck(address operator,address from,address to,uint256 id,uint256 amount,bytes memory data) private {if (to.isContract) {try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {if (response != IERC1155Receiver.onERC1155Received.selector) {revert("ERC1155: ERC1155Receiver rejected tokens");}} catch Error(string memory reason) {revert(reason);} catch {revert("ERC1155: transfer to non ERC1155Receiver implementer");}}}function _doSafeBatchTransferAcceptanceCheck(address operator,address from,address to,uint256[] memory ids,uint256[] memory amounts,bytes memory data) private {if (to.isContract) {try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {revert("ERC1155: ERC1155Receiver rejected tokens");}} catch Error(string memory reason) {revert(reason);} catch {revert("ERC1155: transfer to non ERC1155Receiver implementer");}}}function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {uint256[] memory array = new uint256[](1);array[0] = element;return array;}
}// File @openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol@v4.7.3/*** @dev ERC1155 token with storage based token URI management.* Inspired by the ERC721URIStorage extension** _Available since v4.6._*/
abstract contract ERC1155URIStorage is ERC1155 {using Strings for uint256;// Optional base URIstring private _baseURI = "";// Optional mapping for token URIsmapping(uint256 => string) private _tokenURIs;/*** @dev See {IERC1155MetadataURI-uri}.** This implementation returns the concatenation of the `_baseURI`* and the token-specific uri if the latter is set** This enables the following behaviors:** - if `_tokenURIs[tokenId]` is set, then the result is the concatenation*   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`*   is empty per default);** - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`*   which in most cases will contain `ERC1155._uri`;** - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a*   uri value set, then the result is empty.*/function uri(uint256 tokenId) public view virtual override returns (string memory) {string memory tokenURI = _tokenURIs[tokenId];// If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);}/*** @dev Sets `tokenURI` as the tokenURI of `tokenId`.*/function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {_tokenURIs[tokenId] = tokenURI;emit URI(uri(tokenId), tokenId);}/*** @dev Sets `baseURI` as the `_baseURI` for all tokens*/function _setBaseURI(string memory baseURI) internal virtual {_baseURI = baseURI;}
}// File @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol@v4.7.3/*** @dev Extension of ERC1155 that adds tracking of total supply per id.** Useful for scenarios where Fungible and Non-fungible tokens have to be* clearly identified. Note: While a totalSupply of 1 might mean the* corresponding is an NFT, there is no guarantees that no other token with the* same id are not going to be minted.*/
abstract contract ERC1155Supply is ERC1155 {mapping(uint256 => uint256) private _totalSupply;/*** @dev Total amount of tokens in with a given id.*/function totalSupply(uint256 id) public view virtual returns (uint256) {return _totalSupply[id];}/*** @dev Indicates whether any token exist with a given id, or not.*/function exists(uint256 id) public view virtual returns (bool) {return ERC1155Supply.totalSupply(id) > 0;}/*** @dev See {ERC1155-_beforeTokenTransfer}.*/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) {require(ids[i] <= 7, "invalid number of id");_totalSupply[ids[i]] += amounts[i];if (ids[i] == 0) {require(_totalSupply[ids[i]] <= 200000, "0 max totalSupply");}if (ids[i] == 1) {require(_totalSupply[ids[i]] <= 200000, "1 max totalSupply");}if (ids[i] == 2) {require(_totalSupply[ids[i]] <= 100000, "2 max totalSupply");}if (ids[i] == 3) {require(_totalSupply[ids[i]] <= 50000, "3 max totalSupply");}if (ids[i] == 4) {require(_totalSupply[ids[i]] <= 25000, "4 max totalSupply");}if (ids[i] == 5) {require(_totalSupply[ids[i]] <= 12500, "5 max totalSupply");}if (ids[i] == 6) {require(_totalSupply[ids[i]] <= 6250, "5 max totalSupply");}if (ids[i] == 7) {require(_totalSupply[ids[i]] <= 3125, "5 max totalSupply");}}}if (to == address(0)) {for (uint256 i = 0; i < ids.length; ++i) {uint256 id = ids[i];uint256 amount = amounts[i];uint256 supply = _totalSupply[id];require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");unchecked {_totalSupply[id] = supply - amount;}}}}
}/*** @dev Extension of {ERC1155} that allows token holders to destroy both their* own tokens and those that they have been approved to use.** _Available since v3.1._*/
abstract contract ERC1155Burnable is ERC1155 {function burn(address account,uint256 id,uint256 value) public virtual {require(account == _msgSender() || isApprovedForAll(account, _msgSender()),"ERC1155: caller is not token owner nor approved");_burn(account, id, value);}function burnBatch(address account,uint256[] memory ids,uint256[] memory values) public virtual {require(account == _msgSender() || isApprovedForAll(account, _msgSender()),"ERC1155: caller is not token owner nor approved");_burnBatch(account, ids, values);}
}// File @openzeppelin/contracts/access/Ownable.sol@v4.7.3/*** @dev Contract module which provides a basic access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership}.** This module is used through inheritance. It will make available the modifier* `onlyOwner`, which can be applied to your functions to restrict their use to* the owner.*/
abstract contract Ownable is Context {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/constructor() {_transferOwnership(_msgSender());}/*** @dev Throws if called by any account other than the owner.*/modifier onlyOwner() {_checkOwner();_;}/*** @dev Returns the address of the current owner.*/function owner() public view virtual returns (address) {return _owner;}/*** @dev Throws if the sender is not the owner.*/function _checkOwner() internal view virtual {require(owner() == _msgSender(), "Ownable: caller is not the owner");}/*** @dev Leaves the contract without owner. It will not be possible to call* `onlyOwner` functions anymore. Can only be called by the current owner.** NOTE: Renouncing ownership will leave the contract without an owner,* thereby removing any functionality that is only available to the owner.*/function renounceOwnership() public virtual onlyOwner {_transferOwnership(address(0));}/*** @dev Transfers ownership of the contract to a new account (`newOwner`).* Can only be called by the current owner.*/function transferOwnership(address newOwner) public virtual onlyOwner {require(newOwner != address(0), "Ownable: new owner is the zero address");_transferOwnership(newOwner);}/*** @dev Transfers ownership of the contract to a new account (`newOwner`).* Internal function without access restriction.*/function _transferOwnership(address newOwner) internal virtual {address oldOwner = _owner;_owner = newOwner;emit OwnershipTransferred(oldOwner, newOwner);}
}contract MyToken is ERC1155URIStorage, ERC1155Burnable, ERC1155Supply, Ownable {string public constant name = "MyToken";string public constant symbol = "TMT";constructor() ERC1155("") {}function uri(uint256 tokenId)publicviewoverride(ERC1155, ERC1155URIStorage)returns (string memory){return ERC1155URIStorage.uri(tokenId);}function mint(address account, uint256 id, uint256 amount, bytes memory data)publiconlyOwner{_mint(account, id, amount, data);}function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)publiconlyOwner{_mintBatch(to, ids, amounts, data);}function setURI(uint256 tokenId, string memory tokenURI) public onlyOwner {_setURI(tokenId, tokenURI);}function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)internaloverride(ERC1155, ERC1155Supply){super._beforeTokenTransfer(operator, from, to, ids, amounts, data);}
}

部署tron ERC721 代码

// Sources flattened with hardhat v2.10.1 https://hardhat.org// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.7.3// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/
interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// File @openzeppelin/contracts/token/ERC721/IERC721.sol@v4.7.3/*** @dev Required interface of an ERC721 compliant contract.*/
interface IERC721 is IERC165 {/*** @dev Emitted when `tokenId` token is transferred from `from` to `to`.*/event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.*/event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.*/event ApprovalForAll(address indexed owner, address indexed operator, bool approved);/*** @dev Returns the number of tokens in ``owner``'s account.*/function balanceOf(address owner) external view returns (uint256 balance);/*** @dev Returns the owner of the `tokenId` token.** Requirements:** - `tokenId` must exist.*/function ownerOf(uint256 tokenId) external view returns (address owner);/*** @dev Safely transfers `tokenId` token from `from` to `to`.** Requirements:** - `from` cannot be the zero address.* - `to` cannot be the zero address.* - `tokenId` token must exist and be owned by `from`.* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.** Emits a {Transfer} event.*/function safeTransferFrom(address from,address to,uint256 tokenId,bytes calldata data) external;/*** @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients* are aware of the ERC721 protocol to prevent tokens from being forever locked.** Requirements:** - `from` cannot be the zero address.* - `to` cannot be the zero address.* - `tokenId` token must exist and be owned by `from`.* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.** Emits a {Transfer} event.*/function safeTransferFrom(address from,address to,uint256 tokenId) external;/*** @dev Transfers `tokenId` token from `from` to `to`.** WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.** Requirements:** - `from` cannot be the zero address.* - `to` cannot be the zero address.* - `tokenId` token must be owned by `from`.* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.** Emits a {Transfer} event.*/function transferFrom(address from,address to,uint256 tokenId) external;/*** @dev Gives permission to `to` to transfer `tokenId` token to another account.* The approval is cleared when the token is transferred.** Only a single account can be approved at a time, so approving the zero address clears previous approvals.** Requirements:** - The caller must own the token or be an approved operator.* - `tokenId` must exist.** Emits an {Approval} event.*/function approve(address to, uint256 tokenId) external;/*** @dev Approve or remove `operator` as an operator for the caller.* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.** Requirements:** - The `operator` cannot be the caller.** Emits an {ApprovalForAll} event.*/function setApprovalForAll(address operator, bool _approved) external;/*** @dev Returns the account approved for `tokenId` token.** Requirements:** - `tokenId` must exist.*/function getApproved(uint256 tokenId) external view returns (address operator);/*** @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.** See {setApprovalForAll}*/function isApprovedForAll(address owner, address operator) external view returns (bool);
}// File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol@v4.7.3/*** @title ERC721 token receiver interface* @dev Interface for any contract that wants to support safeTransfers* from ERC721 asset contracts.*/
interface IERC721Receiver {/*** @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}* by `operator` from `from`, this function is called.** It must return its Solidity selector to confirm the token transfer.* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.** The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.*/function onERC721Received(address operator,address from,uint256 tokenId,bytes calldata data) external returns (bytes4);
}// File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol@v4.7.3/*** @title ERC-721 Non-Fungible Token Standard, optional metadata extension* @dev See https://eips.ethereum.org/EIPS/eip-721*/
interface IERC721Metadata is IERC721 {/*** @dev Returns the token collection name.*/function name() external view returns (string memory);/*** @dev Returns the token collection symbol.*/function symbol() external view returns (string memory);/*** @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.*/function tokenURI(uint256 tokenId) external view returns (string memory);
}// File @openzeppelin/contracts/utils/Context.sol@v4.7.3/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/
abstract contract Context {function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}
}// File @openzeppelin/contracts/utils/Strings.sol@v4.7.3/*** @dev String operations.*/
library Strings {bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {// Inspired by OraclizeAPI's implementation - MIT licence// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.solif (value == 0) {return "0";}uint256 temp = value;uint256 digits;while (temp != 0) {digits++;temp /= 10;}bytes memory buffer = new bytes(digits);while (value != 0) {digits -= 1;buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));value /= 10;}return string(buffer);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.*/function toHexString(uint256 value) internal pure returns (string memory) {if (value == 0) {return "0x00";}uint256 temp = value;uint256 length = 0;while (temp != 0) {length++;temp >>= 8;}return toHexString(value, length);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.*/function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {bytes memory buffer = new bytes(2 * length + 2);buffer[0] = "0";buffer[1] = "x";for (uint256 i = 2 * length + 1; i > 1; --i) {buffer[i] = _HEX_SYMBOLS[value & 0xf];value >>= 4;}require(value == 0, "Strings: hex length insufficient");return string(buffer);}/*** @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.*/function toHexString(address addr) internal pure returns (string memory) {return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);}
}// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.7.3/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {*     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/
abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}
}// File @openzeppelin/contracts/token/ERC721/ERC721.sol@v4.7.3/*** @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including* the Metadata extension, but not including the Enumerable extension, which is available separately as* {ERC721Enumerable}.*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {using Strings for uint256;// Token namestring private _name;// Token symbolstring private _symbol;// Mapping from token ID to owner addressmapping(uint256 => address) private _owners;// Mapping owner address to token countmapping(address => uint256) private _balances;// Mapping from token ID to approved addressmapping(uint256 => address) private _tokenApprovals;// Mapping from owner to operator approvalsmapping(address => mapping(address => bool)) private _operatorApprovals;/*** @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.*/constructor(string memory name_, string memory symbol_) {_name = name_;_symbol = symbol_;}/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {returninterfaceId == type(IERC721).interfaceId ||interfaceId == type(IERC721Metadata).interfaceId ||super.supportsInterface(interfaceId);}/*** @dev See {IERC721-balanceOf}.*/function balanceOf(address owner) public view virtual override returns (uint256) {require(owner != address(0), "ERC721: address zero is not a valid owner");return _balances[owner];}/*** @dev See {IERC721-ownerOf}.*/function ownerOf(uint256 tokenId) public view virtual override returns (address) {address owner = _owners[tokenId];require(owner != address(0), "ERC721: invalid token ID");return owner;}/*** @dev See {IERC721Metadata-name}.*/function name() public view virtual override returns (string memory) {return _name;}/*** @dev See {IERC721Metadata-symbol}.*/function symbol() public view virtual override returns (string memory) {return _symbol;}/*** @dev See {IERC721Metadata-tokenURI}.*/function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {_requireMinted(tokenId);string memory baseURI = _baseURI();return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : "";}/*** @dev Base URI for computing {tokenURI}. If set, the resulting URI for each* token will be the concatenation of the `baseURI` and the `tokenId`. Empty* by default, can be overridden in child contracts.*/function _baseURI() internal view virtual returns (string memory) {return "";}/*** @dev See {IERC721-approve}.*/function approve(address to, uint256 tokenId) public virtual override {address owner = ERC721.ownerOf(tokenId);require(to != owner, "ERC721: approval to current owner");require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),"ERC721: approve caller is not token owner nor approved for all");_approve(to, tokenId);}/*** @dev See {IERC721-getApproved}.*/function getApproved(uint256 tokenId) public view virtual override returns (address) {_requireMinted(tokenId);return _tokenApprovals[tokenId];}/*** @dev See {IERC721-setApprovalForAll}.*/function setApprovalForAll(address operator, bool approved) public virtual override {_setApprovalForAll(_msgSender(), operator, approved);}/*** @dev See {IERC721-isApprovedForAll}.*/function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {return _operatorApprovals[owner][operator];}/*** @dev See {IERC721-transferFrom}.*/function transferFrom(address from,address to,uint256 tokenId) public virtual override {//solhint-disable-next-line max-line-lengthrequire(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");_transfer(from, to, tokenId);}/*** @dev See {IERC721-safeTransferFrom}.*/function safeTransferFrom(address from,address to,uint256 tokenId) public virtual override {safeTransferFrom(from, to, tokenId, "");}/*** @dev See {IERC721-safeTransferFrom}.*/function safeTransferFrom(address from,address to,uint256 tokenId,bytes memory data) public virtual override {require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");_safeTransfer(from, to, tokenId, data);}/*** @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients* are aware of the ERC721 protocol to prevent tokens from being forever locked.** `data` is additional data, it has no specified format and it is sent in call to `to`.** This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.* implement alternative mechanisms to perform token transfer, such as signature-based.** Requirements:** - `from` cannot be the zero address.* - `to` cannot be the zero address.* - `tokenId` token must exist and be owned by `from`.* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.** Emits a {Transfer} event.*/function _safeTransfer(address from,address to,uint256 tokenId,bytes memory data) internal virtual {_transfer(from, to, tokenId);require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");}/*** @dev Returns whether `tokenId` exists.** Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.** Tokens start existing when they are minted (`_mint`),* and stop existing when they are burned (`_burn`).*/function _exists(uint256 tokenId) internal view virtual returns (bool) {return _owners[tokenId] != address(0);}/*** @dev Returns whether `spender` is allowed to manage `tokenId`.** Requirements:** - `tokenId` must exist.*/function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {address owner = ERC721.ownerOf(tokenId);return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);}/*** @dev Safely mints `tokenId` and transfers it to `to`.** Requirements:** - `tokenId` must not exist.* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.** Emits a {Transfer} event.*/function _safeMint(address to, uint256 tokenId) internal virtual {_safeMint(to, tokenId, "");}/*** @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.*/function _safeMint(address to,uint256 tokenId,bytes memory data) internal virtual {_mint(to, tokenId);require(_checkOnERC721Received(address(0), to, tokenId, data),"ERC721: transfer to non ERC721Receiver implementer");}/*** @dev Mints `tokenId` and transfers it to `to`.** WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible** Requirements:** - `tokenId` must not exist.* - `to` cannot be the zero address.** Emits a {Transfer} event.*/function _mint(address to, uint256 tokenId) internal virtual {require(to != address(0), "ERC721: mint to the zero address");require(!_exists(tokenId), "ERC721: token already minted");_beforeTokenTransfer(address(0), to, tokenId);_balances[to] += 1;_owners[tokenId] = to;emit Transfer(address(0), to, tokenId);_afterTokenTransfer(address(0), to, tokenId);}/*** @dev Destroys `tokenId`.* The approval is cleared when the token is burned.** Requirements:** - `tokenId` must exist.** Emits a {Transfer} event.*/function _burn(uint256 tokenId) internal virtual {address owner = ERC721.ownerOf(tokenId);_beforeTokenTransfer(owner, address(0), tokenId);// Clear approvals_approve(address(0), tokenId);_balances[owner] -= 1;delete _owners[tokenId];emit Transfer(owner, address(0), tokenId);_afterTokenTransfer(owner, address(0), tokenId);}/*** @dev Transfers `tokenId` from `from` to `to`.*  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.** Requirements:** - `to` cannot be the zero address.* - `tokenId` token must be owned by `from`.** Emits a {Transfer} event.*/function _transfer(address from,address to,uint256 tokenId) internal virtual {require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");require(to != address(0), "ERC721: transfer to the zero address");_beforeTokenTransfer(from, to, tokenId);// Clear approvals from the previous owner_approve(address(0), tokenId);_balances[from] -= 1;_balances[to] += 1;_owners[tokenId] = to;emit Transfer(from, to, tokenId);_afterTokenTransfer(from, to, tokenId);}/*** @dev Approve `to` to operate on `tokenId`** Emits an {Approval} event.*/function _approve(address to, uint256 tokenId) internal virtual {_tokenApprovals[tokenId] = to;emit Approval(ERC721.ownerOf(tokenId), to, tokenId);}/*** @dev Approve `operator` to operate on all of `owner` tokens** Emits an {ApprovalForAll} event.*/function _setApprovalForAll(address owner,address operator,bool approved) internal virtual {require(owner != operator, "ERC721: approve to caller");_operatorApprovals[owner][operator] = approved;emit ApprovalForAll(owner, operator, approved);}/*** @dev Reverts if the `tokenId` has not been minted yet.*/function _requireMinted(uint256 tokenId) internal view virtual {require(_exists(tokenId), "ERC721: invalid token ID");}/*** @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.* The call is not executed if the target address is not a contract.** @param from address representing the previous owner of the given token ID* @param to target address that will receive the tokens* @param tokenId uint256 ID of the token to be transferred* @param data bytes optional data to send along with the call* @return bool whether the call correctly returned the expected magic value*/function _checkOnERC721Received(address from,address to,uint256 tokenId,bytes memory data) private returns (bool) {if (to.isContract) {try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {return retval == IERC721Receiver.onERC721Received.selector;} catch (bytes memory reason) {if (reason.length == 0) {revert("ERC721: transfer to non ERC721Receiver implementer");} else {/// @solidity memory-safe-assemblyassembly {revert(add(32, reason), mload(reason))}}}} else {return true;}}/*** @dev Hook that is called before any token transfer. This includes minting* and burning.** Calling conditions:** - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be* transferred to `to`.* - When `from` is zero, `tokenId` will be minted for `to`.* - When `to` is zero, ``from``'s `tokenId` will be burned.* - `from` and `to` are never both zero.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _beforeTokenTransfer(address from,address to,uint256 tokenId) internal virtual {}/*** @dev Hook that is called after any transfer of tokens. This includes* minting and burning.** Calling conditions:** - when `from` and `to` are both non-zero.* - `from` and `to` are never both zero.** To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*/function _afterTokenTransfer(address from,address to,uint256 tokenId) internal virtual {}
}// File contracts/NFT.solcontract MyToken is ERC721 {constructor() ERC721("MyToken", "MTK") {}function _baseURI() internal pure override returns (string memory) {// 1.图片,2.视频,3.gif// return "https://ipfs.io/ipfs/QmVp2nytzBF3vp3oScG9pYeJ7CPvZyYYDA5W1A49HRkKfx/";return "https://ipfs.io/ipfs/QmPbZDYYNj4rFE1N92C1J7qiAUBPASQnWWJLguuR384FNR/";// return "https://genesis-api.keungz.com/kubz/metadata/";}function safeMint(address to, uint256 tokenId) public {_safeMint(to, tokenId);}
}

部署tron 721细节:
1.由于此代码限制:
1.每次部署时需要先把NFT数据写入合约
2.每次部署只能写入1个NFT素材
3.需要多种素材或者多个类型需要部署不同合约
5.上传.json格式素材需要去掉.json

Remix 工具部署及调用 Web3 ERC721 合约

1.介绍
web3 ERC721 是指根据以太坊web3发布的 ERC721 合约,目前公司常用相关链有:以太坊,FXEVM,BSC,POLYGON,TRON,AVAC等等,链相关地址都是0x开头
2.部署工具:
https://remix.ethereum.org/

部署流程:
生成合约
1.remix新建文件夹和.sol文件,粘贴合约代码
在这里插入图片描述
进入编译页面,选择合约对应版本,勾选自动编译,点击编译合约
在这里插入图片描述
小狐狸选择对应链,地址(看你想部署到什么链),remix进入生成合约页面,选择injected web3 连接小狐狸,连接后下方展示连接地址的金额和链ID
在这里插入图片描述
打开生成合约的交易面板
在这里插入图片描述
生成token合约
在这里插入图片描述

http://www.lryc.cn/news/227076.html

相关文章:

  • 【C++】从入门到精通第三弹——友元函数与静态类成员
  • acwing算法基础之搜索与图论--floyd算法
  • Zabbix监控SSL证书有效期
  • Arduino OneButton按键处理库实现单击/双击/长按功能
  • day52 django的下载与安装
  • WebGL智慧城市软件项目
  • VMware重装后没有虚拟网卡
  • 软件安全基础
  • 探索项目管理软件的多重用途和益处
  • Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
  • 【车载开发系列】AutoSar中的CANTP
  • JUL日志
  • ZZ308 物联网应用与服务赛题第G套
  • 如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?
  • 系列二十二、idea Live Templates
  • 电脑本地安装宝塔/docker 安装宝塔
  • Java Lambda 表达式笔记
  • Flutter笔记:状态提升、控制器模式、GetX控制器和服务
  • 9.spark自适应查询-AQE之动态调整Join策略
  • CentOs7 NAT模式连接网络
  • linux安装git
  • thinkphp6 起步
  • 会员题-力扣408-有效单词缩写
  • spring-cloud-stream
  • 2.0 熟悉CheatEngine修改器
  • 微信小程序数据交互和缓存
  • kubernetes集群编排——k8s认证授权
  • rabbitmq下载安装教程
  • 数据分析实战 | SVM算法——病例自动诊断分析
  • Splunk Connect for Kafka – Connecting Apache Kafka with Splunk