帮我写一份nft的工厂合约,要求能够实现nft的溯源
时间: 2024-05-12 11:20:35 浏览: 124
NFT Market 智能合约 实现分析
5星 · 资源好评率100%
以下是一份基本的 NFT 工厂合约,它可以创建新的 NFT 代币,并记录其生命周期和所有者历史记录,以实现 NFT 的溯源功能:
```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract NFTFactory {
// 事件用于记录所有新的 NFT 代币的创建和转让
event NewNFT(address indexed owner, uint256 indexed tokenId);
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
// NFT 代币的数据结构,包含名称、符号、初始所有者等信息
struct NFT {
string name;
string symbol;
address owner;
uint256 tokenId;
uint256 timestamp;
}
// 存储所有已经创建的 NFT 代币
NFT[] public nfts;
// 创建新的 NFT 代币
function createNFT(string memory _name, string memory _symbol, address _owner) public returns (uint256) {
uint256 tokenId = nfts.length + 1;
nfts.push(NFT(_name, _symbol, _owner, tokenId, block.timestamp));
emit NewNFT(_owner, tokenId);
return tokenId;
}
// 获取指定 tokenId 的 NFT 代币信息
function getNFT(uint256 _tokenId) public view returns (string memory, string memory, address, uint256, uint256) {
require(_tokenId > 0 && _tokenId <= nfts.length, "Invalid token ID");
NFT memory nft = nfts[_tokenId - 1];
return (nft.name, nft.symbol, nft.owner, nft.tokenId, nft.timestamp);
}
// 将 NFT 代币转让给新的所有者
function transferNFT(address _from, address _to, uint256 _tokenId) public {
require(_from != address(0), "Invalid from address");
require(_to != address(0), "Invalid to address");
require(_tokenId > 0 && _tokenId <= nfts.length, "Invalid token ID");
require(nfts[_tokenId - 1].owner == _from, "Not the owner of the token");
nfts[_tokenId - 1].owner = _to;
emit Transfer(_from, _to, _tokenId);
}
}
```
合约中有一个 `NFT` 结构体存储每个 NFT 代币的数据,包括名称、符号、初始所有者、代币 ID 和创建时间戳等。当创建新的 NFT 代币时,该结构体会被添加到 `nfts` 数组中,同时会通过 `NewNFT` 事件记录下来。
另外,合约还提供了 `getNFT` 函数用于获取指定 tokenId 的 NFT 代币信息,以及 `transferNFT` 函数用于将 NFT 代币转让给新的所有者。在转让 NFT 代币时,合约会检查转让人是否为有效的 NFT 代币所有者,并将所有者地址更新为新的地址。
通过这份 NFT 工厂合约,我们可以记录每个 NFT 代币的生命周期和所有者历史记录,实现 NFT 的溯源功能。
阅读全文