欢迎订阅专栏:3分钟Solidity--智能合约--Web3区块链技术必学
如需获取本内容的最新版本,请参见 Cyfrin.io 上的荷兰式拍卖(代码示例)
NFT荷兰式拍卖。
拍卖
- NFT卖家部署此合约,为NFT设定起拍价。
- 拍卖持续7天。
- NFT价格随时间递减。
- 参与者存入高于智能合约计算的当前价格的ETH即可购买。
- 当有买家购买NFT时,拍卖结束。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
interface IERC721 {
function transferFrom(address _from, address _to, uint256 _nftId)
external;
}
contract DutchAuction {
uint256 private constant DURATION = 7 days;
IERC721 public immutable nft;
uint256 public immutable nftId;
address payable public immutable seller;
uint256 public immutable startingPrice;
uint256 public immutable startAt;
uint256 public immutable expiresAt;
uint256 public immutable discountRate;
constructor(
uint256 _startingPrice,
uint256 _discountRate,
address _nft,
uint256 _nftId
) {
seller = payable(msg.sender);
startingPrice = _startingPrice;
startAt = block.timestamp;
expiresAt = block.timestamp + DURATION;
discountRate = _discountRate;
require(
_startingPrice >= _discountRate * DURATION, "starting price < min"
);
nft = IERC721(_nft);
nftId = _nftId;
}
function getPrice() public view returns (uint256) {
uint256 timeElapsed = block.timestamp - startAt;
uint256 discount = discountRate * timeElapsed;
return startingPrice - discount;
}
function buy() external payable {
require(block.timestamp < expiresAt, "auction expired");
uint256 price = getPrice();
require(msg.value >= price, "ETH < price");
nft.transferFrom(seller, msg.sender, nftId);
uint256 refund = msg.value - price;
if (refund > 0) {
payable(msg.sender).transfer(refund);
}
selfdestruct(seller);
}
}
Remix Lite 尝试一下