GOO (Gradual Ownership Optimization)

09.06.2022|Dave WhiteFrankietransmissions11

Introduction

When NFT projects have a fungible token, the communities holding the NFT and the token tend to diverge over time. We created a mechanism to disincentivize this divergence, and to repair it when it happens anyway. We call it Gradual Ownership Optimization, or GOO.

Art Gobblers, from our upcoming NFT project, are NFTs that produce an Ethereum token called Goo. The more Goo a Gobbler has, the faster it generates more Goo. This means the total Goo supply will increase faster and faster every day, going from thousands to millions and beyond.

Hoarding Goo tokens without owning any Gobbler NFTs is a very bad strategy, as everyone else will be generating goo and your share of the total Goo supply will rapidly dwindle to nothing. On the other hand, if you own many Gobblers but little Goo, your Goo production will lag compared to other players.

But, let's say you maintain ownership of Gobbler NFTs with a combined Goo production capacity of 1% of the total and never remove your Goo. No matter how much Goo you start with, you will eventually end up with at least 1% of the total Goo supply! This ensures Goo stays in NFT holder control over the long term.

Mathematically speaking, instantaneous Goo issuance is equal to

multgoo in tank\sqrt{\texttt{mult}\cdot\texttt{goo in tank}}
, where a Gobbler’s
mult\texttt{mult}
, or multiplier, is its base speed of squirting out Goo. We auto-compound Goo issuance over time using a differential equation, and also automatically balance Goo between gobblers if you have more than one.

In this system, due to some extremely lucky math, it turns out that having many Gobblers with multipliers that add to
total mult\texttt{total mult}
is the same as having a single Gobbler with a multiplier of
total mult\texttt{total mult}
, which means the game stays fair as some players obtain more Gobblers.

where a Gobbler’s mult, or multiplier, is its base speed of squirting out Goo. We auto-compound Goo issuance over time using a differential equation, and also automatically balance Goo between gobblers if you have more than one.

In this system, due to some extremely lucky math, it turns out that having many Gobblers with multipliers that add to total mult is the same as having a single Gobbler with a multiplier of total mult, which means the game stays fair as some players obtain more Gobblers.

While designed for Art Gobblers, this mechanism is applicable to any NFT ecosystem with a fungible token. It keeps NFT and token holders aligned while ensuring the primary importance of the NFT itself. It’s also fun, especially when combined with other mechanisms like VRGDA.

In this paper, we break down the details of the mechanism and provide production-ready code so you can use it in your own project.

Motivation

Current Types of NFT Fungible Token Issuance

There are currently two primary ways that NFT projects issue fungible tokens:

  1. Airdrop. At some particular point in time, all holders of the NFT receive an amount of fungible tokens proportional to the number of NFTs they hold.
  2. Constant emission. Each NFT emits a roughly constant number of tokens over time.

One constant emission method is staking, where NFT holders lock their NFT in a contract and receive some constant number of tokens each day.

Another approximately constant emission method is Play to Earn, where users who own or have access to a given NFT can play a game with the possibility of earning a number of tokens every day, depending on how they play.

The Problem

In both of these cases, the population of people holding the NFT can become quite different from the population of people holding the fungible token over time.

In the case of an airdrop, as some users sell their NFTs without selling their tokens, and others sell their tokens without selling their NFTs, token and NFT ownership falls out of alignment, and no force exists to bring it back in line.

Even with constant emission, because fungible tokens are issued at a constant rate, it can be practically impossible for NFT and fungible token ownership to come back into alignment over time: every day, new tokens issued represent a smaller and smaller percentage of the overall supply. Furthermore, no matter how much of the fungible token you have, there is no incentive to match it with a comparable amount of NFTs, and visa versa. Once the populations of NFT and token holders diverge, nothing realigns them.

Other Requirements for a Solution

We wanted to make sure that Goo was purely a utility token, and that the Art Gobblers NFTs themselves would remain the anchor of the economy. We also wanted our solution to be extremely gas efficient, easy for NFT community members to understand, and, most importantly, fun to use.

Mechanism

Overview

All the Art Gobbler NFTs belonging to a given Ethereum account squirt Goo into a Goo tank associated with that account. The owner of that address can add or remove Goo from that tank at any time.

Art Gobblers squirt out Goo at a rate proportional to the square root of the Goo already in their tanks. Each gobbler has its own

mult\texttt{mult}
, which describes its base rate of goo squirting.

We automatically compound this instantaneous issuance using a differential equation, lazily evaluated so that compounding can occur over arbitrarily long time periods without any need to spend gas.

Goo inflates quadratically over time, significantly slower than the exponential inflation common to most token staking schemes.

