
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
contract auction {
    //紀錄賣家
    address payable public seller;
    //紀錄最高買家
    address payable public buyer;
    //紀錄最高出價金額
    uint public auctionAmount;
    //拍賣結束時間
    uint auctionEndTime;
    //拍賣是否結束
    bool isFinish;
    constructor(address payable _seller,uint _duration)  {
        seller = _seller;
        auctionEndTime = _duration + block.timestamp;
        isFinish = false;
    }
    //競拍功能
    function bid() public payable{
        //確認拍賣還在執行中
        require(!isFinish);
        //確認拍賣還在時間範圍內
        require(block.timestamp<auctionEndTime);
        //確認你送的值有大於目前的拍賣最高價
        require(msg.value>auctionAmount);
        //退錢給上一個買家
        if(auctionAmount>0) {
            buyer.transfer(auctionAmount);
        }
        buyer = payable(msg.sender);
        auctionAmount = msg.value;
    }
    //結束拍賣
    function auctionEnd() public payable{
        //確認現在時間大於拍賣結束時間
        require(block.timestamp>=auctionEndTime);
        //確認拍賣是否結束
        require(!isFinish);
        //把拍賣開關關掉
        isFinish = true;
        //把錢送給賣家
        seller.transfer(auctionAmount);
    }
}
這份合約比較好理解幾個面向講解
constructor 這是第一次部署才會用到
isFinish 可以看到這個就是拍賣的開關
整個流程其實是
是否拍賣開啟?⇒是否還在拍賣時間內⇒紀錄最高開價的人⇒結束拍賣時給賣家!
有任何問題可反饋: [email protected]