[區塊鏈&DAPP介紹 Day20] contract 案例2 - 拍賣
今天來介紹第二個案例。今天的案例就以拍賣為情境設定
情境
假設要制定一定拍賣場的合約,到底要怎麼定義呢?首先需要三個角色
- 拍賣人
- 委託人
- 買家
再來需要一個競標的功能,可以讓買家出價,並且要在時間限定內,價錢最高者得到。下面我們來看看範例
// 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);
}
}