✍️ NFT Signature Based Auction

Branch Info

Author: Temirzhan Yussupov Source code: https://github.com/scaffold-eth/scaffold-eth-examples/tree/signature-nft-auction Intended audience: Intermediate Topics: Scaffold-eth basics, NFTs

🏃‍♀️ Quick Start

Signature based NFT auction with off-chain bidding where the seller commits the highest bid onchain
Table of Contents

About The Project

We will show you how a simple Signature based NFT auction can be built and also will demonstrate how you can spin it up locally as a playground.

Speed Run


Getting Started


You have to know what is an ERC721 standard and what is NFT. Please refer to this and this for more information if you are not familiar with these terms.


Let's start our environment for tinkering and exploring how NFT auction would work.
  1. 1.
    Clone the repo first
git clone -b signature-nft-auction https://github.com/scaffold-eth/scaffold-eth-examples.git nft-auction
cd nft-auction
  1. 1.
    Install dependencies
yarn install
  1. 1.
    Start local chain
yarn chain
  1. 1.
    Start your React frontend
yarn start
  1. 1.
    Deploy your smart contracts to a local blockchain
yarn deploy
  1. 1.
    The ui currently depends on a json file so to generate that run
yarn upload

Smart contracts

Let's navigate to packages/hardhat/contracts folder and check out what contracts we have there.
We are mostly interested in Auction.sol smart contract which contains all the logic for NFT auction.


First of all, note how we are initializing our smart contract using this line.
contract Auction is IERC721Receiver
We inherit from IERC721Receiver which is an interface created by OpenZeppelin. Inheriting from this contract will allow us to receive transfer of NFT from another account to our contract.
For signature verification we use Signature Checker contract based on EIP 1271, do check that out for more details.
Inheriting from this contract also requires us to paste the implementation of onERC721Received which you can find at the bottom of the contract.
The logic for creating an auction is in createTokenAuction function. It takes an address of NFT contract which in our case is an address of YourCollectible.sol deployed to our local chain, unique token ID which is going to be sold, minimum bid and duration in seconds.
ERC721(_nft).safeTransferFrom(owner, address(this), _tokenId);
tokenToAuction[_nft][_tokenId] = _auction;
As you can see above, creating an auction means temporarily transfer an NFT to the Auction contract and also save information about auction to our Solidity mapping.
The Bid placing takes places off-chain so first bidders need to stake eth and then they place bids off-chain which involves the bidders to sign a transaction and the signed transactions get's stored in the server and at any point in time they can withdraw their stake.
executeSale is a function used to complete the auction and identify the winner. It simply checks the last element of all bids placed and transfers NFT to the winner. If no bids were made, NFT is returned back to the initial owner.
cancelAuction allows to prematurely cancel the auction and lets the initial owner to get back his NFT.


Firstly, let's get us some funds using local faucet and mint any NFT, so we become its owner.
You can now note that we have an option to Start auction because we are an owner of this newly minted NFT. Let's try to start an auction!
The minimal bid that users will be able to place is 0.1 ETH, and the total duration for our auction will be 5 minutes.
Screenshot 2021-05-08 at 5 31 03 PM
Auction is now in progress, and we can complete it or cancel it. No bids were made yet so there is no information about them yet. Inorder to make a bid we need to stake some eth and then make a bid which will just require our signature since that is off-chain.
After you submit your bid, the information about auction will be updated if your bid is the highest at this point of time.
We placed a bid of 0.2 ETH and now we are the highest bidder. Yay!
Now let's try to open an incognito window and place a higher bid by a different user.
We placed 0.5 ETH big as a different user and now it's the highest bid. Now let's get back to our first account to complete an auction.
As you see, after we finished the auction, we are no longer an owner of the NFT. The account which placed 0.5 ETH is now a new owner. This is why we do not have an option to start an auction now.

Additional resources

  • Dutch auction - The idea behind auctions used in this contract


Join the telegram support chat 💬 to ask questions and find others building with 🏗 scaffold-eth!