代码拉取完成,页面将自动刷新
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface IERC721 {
function transferFrom(address _from, address _to, uint _nftId) external;
}
/**
* @name: DutchAuction
* @desc: 荷兰拍卖
*/
contract DutchAuction {
// 拍卖持续时间
uint private constant DURATION = 7 days;
// 拍卖 nft 合约
IERC721 public immutable nft;
// 拍卖 nft id
uint public immutable nftId;
// 拍卖人
address payable public immutable seller;
// 起始价格
uint public immutable startPrice;
// 开始时间
uint public immutable startAt;
// 到期时间
uint public immutable expiresAt;
// 每秒折扣率
uint public immutable discountRate;
constructor(
uint _startPrice,
uint _discountRate,
address _nft,
uint _nftId
) {
// 拍卖完后要把主币发送给seller
seller = payable(msg.sender);
startPrice = _startPrice;
discountRate = _discountRate;
startAt = block.timestamp;
expiresAt = startAt + DURATION;
// 随着每秒折扣,价格不能大于起拍价
require(_startPrice >= _discountRate * DURATION, "starting price < discount");
// 将address转换成IERC721合约
nft = IERC721(_nft);
nftId = _nftId;
}
/**
* @name: getPrice
* @desc: 随着时间的流逝,获取当前价格
* @param {public view} returns
* @return {*}
*/
function getPrice() public view returns (uint) {
// 流逝时间
uint timeElapsed = block.timestamp - startAt;
// 需要折扣的价格
uint discount = discountRate * timeElapsed;
// 当前价
return startPrice - discount
}
/**
* @name: buy
* @desc: 购买nft
* @return {*}
*/
function buy() external payable {
// 拍卖没有到期
require(block.timestamp < expiresAt, "auction expired");
// 获取价格
uint price = getPrice();
// 购买的ETH必须大于价格
require(msg.value >= price, "ETH < price");
// 发送nft
nft.transferFrom(seller, msg.sender, nftId);
// 当ETH>价格,要把多余eth退款给用户
uint refund = msg.value - price;
if (refund > 0) {
payable(msg.sender).transfer(refund);
}
// 自毁并发送主币给seller
selfdestruct(seller);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。