当前位置: 首页 > 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合约
在这里插入图片描述

相关文章:

NFT合约部署

部署合约&#xff1a; 1.web3 NFT合约部署工具 https://remix.ethereum.org/ 2.tron NFT合约部署工具 https://www.tronide.io/ 3.部署 web3 ERC721代码&#xff1a; // SPDX-License-Identifier: MIT pragma solidity ^0.8.2;import "openzeppelin/contracts/token/ERC7…...

【C++】从入门到精通第三弹——友元函数与静态类成员

这里写目录标题 静态类成员友元友元方法 静态类成员 类成员一般都需要通过对象来访问&#xff0c;不可以通过类名直接访问&#xff0c;但是当我们将类成员定义为静态类成员&#xff0c;则允许使用类名直接访问。 静态类成员是在类成员前定义static关键字。 1 #include<iost…...

acwing算法基础之搜索与图论--floyd算法

目录 1 基础知识2 模板3 工程化 1 基础知识 floyd算法的时间复杂度为O(n^3)&#xff0c;它用来解决多源最短路问题。它的原理是基于动态规划。 floyd算法的关键步骤&#xff1a; k从1到n。i从1到n。j从1到n&#xff0c;d[i][j] min(d[i][j], d[i][k] d[k][j])。经过上述三…...

Zabbix监控SSL证书有效期

一、介绍 由于业务需要&#xff0c;最近通过 Let’s Encrypt 申请了一些 SSL 证书&#xff0c;而证书有效期为 3 个月&#xff0c;需要在证书到期之前 renew。由于域名较多经常忘记 renew&#xff0c;导致证书过期&#xff0c;因此想通过 Zabbix 的方式监控证书的到期时间&…...

Arduino OneButton按键处理库实现单击/双击/长按功能

Arduino OneButton按键处理库实现单击/双击长按功能 ✨在Arduino开发平台下&#xff0c;按键的单击/双击/长按功能&#xff0c;在通过使用OneButton库&#xff0c;很容易就可以轻松实现。这就是支持C/C模块化设计的好处&#xff0c;避免重复性开发的工作。 &#x1f516;本文将…...

day52 django的下载与安装

课程的大致安排 大概两周的时间都是围绕着Django框架的学习&#xff0c;包括后续要学习的drf、Redis、celery、es等技术栈都是围绕Django展开的&#xff0c;因此、要求所有的同学必须认证学习了 市场中所有使用Python开发的web项目&#xff0c;Django框架占有率达到90%以上 …...

WebGL智慧城市软件项目

WebGL开发智慧城市项目时&#xff0c;需要考虑多个方面&#xff0c;包括技术、隐私、安全和可持续性。以下是一些需要注意的关键问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.隐私和数据安全…...

VMware重装后没有虚拟网卡

我重装VMware之后网络适配器里面没有虚拟网卡&#xff0c;找了CSDN上很多博主说的&#xff0c;都没用。 最终去看了b站的up视频就成功了。 原因是因为第一次安装后卸载不干净&#xff0c;软件在电脑上的注册表没有删掉。 要用下面两个软件清理一下残留文件&#xff0c;这两个…...

软件安全基础

传参基础 64位汇编传参&#xff0c;当参数少于7个时&#xff0c; 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时&#xff0c; 前 6 个与前面一样&#xff0c; 但后面的依次从 “右向左” 放入栈中&#xff0c;即和32位汇编一样。 我们这边要利用wr…...

探索项目管理软件的多重用途和益处

项目管理软件俨然成了当下项目管理话题中的热门词条&#xff0c;作为一个辅助性管理工具&#xff0c;项目管理软件有什么用&#xff1f;真的值得购入吗&#xff1f; 什么是项目管理软件 顾名思义&#xff0c;项目管理软件就是指在项目管理过程使用的各种软件工具。项目管理软件…...

Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台

文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品&#xff0c;订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库&#xff0c;可以在arduino的…...

【车载开发系列】AutoSar中的CANTP

【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP一. CANTP相关术语二. CANTP相关概念1&#xff09;单帧&#xff1a;SF(Single Frame)2&#xff09;首帧&#xff1a;FF(First Frame)3&#xff09;连续帧CF(Consecutive F…...

JUL日志

文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息&#xff0c;项目中存在大量的控制台输出语句&#xff0c;会显得很凌乱&#xff0c;而且日志的粒度是不够细的&#xff0c;假…...

ZZ308 物联网应用与服务赛题第G套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;G卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…...

如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?

WIN32K下一键杀死所有同名进程命令行&#xff1a;taskkill /F /IM chrome.exe ############################## 1、准备 Visual Studio 2019 2、准备 Visual Studio 2022 3、安装 VC、MSBuild 编译集成环境 4、安装 Python 3.x&#xff0c;早期V8发行版本编译安装 2.x 5、…...

系列二十二、idea Live Templates

一、idea Live Templates 1.1、Java Group 1.1.1、fast fast 快速在类上添加注解Data AllArgsConstructor NoArgsConstructor Accessors(chain true) ToString(callSuper true) 1.1.2、getThreadName getThreadName快速获取当前线程的名字Thread.currentThread().getName…...

电脑本地安装宝塔/docker 安装宝塔

一、先去docker官网(http://docker.com)下载软件并进行安装&#xff0c;网站打不开多试几次或者找梯子。 二、macos系统里按“command 空格”搜索“终端”回车&#xff0c;启动终端程序。 三、执行下面命令&#xff0c;拉取docker镜像。 docker pull pch18/baota:clear pch…...

Java Lambda 表达式笔记

文章目录 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式 Lambda 表达式&#xff0c;也可称为闭包. …...

Flutter笔记:状态提升、控制器模式、GetX控制器和服务

Flutter笔记 状态提升、控制器模式、GetX控制器和服务 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1…...

9.spark自适应查询-AQE之动态调整Join策略

目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量&#xff0c;Spark join 如果能采取这种策略&#xff0c;那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...