今天來介紹第二個案例。今天的案例就以拍賣為情境設定

情境

假設要制定一定拍賣場的合約,到底要怎麼定義呢?首先需要三個角色

  1. 拍賣人
  2. 委託人
  3. 買家

再來需要一個競標的功能,可以讓買家出價,並且要在時間限定內,價錢最高者得到。下面我們來看看範例

// 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;
        sellet = payable(msg.sender);
        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);
    }
}