08.24.2022|transmissions11FrankieDave White
This paper introduces a novel token issuance mechanism. Variable Rate GDAs (VRGDAs), designed for Art Gobblers and used in 0xMonaco, let you sell tokens close to a custom schedule over time by raising prices when sales are ahead of schedule and lowering prices when sales are behind schedule — a generalization of the GDA mechanism.
We provide both an overview of the mechanism and a highly optimized, production-ready Solidity implementation of the core mechanism and several example schedules.
Art Gobblers is a digital art experiment by Justin Roiland and Paradigm. An important objective of the project was to create a self-sustaining ecosystem that could thrive on its own without human intervention for years to come.
There are two core NFTs in this system, and we wanted anyone to be able to purchase either at any time.
We wanted to issue both relatively quickly at first. Over time, one tops out at a fixed supply, whereas the other is issued at a slow constant rate forever.
We sought to achieve these goals while maintaining a seamless user experience that would allow users to buy NFTs at any time, without having to, for example, wait for a scheduled auction.
Our solution was VRGDAs, a generalization of GDAs that allows for arbitrary scheduling of NFT issuance, as opposed to the uniform linear scheduling of standard GDAs.
Imagine a simple schedule where we want to sell 10 NFTs per day. We set a starting price of 1 token for the first NFT.
Suppose it is currently day 5, so we should have sold 50 NFTs. However, demand has been high, and we have sold 70. We weren’t supposed to sell 70 NFTs until day 7, so we are two days ahead of schedule.
As a result, we want to charge a higher price going forward. We use an exponential curve to determine how much higher. This can vary based on parameters, but in this case, let’s say we use
Ten days later, on day 15, we should have sold 150 NFTs, but users have only bought 120, the amount they should have bought by day 12, meaning we are three days behind schedule. We adjust the price to , making it easier for users to buy more NFTs.
Ten days later, on day 15, we should have sold 150 NFTs, but users have only bought 120, the amount they should have bought by day 12, meaning we are three days behind schedule. We adjust the price to
Parameters
Objective
We want to issue NFTs on a particular schedule. The mechanism we will use to do this is to raise prices if NFTs are sold ahead of schedule and lower them if they are sold behind schedule. If sales are perfectly on schedule, the price to buy the next one will remain the same.
Definitions
Let’s say we want to sell NFTs at a schedule described by
Let’s also say we want to sell our NFTs using a separate Dutch Auction per NFT. If we set each NFT’s starting price at 1, and let this price decay by a rate of per unit of time with no sales, its price if purchased at time
To give ourselves the flexibility we need to achieve our objective, we can shift the starting point of the auction in time by some
If we want our target price to be different than 1, we can multiply by a constant
According to our issuance schedule
A consequence of the VRGDA objective is that if the
Simplifying by dividing out
Which implies
By substituting this definition of
Below we demonstrate deriving some simple issuance schedules to use with the VRGDA formula.
Let’s say we want to sell
After plugging this
Note this is isomorphic to a GDA, which is why we call VRGDA a generalization of GDA.
Let’s say that we want to issue NFTs at a rate proportional to the square root of time — for example, to issue NFTs more quickly at first, and then more slowly over time, but without ever stopping.
We can then set
In this case,
The logistic issuance schedule is somewhat complex compared to the examples above. However, we have chosen to cover it in detail nonetheless as it provides a way to bootstrap initial growth without enforcing an infinite inflation regime.
Let’s say we want to issue NFTs quickly at first, but then slow down until eventually some maximum number have been issued, as is the case in Art Gobblers.
One clean way to model this is using the logistic function with positive domain.
The logistic function is an S-shaped curve. We’ll simplify it slightly and define it as:
This curve approaches 0 as
For our particular application, we don’t want to use the full S curve (although it’s also possible to have a full logistic VRGDA that would start slow, speed up, and then slow down again). Instead, we want to use only the part of the curve where
Because
We want to issue
We can also introduce a time-scaling parameter
To pick
Furthermore:
This means we can pick
Taking the inverse of
Putting this all together, we end up with the following formula:
A highly optimized, production ready, and permissively licensed (MIT) implementation of VRGDAs and an assortment of issuance schedules can be found at transmission11/VRGDAs. Pull requests with improvements are welcome.
VRGDAs provide a way to issue NFTs using nearly any schedule you would like while still allowing users to seamlessly buy them at any time.
In the case of Art Gobblers, they allowed us to customize our community growth and UGC dynamics. In the case of 0xMonaco, it created a challenging and highly competitive game loop.
We believe there many other potential applications across NFTs, on-chain gaming, DeFi, and beyond. If you’d like to explore them, we’d love to hear from you. You can reach us on Twitter at @transmissions11, @FrankieIsLost and @_Dave__White_.
We can’t wait to see what you build.
Acknowledgments: Dan Robinson, samczsun, Riley Holterhus, NN Blossoms, dcfpascal, kootsZhin, Grug, Ben Leimberger, Kiran Cherukuri, Aaru, eva
Graphics By: Achal Srinivasan
Copyright © 2024 Paradigm Operations LP All rights reserved. “Paradigm” is a trademark, and the triangular mobius symbol is a registered trademark of Paradigm Operations LP