Our launch process has changed from a Vickrey auction to a Dutch auction. This post introduces the Dutch Auction and the concept of Registration Premiums. The goal of this new auction process is to have the simplest possible mechanism for distributing domains.
These changes have already been implemented; for more details on the context of the changes, read our May 13, 2022 Development Update.
The Dutch auction is implemented using the concept of Registration Premiums. When a user registers a domain, they pay the yearly registration fee as well as a one-time Registration Premium (priced in AVAX).
When the project launches, Registration Premiums will be at their highest. This will be the start of the auction.
Users can immediately register domains, but will need to pay the Registration Premium. The Registration Premium will decrease as time progresses, eventually reaching 0 (where it will remain). This will be the end of the auction.
The Registration Premium will decrease over the auction period, until it eventually reaches zero.
Our goals at the moment are to implement the simplest possible auction mechanism so that we can take the product to launch.
Decrease at a constant rate does not work
Originally, we implemented the simplest function to decrease the Registration Premium: a constant rate of decrease. However, we quickly realized this would not work.
We have analyzed data from a similar auction to confirm our suspicions. On the chart below, the x-axis shows the percentage of the total auction value which was exchanged. The y-axis shows the Registration Premium, as a percentage of the maximum value.
We can see that the over 60% of the overall value were from small bids (10% of the maximum bid or less).
We can assume our auction will have a similar bid distribution. Fitting a linear function to this distribution either leaves the majority of bidders with too little a share of the overall auction period, or misses the higher value bids (creating too competitive of an environment when the auction begins).
Approximating this distribution
Matching this distribution in Solidity is difficult (primarily due to lack of floating point numbers). We use a very simple approximation: divide the overall auction period into multiple time periods of equal size. Then, decrease at a constant rate during each of those periods.
This gives us flexibility to support different rates of decrease, while keeping the code fairly simple.