|
提问三步曲: 提问先看教程/FAQ索引(wdcp,wdcp_v3,一键包)及搜索,会让你更快解决问题
1 提供详细,如系统版本,wdcp版本,软件版本等及错误的详细信息,贴上论坛或截图发论坛
2 做过哪些操作或改动设置等
温馨提示:信息不详,很可能会没人理你!论坛有教程说明的,也可能没人理!因为,你懂的
TheGraph 实操(一)准备一个 NFT 项目
本篇是这个系列的第一篇:创建一个 NFT 合约并实现交易。 注:这里主要聚焦在 The Graph 的使用,自己实现 NFT 项目是为了方便解析事件,不关注 NFT 合约的安全等
创建合约 1、实现一个标准的 ERC721 合约,通过这个合约发行 NFT,用 The Graph 解析 Transfer 事件。 import "@openzeppelin/contracts/token/ERC721/ERC721.sol";contract ERC721Token is ERC721 { string public baseURI; constructor() ERC721(unicode"小猫", "LCAT") { } function _baseURI(
) internal view override returns (string memory) { return baseURI; } function setBaseURI(string calldata uri) external { baseURI = uri; } function safeMint(address to, uint256 tokenId) external { _safeMint(to, tokenId); }}
2、实现一个标准的 ERC20 代币,用来买卖我们上面发行的 NFT。 import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract ERC20Token is ERC20 { address public immutable owner; constructor() ERC20(unicode"猫币", "CAT") { owner = msg.sender; _mint(owner, 100000 * 10 ** decimals()); } function mint(address account, uint256 amount) public { require(msg.sender == owner, "mint: only owner"); _mint(account, amount); }}
3、实现一个 Market 合约,买卖 NFT import "@openzeppelin/contracts/token/ERC20/IERC20.sol";import "@openzeppelin/contracts/token/ERC721/IERC721.sol";contract Market { IERC20 public immutable TOKEN20; IERC721 public immutable TOKEN721; mapping(uint256 => uint256) public priceOf; mapping(uint256 => address) public sellerOf; constructor(address token20, address token721) { TOKEN20 = IERC20(token20); TOKEN721 = IERC721(token721); } event BuyEvent(address user, uint256 tokenId, uint256 amount); event SellEvent(address user, uint256 tokenId, uint256 price); function buy(uint256 tokenId, uint256 amount) external { uint256 price = priceOf[tokenId]; require(price > 0 && price <= amount, "buy: error price or amount"); require(sellerOf[tokenId] != address(0), "buy: seller address zero"); TOKEN20.transferFrom(msg.sender, sellerOf[tokenId], price); TOKEN721.transferFrom(address(this), msg.sender, tokenId); priceOf[tokenId] = 0; sellerOf[tokenId] = address(0); emit BuyEvent(msg.sender, tokenId, price); } function sell(uint256 tokenId, uint256 price) external { TOKEN721.transferFrom(msg.sender, address(this), tokenId); sellerOf[tokenId] = msg.sender; priceOf[tokenId] = price; emit SellEvent(msg.sender, tokenId, price); }}
4、请使用你熟悉的工具(Remix/truffle/hardhat/foundry) 部署并验证合约 至此,本篇文章就结束了。如果有问题可以留言,我看到后会回复留言。 |
|