Because Goo issuance is at its optimum when Goo is held in proportion to a user’s Gobblers, users are incentivized to hold Goo and Gobblers in proportion. Because the overall rate of Goo emission is always increasing, these incentives remain strong regardless of how much Goo has already been issued.

Due to some very fortunate math, having many Gobblers whose multiplier sums to a given total is the same as having a single Gobbler whose multiplier is equal to that total, ensuring the system stays fair even if some users accumulate large numbers of Gobblers.

Definitions

mim_i
- Gobbler
ii
’s Goo emission multiple

gi(t)g_i(t)
- the amount of Goo in Gobbler
ii
’s tank at time
tt


initial Gooi\texttt{initial Goo}_i
- how much Goo Gobbler
ii
has at time 0

For convenience, we will use
g(t)g(t)
,
mm
, and
initial Goo\texttt{initial Goo}
without the subscripted
ii
when referring to only a single Gobbler.

Goo Issuance

Art Gobblers emit Goo at an instantaneous rate of

mg(t)\sqrt{mg(t)}
.

We picked square root issuance to ensure that Gobblers are more fundamental than Goo — the more Goo you add to a given Gobbler’s tank, the less each new unit of Goo increases that gobbler’s instantaneous Goo issuance. That means users cannot game the system by placing a massive amount of Goo in a single Gobbler’s tank.

For example, at time 1, if
mm
is 2, and
g(1)g(1)
is 2, then instantaneous Goo issuance would be
22=4=2\sqrt{2\cdot2}=\sqrt{4}=2
Goo per day.

Expressed mathematically, we have the following differential equation:

g(t)=mg(t)g'(t) = \sqrt{mg(t)}

Solving it yields

g(t)=14(mt+2initial Goo)2g(t)=\frac{1}{4}(\sqrt{m} t + 2\sqrt{\texttt{initial Goo}})^2

and expanding, we get

g(t)=14mt2+initial Goo+tminitial Goog(t) =\frac{1}{4}mt^2+\texttt{initial Goo}+t\sqrt{m\cdot\texttt{initial Goo}}

Note we assume for convenience that time always starts at 0, while in production one must track the time elapsed since the last interaction with the contract.

Optimizing Goo Production Across Gobblers

Imagine you have 4 Goo and 2 Gobblers, one with a 

mult\texttt{mult}
of 1 and one with a 
mult\texttt{mult}
of 3.

You want to decide how to distribute your Goo between them so as to maximize your rate of Goo production.

If you had to put all of your Goo in only one Gobbler’s tank, it would obviously be better to put it in the tank of the Gobbler with the of 3, for an instantaneous production rate of

34=233.5\sqrt{3*4}=2\sqrt{3}\approx3.5
.

However, splitting your Goo evenly between the Gobblers is even better, for a production rate of

12+32=2+63.9\sqrt{1\cdot2}+\sqrt{3\cdot2}=\sqrt{2}+\sqrt{6}\approx3.9
.

But it turns out we can do even better. For any group of Gobblers with multipliers

mim_i
, it turns out that the optimal way to distribute Goo between them is by allocating
mij=0nmj\frac{m_i}{\sum_{j=0}^n m_j}
of the total Goo to each.

In this case, we would allocate 

144=1\frac{1}{4}\cdot4=1
Goo to the first Gobbler and 
344=3\frac{3}{4}\cdot4=3
Goo to the second Gobbler, for a total instantaneous Goo production of
11+33=1+3=4\sqrt{1*1}+\sqrt{3*3}=1+3=4

Goo Stays Optimized

This would be an interesting but not particularly helpful result if users had to constantly rebalance their Goo between multiple Gobblers to keep them producing optimally.

Fortunately, once balanced, Gobblers stay balanced! To see why, notice that, by definition, at the time of balancing,

initial Gooi=mijmjtotal initial Goo\texttt{initial Goo}_i=\frac{m_i}{\sum_j{m_j}}\texttt{total initial Goo}

If we introduce a new constant

c=total initial Goojmjc=\frac{\texttt{total initial Goo}}{\sum_jm_j}
for convenience, we get

initial Gooi=mic\texttt{initial Goo}_i=m_ic

And plugging that into the definition of

gi(t)g_i(t)
above, we get

gi(t)=14(mit+2initial Goo)2=14(mit+2mic)2g_i(t)=\frac{1}{4}(\sqrt{m_i} t + 2\sqrt{\texttt{initial Goo}})^2=\frac{1}{4}(\sqrt{m_i} t + 2\sqrt{m_ic})^2

and, simplifying,

gi(t)=mi4(t+2c)2g_i(t)=\frac{m_i}{4}(t + 2\sqrt{c})^2

Since this is true for all

ii
we see that regardless of the value of
tt
, the Goo is distributed between gobblers proportionally to their multipliers, which is precisely the condition we need to maintain optimal Goo production.

