Untitled

mail@pastecode.io avatar
unknown
plain_text
3 years ago
2.0 kB
4
Indexable
Never
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Auction {

    event Start();
    event Ended(address indexed highestBidder, uint bidAmount);
    event Bid(address indexed sender, uint amount);
    event Withdraw(address indexed bidder, uint amount);

    address payable public seller;
    bool public started;
    bool public ended;
    uint public endAt;

    uint public highestBid;
    address public highestBidder;

    mapping(address => uint) public bids;
    
    constructor () {
        seller = payable(msg.sender);
    }

    function start() external{
        require(msg.sender == seller, "You cannot start the bidding");
        require(!started,"Auction is already started");
        started = true;
        highestBidder = msg.sender;
        highestBid = 0;
        endAt = block.timestamp + 2 days;
        emit Start();
    }

    function end() external {
        require(!ended, "This autction is already ended!");
        require( block.timestamp >= endAt, "There is still time left");
        ended = false;
        emit Ended(highestBidder, highestBid);
    }

    function bid() external payable {
        require(started, "Auction needs to be started first");
        require(block.timestamp < endAt, "Auction ended");
        require(msg.value > highestBid, "Bidding amount must be greater than current highest bid`");

        highestBidder = msg.sender;
        highestBid = msg.value;
        
        if(highestBidder != address(0) ) { // 0000000000000000000
            bids[highestBidder] += highestBid;
        }

        emit Bid(highestBidder, highestBid);
    }

    function withdraw() external payable {
        uint bal = bids[msg.sender];
        bids[msg.sender] = 0;
        // bool sent = payable(msg.sender).send(bal);
        // require(sent, "Failed to send Ether");
         (bool sent, bytes memory data) = payable(msg.sender).call{value: msg.value}("");
        require(sent, "Failed to send Ether");

        emit Withdraw(msg.sender, bal);
    }
  
}