案例业务:智能拍卖
需要实现的核心功能
角色:
平台方:
买方:
具体代码实现如下:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
contract paimai{
address owner; //平台方
address seller; //卖方
uint256 public highestBid; //最高价;
address highestBider; //最高价出价者;
uint256 public startBid; //起拍价
uint256 public endTime; //结束时间
bool isFinished;
event BidEvent(address _higher,uint256 highAmount); //当前最高价出价者,金额
event EndBidEvent(address _winner,uint256 _amount); //最终的获胜者及金额
constructor(address _seller,uint256 _startBid,uint256 _endTime){
owner = msg.sender;
seller = _seller;
startBid =_startBid;
isFinished = false;
endTime = block.timestamp+_endTime;
highestBid = 0;
}
function bid(uint256 _amount)public payable{ //竞拍
require(msg.value == _amount,"must equal");
require(_amount>highestBid,"amount must > highestBid");
require(!isFinished,"paimai not end");
require(block.timestamp<endTime,"auction not time out");
if(address(0)!=highestBider){ //如果不相等,说明之前存在一个出价者
payable(highestBider).transfer(highestBid);
highestBider = msg.sender;
highestBid = msg.value;
}else{
highestBider = msg.sender;
highestBid = msg.value;
emit BidEvent(msg.sender, msg.value); //触发谁参与竞拍了;
}
}
function endAuction()public payable{ //结束竞拍
require(!isFinished,"paimai not end");
require(msg.sender == owner,"only owner can end auction");
isFinished=true;
payable(seller).transfer(highestBid * 90 / 100);
payable(owner).transfer(highestBid * 10 / 100);
emit EndBidEvent(highestBider, highestBid); //触发最终获胜者及金额
}
}