Goo Production from Multiple Gobblers

This means we can automatically balance Goo between Gobblers for users only once, and they will stay balanced.

Even so, if the resulting rate of Goo production was complicated or hard to understand, the overall system wouldn’t be especially satisfying or fun, and users might not know how to interact with it.

Fortunately, that is not the case. It turns out that, when Goo is optimally balanced between Gobblers with multiples

mim_i
the total rate of Goo production is the same as the rate of Goo production from a single Gobbler with a mult of
j=0nmj\sum_{j=0}^nm_j
-- in other words, having multiple Gobblers with a
mult\texttt{mult}
sum of 100 is the same as having a single Gobbler with a 
mult\texttt{mult}
of 100.

Returning to our original example, we can verify manually that this is the case. When we optimally balance our 4 Goo between our two gobblers with mults 1 and 3 and achieve an instantaneous output of 4, it is the same as putting the 4 Goo in the tank of a single gobbler with a

mult\texttt{mult}
of 1+3=4 to achieve an output of
44=4\sqrt{4\cdot4}=4
. We can see the same would still be true if we had four Gobblers, each with a mult of 1, for a total output of
11+11+11+11=4\sqrt{1\cdot1}+\sqrt{1\cdot1}+\sqrt{1\cdot1}+\sqrt{1\cdot1}=4
.

This end result — that having several Gobblers whose

mult\texttt{mult}
s sum to 10 is the same as having one Gobbler with a mult of 10 — is both very intuitive and very fortunate, since otherwise users could manipulate the rate of Goo production by changing their allocations of Gobblers between wallets.

Incentives

Because Goo inflates quadratically, holding it without holding Gobblers is a grave mistake, as you will not generate any more Goo, and your proportion of the overall supply will rapidly dwindle.

Furthermore, we can see from the auto-balancing section above that the optimal rate of Goo production across the ecosystem is achieved when Goo is distributed proportionally to

mult\texttt{mult}
. So if you have many Gobblers but very little Goo, your production of Goo will lag behind the field’s, and you will be outcompeted. As a result, users are incentivized to keep their Goo and Gobbler holdings roughly in line.

More formally, let’s say you own a collection of gobblers with a total multiplier of

MM
. If you never remove any of your Goo from its collector, from the definition of
g(t)g(t)
we can see that eventually your Goo supply will be approximately equal to
M4t2\frac{M}{4}t^2
, the only quadratic term.

Let’s say that all Gobblers combined have a total multiple of

QQ
. If Goo is perfectly balanced between all the other Gobblers, eventually their Goo supply will be approximately equal to
QM4t2\frac{Q-M}{4}t^2
, so that the total Goo supply will be proportional to
Q4t2\frac{Q}{4}t^2
, and your proportion of it will be
MQ\frac{M}{Q}
, the proportion of total
mult\texttt{mult}
you own.

If Goo is not perfectly balanced between the other Gobblers, your proportion of the total Goo will actually be greater than your proportion of the total

mult\texttt{mult}
.

Of course, this is only the case if the total

mult\texttt{mult}
is remaining constant over time, which it may not depending on how the rest of the system works. Otherwise, you may have to take action to ensure your share of the total
mult\texttt{mult}
remains constant.

Code

A highly optimized, production ready, and permissively licensed (MIT) implementation of GOO can be found at transmissions11/goo-issuance. Pull requests with improvements are welcome.

Conclusion

GOO was designed for Art Gobblers, but we believe it is applicable to a wide variety of NFT projects and on-chain games. If you want to issue a fungible token from an NFT while ensuring users hold the NFT and the token roughly in proportion, GOO may be for you.

If you are interested in integrating GOO into your project, we’d love to hear from you.

You can reach us on Twitter at @_Dave__White_, @FrankieIsLost and @transmissions11.

Written by

Biography

Dave White is a Research Partner at Paradigm. Previously, Dave was a quantitative trader and researcher at firms including Headlands, Two Sigma, and Cutler Group. He is three credits shy of an A.B. in Mathematics from Harvard University.

Frankie

Partner, Investing & Research

Biography

Frankie is a Partner at Paradigm. Previously, Frankie was a machine learning engineer, quantitative developer, and trader. He holds a degree in computer science and econometrics.

Biography

Transmissions is a Research Associate at Paradigm. Transmissions works to push the effiency frontier of smart contracts by developing optimized libraries and primitives. He is also interested in intepreting and programmatically steering large language models. He currently attends high school in California.

Disclaimer: This post is for general information purposes only. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice or investment recommendations. This post reflects the current opinions of the authors and is not made on behalf of Paradigm or its affiliates and does not necessarily reflect the opinions of Paradigm, its affiliates or individuals associated with Paradigm. The opinions reflected herein are subject to change without being updated.

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