以下是一份基于ERC721标准的NFT工厂合约,每一个NFT都拥有唯一的序列id且每一个NFT都能进行溯源功能。同时,还提供了一个代理合约,用于管理工厂合约,可以发布不同种类的NFT,代理合约支持NFT之间的转移,并帮我写上注释
时间: 2024-06-06 09:07:16 浏览: 182
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.0/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.0/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.0/contracts/access/Ownable.sol";
// NFT工厂合约
contract NFTFactory is ERC721, ERC721Enumerable, Ownable {
uint256 private _currentTokenId = 0; // 记录当前的NFT数量
// 构造函数
constructor(string memory name, string memory symbol) ERC721(name, symbol) {}
// 创建NFT
function createNFT(address to) public onlyOwner {
uint256 newTokenId = _getNextTokenId(); // 获取新的NFT id
_mint(to, newTokenId); // 在to地址下铸造新的NFT
_incrementTokenId(); // NFT数量加1
}
// 获取NFT溯源信息
function getNFTSource(uint256 tokenId) public pure returns (string memory) {
return "NFT source";
}
// 获取下一个NFT id
function _getNextTokenId() private view returns (uint256) {
return _currentTokenId.add(1);
}
// NFT数量加1
function _incrementTokenId() private {
_currentTokenId++;
}
// 可枚举的NFT
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
// 可枚举的NFT
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721Enumerable)
{
super._burn(tokenId);
}
// 可枚举的NFT
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721Enumerable)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}
// 代理合约,用于管理工厂合约,可以发布不同种类的NFT
contract NFTProxy {
NFTFactory private _nftFactory;
constructor(NFTFactory nftFactoryAddress) {
_nftFactory = nftFactoryAddress;
}
// 创建NFT
function createNFT(address to) public {
_nftFactory.createNFT(to);
}
// 获取NFT溯源信息
function getNFTSource(uint256 tokenId) public pure returns (string memory) {
return "NFT source";
}
// 转移NFT
function transferNFT(address to, uint256 tokenId) public {
_nftFactory.safeTransferFrom(msg.sender, to, tokenId);
}
}
阅读全文