Web3新手系列:从零实现一个NFT DEX
看过前面几篇文章的用户应该知道,对于 ERC-20 协议的代币,我们可以通过以 Uniswap 为代表的 DEX 进行交易,做到去中心化。那么对于 ERC-721 协议,也就是 NFT 来说,如何做到去中心化交易呢。
目前主流的一些 NFT 交易所,采用的是挂单的方式进行交易,就像是把一件件商品列到超市的货架上一样,购买者觉得价格合适,就可以把商品带回家。
本文将通过编写智能合约和一个简单的前端页面,实现 NFT 的去中心化交易。注意本文只供学习使用,并不能真实用在生产环境。
前端:用户选择自己的 NFT,并且设定一个价格,点击上架。
合约:用户需要给合约设置权限,可以操控用户的 NFT。
这样商品就算上架完了。在合约中,需要维护一份用户的上架商品价格 Map,这部分数据一般来说是可以做到中心化的服务中,以减少合约的负担,但是在本文中这部分 Map 数据会维护在合约里面。
到此为止,我们的合约基本功能就算完整了。
之后在钱包里面进行确认就可以 Mint 成功了。
3.3. Portfolio
管理用户的 NFT
在这里需要展示用户所有的 NFT。我们可以使用一些 NFT API 来获取,这里使用 opensea 的 API,因为支持 sepolia 测试链的 NFT API 并不多。
在获取到用户的 NFT 列表之后,需要判断是否已经是上架了的,未上架的支持上架,已上架的支持下架。判断的方式是通过 DEX 合约里面「 getSellerListings 」方法里面获取用户已经上架的 NFT,然后根据这些 NFT 的「 isAlive 」字段来判断是否正在上架。
上架的时候需要调用「 listNFT 」合约方法,在取消的时候需要调用「 cancelListing 」方法。在上架之前,需要额外调用 NFT 的授权方法,将 NFT 授权给合约,这样在后续交易成交之后,这个 NFT 就可以自动转给买方。