Skip to main content

英国拍卖

NFT 的英国拍卖

拍卖

  1. NFT 卖方部署此合约。
  2. 拍卖会持续7天。
  3. 参与者可以通过存入高于当前最高出价者的 ETH 来出价。
  4. 如果不是当前的最高出价,所有投标人都可以撤回其出价。 拍卖结束后
  5. 出价最高者成为 NFT 的新所有者。
  6. 卖方收到最高出价的 ETH。

English auction for NFT.

Auction

  1. Seller of NFT deploys this contract.
  2. Auction lasts for 7 days.
  3. Participants can bid by depositing ETH greater than the current highest bidder.
  4. All bidders can withdraw their bid if it is not the current highest bid. After the auction
  5. Highest bidder becomes the new owner of NFT.
  6. The seller receives the highest bid of ETH.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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);
}
}