Build An Auction Button For Your NFT Marketplace

Build An Auction Button For Your NFT Marketplace

⚠️ Warning: This guide currently uses v4 of the Connect SDK. For v5 (latest) code snippets, please check out our documentation while this guide is being updated. ⚠️

In this guide, we'll show you how to build a simple React component that can list an NFTs for auction on a marketplace smart contract when clicked!

If you're starting from scratch, use the thirdweb CLI to create a new project,

npx thirdweb create --app --cra --js

If you're integrating into an existing project,
install the required dependencies to get started with thirdweb, by running the following command:

npm install @thirdweb-dev/sdk @thirdweb-dev/sdk ethers@5

Setting up the project

In your App.jsx, we import the two components we're going to create in this guide:

  • Connect component
  • Auction component
import AuctionComponent from "./components/Auction";
import Connect from "./components/Connect";

function ExampleApp() {
  return (
    <>
      <Connect />
      <AuctionComponent />
    </>
  );
}
export default ExampleApp;

Connect Wallet button

Create a new folder called components inside the src directory, that will host all custom components of your app.

After that, create a new file called Connect.js.

The component is very simple and only consists of the following code:

import { useAddress, useMetamask } from "@thirdweb-dev/react";

const Connect = () => {
  const address = useAddress();
  const connectWithMetamask = useMetamask();

  if (address) {
    return <p>Welcome, {address}</p>;
  }

  return (
    <button onClick={() => connectWithMetamask()}>
      Connect Metamask Wallet
    </button>
  );
};

export default Connect;

The Auction button

Create another file called Auction.js inside your components folder.

In this component, we'll create a form that allows a user to create an auction listing.

First, we import all the necessary dependencies.

import { useMarketplace } from "@thirdweb-dev/react";
import { NATIVE_TOKEN_ADDRESS } from "@thirdweb-dev/sdk";

Then fetch our marketplace using the useMarketplace hook:

export default function Auction() {
  // Connect to our marketplace contract via the useMarketplace hook
  const marketplace = useMarketplace(
    "0x277C0FB19FeD09c785448B8d3a80a78e7A9B8952", // Your marketplace contract address here
  );

  // rest of the code goes here
}

Here is the function that we'll run when the form is submitted, to create an auction listing:

async function createAuctionListing(e) {
  // prevent page from refreshing
  e.preventDefault();

  // De-construct data from form submission
  let { contractAddress, tokenId, price } = e.target.elements;

  contractAddress = contractAddress.value;
  tokenId = tokenId.value;
  price = price.value;

  try {
    const transaction = await marketplace?.auction.createListing({
      assetContractAddress: contractAddress, // Contract Address of the NFT
      buyoutPricePerToken: price, // Maximum price, the auction will end immediately if a user pays this price.
      currencyContractAddress: NATIVE_TOKEN_ADDRESS, // NATIVE_TOKEN_ADDRESS is the crpyto curency that is native to the network. e.g. ETH.
      listingDurationInSeconds: 60 * 60 * 24 * 7, // When the auction will be closed and no longer accept bids (1 Week)
      quantity: 1, // How many of the NFTs are being listed (useful for ERC 1155 tokens)
      reservePricePerToken: 0, // Minimum price, users cannot bid below this amount
      startTimestamp: new Date(), // When the listing will start
      tokenId: tokenId, // Token ID of the NFT.
    });

    return transaction;
  } catch (error) {
    console.error(error);
  }
}

Now let's create a form and store the values the user enters.

Declare some variables that will be passed through to identify our NFT we want to list:

return (
  <form onSubmit={(e) => createAuctionListing(e)}>
    {/* NFT Contract Address Field */}
    <input
      type="text"
      name="contractAddress"
      placeholder="NFT Contract Address"
    />

    {/* NFT Token ID Field */}
    <input type="text" name="tokenId" placeholder="NFT Token ID" />

    {/* Sale Price For Listing Field */}
    <input type="text" name="price" placeholder="Sale Price" />

    {/* Submit button */}
    <button type="submit">List NFT</button>
  </form>
);

Conclusion

That's it! You can now check your demo by running:

npm run start

Learn more about what you can do with the marketplace contract on the
Marketplace pre-built contract page!