//SPDX-License-Identifier:MIT
pragma solidity ^0.8.24;
interface IERC721{function transFrom(address _from,address _to,uint nftid) external ;
}contract DutchAuction
{ address payable immutable seller;//卖方uint immutable startTime;//拍卖开始时间uint immutable endTime;//拍卖结束时间uint immutable lastTime;//拍卖持续时间uint immutable startPrice;//启始价格uint immutable discount;//每秒减少多少钱IERC721 public nft;//nft 变量能够存储一个已经部署的符合 IERC721 接口的合约地址uint public nftId;constructor(//对合约中的不可变变量进行赋值address payable _seller,uint _startTime,uint _lastTime,uint _startPrice,uint _discount,IERC721 _nft,uint _nftId){seller=_seller;startTime=_startTime;lastTime=_lastTime;endTime=_lastTime+_startTime;startPrice=_startPrice;discount=_discount;require(startPrice>discount * lastTime,"it may become nagetive number");//检查一下防止拍卖价成为负数nft=_nft;nftId=_nftId;}function getPrice() public view returns(uint ){//获取当前(调用本函数的时刻)的价格require(startTime+block.timestamp<=endTime,"Sorry,you comes too late");//检查是否流派return(startPrice-(block.timestamp-startTime)*discount);}function buy()external payable returns(bool){uint nowPrice=getPrice();require(msg.value>= nowPrice,"You have no enough money");require(startTime+block.timestamp<=endTime,"Sorry,you comes too late");nft.transFrom(seller,msg.sender,nftId);uint refund = msg.value- nowPrice;payable(msg.sender).transfer(refund);seller.transfer(nowPrice);destroy();return true;}function destroy()public payable{seller.transfer(address(this).balance);}
}
荷兰合约(Dutch Auction Contract)是一种智能合约,通常运行在区块链上,用于实现荷兰式拍卖(Dutch Auction)的拍卖逻辑。荷兰合约的设计旨在确保拍卖过程的透明性、安全性和自动化执行。
荷兰拍卖的基本组成和功能:
-
起始价格设定:
- 合约会设定一个初始的高价作为起始拍卖价格。
-
价格递减设定:
- 根据预定的规则或时间间隔,合约会以固定速度递减拍卖价格。这个递减的速度通常是事先确定好的,可以根据拍卖的需求调整。
-
买家接受价格:
- 参与者可以在拍卖过程中选择接受当前价格。一旦有人接受了当前价格,拍卖即结束。
-
自动执行:
- 荷兰合约通常具备自动执行功能,一旦有人接受了当前价格,合约会立即执行资金的转移和商品或服务的交割。
-
资金管理:
- 合约会确保安全地处理所有资金的转移,确保卖方和买方的权益。
-
拍卖结束条件:
- 拍卖可以在以下条件下结束:
- 有人接受了当前价格;
- 拍卖价格降至预设的最低价;
- 达到预定的拍卖结束时间。
- 拍卖可以在以下条件下结束: