
我最近在重新学solidity,巩固一下细节,也写一个“Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。
discord:WTF Academy
所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity
Opensea是以太坊上最大的NFT交易平台,总交易总量达到了$300亿。Opensea在交易中抽成2.5%,因此它通过用户交易至少获利了$7.5亿。另外,它的运作并不去中心化,且不准备发币补偿用户。NFT玩家苦Opensea久已,今天我们就利用智能合约搭建一个零手续费的去中心化NFT交易所:NFTSwap。
NFT的一方,可以挂单list、撤单revoke、修改价格update。NFT的一方,可以购买purchase。NFT链上订。,一个系列的同一tokenId最多存在一个订单,其中包含挂单价格price和持有人owner信息。当一个订单交易完成或被撤单后,其中信息清零。NFTSwap合约合约包含4个事件,对应挂单list、撤单revoke、修改价格update、购买purchase这四个行为:
event List(address indexed seller, address indexed nftAddr, uint256 indexed tokenId, uint256 price);
event Purchase(address indexed buyer, address indexed nftAddr, uint256 indexed tokenId, uint256 price);
event Revoke(address indexed seller, address indexed nftAddr, uint256 indexed tokenId);
event Update(address indexed seller, address indexed nftAddr, uint256 indexed tokenId, uint256 newPrice);
NFT订单抽象为Order结构体,包含挂单价格price和持有人owner信息。nftList映射记录了订单是对应的NFT系列(合约地址)和tokenId信息。
// 定义order结构体
struct Order{
address owner;
uint256 price;
}
// NFT Order映射
mapping(address => mapping(uint256 => Order)) public nftList;
在NFTSwap中,用户使用ETH购买NFT。因此,合约需要实现fallback()函数来接收ETH。
fallback() external payable{}