Thetaboard Marketplace

Introduction

The interest around NFTs is not slowing down. This project aims to provide an easy way to create and manage drops that would be fully using the capabilities of the Theta blockchain by having every NFT, Sell Contract and Auctions managed by smart contracts. It is bringing transparency and trust to drops by having all the logistics of a drop auditable by anyone, while also providing access to artists to maintain control over their drop creation and distribution.

Who is this project for?

This project is targeting two personas that we are going to call CREATORS and BUYERS. CREATORS are artists that are interested in selling their art on a digital marketplace. They are not necessarily well versed in the blockchain and might have limited understanding of how smart contracts works. They want to easily reach art enthusiasts. BUYERS are art enthusiasts. They want to browse and buy art in an easy and secure fashion. They are either creating a digital art collection for themself, making art investment or supporting an artist that they like.

How does it work for CREATORS?

Upon registered account approval from Thetaboard admin, CREATORS have additional tabs available in their thetaboard dashboard menu to access a walled 'back-office'. The back office enables CREATORS to define their artist profile, which is composed of a name, theta wallet address, avatar, short description, and link to their social media profiles. Once they have defined their profile, they can start creating DROPS. A DROP is a collection of NFTs. These NFTs are encouraged to have a common theme and are sold during a specified time period. A DROP is composed of a name, start and end date, an image that represents the drop and a short and a long description.

Inside each DROP, each NFT is defined, having a name, image, short and long description associated with it. They can also have up to 5 extra assets. An asset, either an animation or image, has a name and description.

Each NFT has 3 different methods for selling :

  • "open" meaning there is a static price and limited in time,
  • "limited" meaning a static price and limited in the amount of editions
  • "auction" which enable the N biggest bidder(s) to purchase the NFT at the end of the time limited DROP.

When a DROP and each of its NFTs are defined a CREATOR can deploy it to the blockchain simply by clicking on the 'Deploy NFTs to Blockchain' button. It will trigger metamask transactions that deploys each of the NFTs, the required permission to manage the NFTs and set up the contracts to sell.

How does it work for BUYERS?

Thetaboard introduced a marketplace, where all the drops can be found.

When a DROP seems interesting for a BUYER, they can click and explore all the NFTs that are part of the DROP. For NFTs that are sold using the "open" or "limited" format, a BUYER is able to trigger a metamask transaction to acquire the NFT. In the case of an "auction", the BUYER will trigger a metamask transaction to place a bid. Each bid is securely stored on a smart contract. If someone outbids a BUYER, the BUYER gets refunded the full amount of the bid. When the auction comes to an end, the BUYER(S) receives the NFT and the bid funds are redistributed between the artist and the owner of the smart contract.

How did we build it?

We built a set of 3 smart contracts:

  1. ThetaboardNFT,
  2. ThetaboardDirectSell,
  3. ThetaboardAuctionSell

They can be found here :

https://github.com/thetaboard-org/smart_contracts/blob/master/contracts/

  1. ThetaboardNFT
    The smart contract is following the standard TNT721. It is a fork from the zeppelin open source contract, the documentation can be found here: https://docs.openzeppelin.com/contracts/3.x/api/token/erc721

  2. ThetaboardDirectSell
    This custom contract was written for thetaboard. The purpose of this contract is to act as a controller for selling NFT using the "open" or "limited" options. It uses 3 different functions:

newSell(address _nftAdress,uint256 _nftPrice, utin256 _maxDate, uint256 _maxMint, address _artistWallet, uint8 _artistSplit ) external

Create a new "sell" contract for a NFT address.
Requirements:

  • _nftAddress cannot be the zero address.
  • _nftAdress cannot already exists in this contract
  • _nftPrice can't be 0
  • _maxDate should be either 0 ( no limit in time) or higher than now.
  • _maxMint should be either 0 ( no limit in edition) or higher than 0.
  • _artistSplit is a % , must be between 0 and 100

purchaseToken(address _nftAddress) external payable

Mint an NFT for the senders address, send tfuels to the contract owner and artist based on the _artistSplit.
Requirements:

  • _nftAddress cannot be the zero address.
  • _nftAdress cannot already exists in this contract
  • msg.value must be equal to NFT price
  • Nft.totalSupply() must be lower than sellContract.maxMint
  • sellContract.maxDate must be higher than today

getNftSell(address _nftAddress) external view

Get all the informations about a sell contract NFT

  1. ThetaboardAuctionSell
    This is a custom contract written for thetaboard. The purpose of this contract is to act as a controller for any "auction". It uses 4 different functions:

newAuction(address _nftAdress,uint256 _nftPrice, utin256 _maxDate, uint256 _maxMint, address _artistWallet, uint8 _artistSplit ) external
Create a new "auction" contract for a NFT address where the _nftPrice is the initial bid and maxMint is the amount of editions that will be minted at the end.
Requirements:

  • _nftAddress cannot be the zero address.
  • _nftAdress cannot already exists in this contract
  • _nftPrice can't be 0
  • _maxDate should be either 0 ( no limit in time) or higher than now.
  • _maxMint should be either 0 ( no limit in edition) or higher than 0.
  • _artistSplit is a % , must be between 0 and 100

placeBid(address _nftAddress) external payable

Save a bid equals to msg.value, it checks if the current bid is higher than all the current bids, and if yes, it will return the bid of the current lowest bidder. Requirements:

  • _nftAddress cannot be the zero address.
  • _nftAdress cannot already exists in this contract
  • msg.value must be higher than current min bid
  • auctionContract.maxDate must be higher than today

concludeAuction(address _nftAddress) external payable

The creator of an auction can call this function to end the auction. Which will mint the NFTs to the highest bidders and send tfuels to the contract owner and artist based on the _artistSplit
Requirements:

  • _nftAddress cannot be the zero address.
  • _nftAdress cannot already exists in this contract
  • msg.value must be higher than current min bid
  • auctionContract.maxDate must be higher than today

getNftAuction(address _nftAddress) external view

Get all the information about an auction.

Thetaboard marketplace was built using EmberJs in the front-end. Any interaction done with the blockchain was made using web3, metamask and theta-js. The code can be found here: https://github.com/thetaboard-org/thetaboard-ui

The back-end is built using NodeJS, and MySQL as a database. The code can be found here: https://github.com/thetaboard-org/webserver

What is next for Thetaboard Marketplace ?

We want anyone to be able to come to Thetaboard and become a CREATOR in control of their artistic expression. We plan to host a secondary market place, so anyone will be able to buy and sell NFTs with other BUYERS. This secondary marketplace will also enable artists to collect a set commission on any secondary sales for the art they have created and launched as a Thetaboard CREATOR.

Built With

+ 9 more
Share this project:

Updates