Created
August 2, 2022 13:35
-
-
Save developeruche/2f6de1a8dcd4f7e227e12323a05c95e3 to your computer and use it in GitHub Desktop.
Solidity English Auction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.13; | |
interface IERC721 { | |
function safeTransferFrom( | |
address from, | |
address to, | |
uint tokenId | |
) external; | |
function transferFrom( | |
address, | |
address, | |
uint | |
) external; | |
} | |
contract EnglishAuction { | |
event Start(); | |
event Bid(address indexed sender, uint amount); | |
event Withdraw(address indexed bidder, uint amount); | |
event End(address winner, uint amount); | |
IERC721 public nft; | |
uint public nftId; | |
address payable public seller; | |
uint public endAt; | |
bool public started; | |
bool public ended; | |
address public highestBidder; | |
uint public highestBid; | |
mapping(address => uint) public bids; | |
constructor( | |
address _nft, | |
uint _nftId, | |
uint _startingBid | |
) { | |
nft = IERC721(_nft); | |
nftId = _nftId; | |
seller = payable(msg.sender); | |
highestBid = _startingBid; | |
} | |
function start() external { | |
require(!started, "started"); | |
require(msg.sender == seller, "not seller"); | |
nft.transferFrom(msg.sender, address(this), nftId); | |
started = true; | |
endAt = block.timestamp + 7 days; | |
emit Start(); | |
} | |
function bid() external payable { | |
require(started, "not started"); | |
require(block.timestamp < endAt, "ended"); | |
require(msg.value > highestBid, "value < highest"); | |
if (highestBidder != address(0)) { | |
bids[highestBidder] += highestBid; | |
} | |
highestBidder = msg.sender; | |
highestBid = msg.value; | |
emit Bid(msg.sender, msg.value); | |
} | |
function withdraw() external { | |
uint bal = bids[msg.sender]; | |
bids[msg.sender] = 0; | |
payable(msg.sender).transfer(bal); | |
emit Withdraw(msg.sender, bal); | |
} | |
function end() external { | |
require(started, "not started"); | |
require(block.timestamp >= endAt, "not ended"); | |
require(!ended, "ended"); | |
ended = true; | |
if (highestBidder != address(0)) { | |
nft.safeTransferFrom(address(this), highestBidder, nftId); | |
seller.transfer(highestBid); | |
} else { | |
nft.safeTransferFrom(address(this), seller, nftId); | |
} | |
emit End(highestBidder, highestBid); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment