Dutch Auctions
Dutch auctions allow NFT Creators to sell their NFTs at a guaranteed minimum reserve price, all the while allowing the market to decided the pricing of the NFTs.
In a typical Dutch auction of a single object, the auctioneer begins with a high asking price, and lowers it until some participant accepts the price. If no participant accepts the price it will reach a predetermined reserve price limit.
If the auction is selling a fungible asset or multiple objects of equal standing, say N objects, then the N highest bids will be accepted, but not at their bid price but at the price of the lowest accepted bid.
If 10 NFTs are sold in a dutch auction, and there were the following bids:
1 NFT at 50 SUI
3 NFTs at 45 SUI
2 NFTs at 30 SUI
4 NFTs at 25 SUI
2 NFTs at 24 SUI
...
Then, the sale auction will conclude with 10 NFTs being sold at 25 SUI.
Creators can use the Dutch auction sale in conjunction with the fixed price sale, by performing a tiered sale where the common NFTs are sold at a fixed price but the rare NFTs are sold in a Dutch auction.
The
DutchAuctionMarket
object is as follows:struct DutchAuctionMarket<phantom FT> has key, store {
id: UID,
/// The minimum price at which NFTs can be sold
reserve_price: u64,
/// A bid order stores amount of "T"okens the buyer is willing to
/// purchase
bids: CBTree<vector<Bid<FT>>>,
}
/// A bid for one NFT
struct Bid<phantom FT> has store {
/// Amount is equal to the price that the bidder is ready to pay for
/// one NFT.
amount: Balance<FT>,
/// The address of the user who created this bid and who will receive
/// an NFT in exchange for their tokens.
owner: address,
}
There are multiple ways to create a Dutch auction market:
- 1.You can call
dutch_auction::init_market
to create a standaloneMarket
object, albeit for the sale to be fully configured this object must be owned by aninventory
object which is responsible for owning the NFTs that will be sold. You can then add the market object to an inventory by callinginventory::add_market
- 2.Alternatively, when a collection is created on chain, its NFTs need to be initially created and transferred to an inventory. A pattern that allows for the speed up of this process is for the Creator to instantiate the
Inventory
objects privately, along with the markets, and only then transfer these to theListing
object. From this, the Creator can callinventory::init_inventory
and then calldutch_auction::create_market_on_inventory
Both of the above patterns require the
Inventory
to be transferred to the listing via listing::add_inventory
.Or additionally, you can call
dutch_auction::create_market_on_listing
which will create the market on an Inventory
already owned by a Listing
.Last modified 8mo ago