以下是一份基于ERC721标准的NFT工厂合约,每一个NFT都拥有唯一的序列id且每一个NFT都能进行溯源功能。同时,还提供了一个代理合约,用于管理工厂合约,可以发布不同种类的NFT。并帮我写上注释
时间: 2024-05-19 22:13:43 浏览: 12
pragma solidity ^0.8.0;
// 引入ERC721标准库
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
// 工厂合约,用于创建和管理不同种类的NFT
contract NFTFactory {
// 使用Counters库来生成唯一的序列id
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
// NFT合约的结构体
struct NFTContract {
string name; // NFT名称
string symbol; // NFT代号
address owner; // NFT所有者
address contractAddress; // NFT合约地址
}
// 所有已经创建的NFT合约列表
mapping(uint256 => NFTContract) private _nftContracts;
uint256[] private _nftContractIds;
// 创建新的NFT合约
function createNFTContract(string memory _name, string memory _symbol) public returns (uint256) {
// 使用Counters库生成新的合约id
uint256 newContractId = _tokenIdCounter.current();
_tokenIdCounter.increment();
// 创建新的NFT合约
ERC721 newNFTContract = new ERC721(_name, _symbol);
// 记录新的NFT合约信息
_nftContracts[newContractId] = NFTContract({
name: _name,
symbol: _symbol,
owner: msg.sender,
contractAddress: address(newNFTContract)
});
_nftContractIds.push(newContractId);
return newContractId;
}
// 获取所有已经创建的NFT合约
function getNFTContracts() public view returns (uint256[] memory) {
return _nftContractIds;
}
// 获取指定id的NFT合约信息
function getNFTContract(uint256 _id) public view returns (NFTContract memory) {
return _nftContracts[_id];
}
}
// 代理合约,用于管理工厂合约,可以发布不同种类的NFT
contract NFTProxy {
// 工厂合约地址
address private _factoryContractAddress;
// 设置工厂合约地址
constructor(address _factoryAddress) {
_factoryContractAddress = _factoryAddress;
}
// 创建新的NFT合约
function createNFTContract(string memory _name, string memory _symbol) public returns (uint256) {
// 获取工厂合约实例
NFTFactory factory = NFTFactory(_factoryContractAddress);
// 创建新的NFT合约
uint256 newContractId = factory.createNFTContract(_name, _symbol);
return newContractId;
}
// 获取所有已经创建的NFT合约
function getNFTContracts() public view returns (uint256[] memory) {
// 获取工厂合约实例
NFTFactory factory = NFTFactory(_factoryContractAddress);
return factory.getNFTContracts();
}
// 获取指定id的NFT合约信息
function getNFTContract(uint256 _id) public view returns (NFTFactory.NFTContract memory) {
// 获取工厂合约实例
NFTFactory factory = NFTFactory(_factoryContractAddress);
return factory.getNFTContract(_id);
}
}
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)