USDf Post-Mortem

Many people have asked for a post-mortem on USDf and here is the core team’s analysis.

USDf started off very strong and because of high APYs with farming, liquidity began building up very nicely.

With basically a non-existent USDf supply, users could only get USDf from minting 1-1 with USDC or buying on the open market. When USDf’s 1-H TWAP > $1, the CR (collateral ratio) would drop by 0.5% and vice versa.

Ultimately, as more and more USDf were minted, and the CR dropped, to get the arbitrage opportunity of selling USDf, new users had to buy Gaia, pushing up the price of Gaia and making the APY that much more attractive.

The CR dropped and dropped until hitting a low of 57%, upon which some users began to withdraw their principal and earnings. As much as the CR being lowered helped increase the APY, withdrawing USDf and minting more Gaia did the opposite. As users began to withdraw USDf, any gaia minted would be sold directly for Gaia -> USDf -> USDC -> ETH. This would decrease the price of Gaia and subsequently the APYs, meaning more withdrawals and removals of liquidity.

Ultimately, the idea of fractional-algorithmic style stablecoins are the future but it is very important to lower the CR gradually. As a matter of comparison, Frax’s CR is roughly 85% at the time of this writing, meaning that roughly $15M of FRAX is backed by FXS, which is value at around $75M.

It is imperative that the total amount of algorithmic backing must always be multiples less than the total market cap of the algorithmic asset.

The problem with USDf is that at a $13M marketcap, a 57% CR implies a 43% backing of Gaia (roughly $5.59M in value), whereas the total MC of Gaia was roughly the same if not slightly less.

If USDf were to be done again, it is imperative to set the initial guardrails much higher (ie CR minimum to be 95% or something similar) and allow Gaia to be given a fair market cap, multiplies higher than what it is backing.

The game theory bet is that if everyone were able to liquidate their USDf in one transaction, that the Gaia minted would be able to be redeemed into Gaia very close to a $1 par value. If not, then the house of cards will fall.

Given this analysis, while it is unfortunate what happened in USDf, it is a great lesson for all those in crypto trying to build algorithmic stablecoins. Please remember that while USDf did not 100% work out, that this is an experiment and most experiments don’t become wildly successful.

There are a couple routes from here.

1: keep the current USDf setup and see where it goes
2: re-launch USDf and Gaia under a new contract with sufficient guardrails (ie a minimum CR of 95%).

Relaunch or Not?
  • Relaunch
  • No

0 voters

2 Likes

Can I swap my 200m shit gaia for new gaia though

4 Likes

I attempted to redeem 27,508.244 USDf for USDC… while there was still 3-4 million in the USDf contract… by the time the hour was up there was no USDC left.
Now i have no USDf or the ability to get USDC

I am up for whatever option is more likely to be able to redeem or eventually withdraw the equivalent value of money i lost with USDf…

Please advise…

2 Likes

Thanks for the update. I must say that after a complete collapse of a profocol, I expected a bit more info in such a post mortem other than a recap of what we already knew.

I mentioned it in other posts already, but the community is hoping to get an answer to, among others:

  • The devs decided to manually increase the collateral ratio. The decision was made to increase it to 95%. At that time, the USDf price was ~0.8$. Can you explain the rationale of such a move?

  • The contract has no functionality -unlike other fractional stablecoins- to perform any check for the collateral amount (at all) when minting/redeeming. Many users’ loss could have been prevented even by a simple UI, client-side check. Essentially it should have been checked whether the user’s redeem would bring the collateral reserve to zero -or below.

  • During such ‘crisis times’, no message/update/… by any team member was given. A tweet was sent indicating the collateral ratio was raised, but I had to personally explain you on Twitter why what you did didn’t actually do anything. Was this a panic move, or a well thought solution that unfortunately lead to unexpected (??) effects?

Let’s all hope for a solution for those ~300k USDf that’s still pending to be redeemed…

My proposed improvements would be:

  • Add a check in the contract on every redeem wether the collateral reserve would remain > 0
  • Do not decrease the collateral ratio with 0.5% every hour. Should be reduced to 0.1% or less.
  • Decrease the 1h withdrawal delay on the redeem
  • Never ever, ever manually increase the collateral ratio to above USDf price…
4 Likes

the post-mortem gets a few things right but fails to address a couple of other important points that led to the downfall.

  1. the long twap pricing on the gaia oracle was not the best move. large amounts of sell pressure prevented from people executing the very important arbitrage mechanism (because the price was lagging behind so much) to bring stability to the peg. It accelerated the downward spiral.

  2. the collateral ratio moved a slow, fixed pace. im not sure why the decision was made to change 0.5% every hour, but it certainly was not a good one.

the problem with both of these points is that they are fixed values that don’t respond to market conditions. they need to be much more responsive to volatility in a short period of time. collateral ratio can move more slowly in low vol environments, but should be much more agile in times of rapid price fluctuations. not that it should have ever gotten so low to begin with, but it would have taken many hours to recover back to ~100% when it should have done so much sooner after a ton of ppl exited.

not sure what the best route is here, but i would like to see both of those things addressed in future iterations. usually relaunch is best and there should be a way to compensate the victims of the bank run induced by the wild decision to manually set the collateral ratio to 95% yesterday. we can probably have at least some of the minting / redemption fee go towards this endeavor. i actually don’t even know where it goes or what its purpose is under current USDf.

3 Likes

the manual decision to move CR to 95% was because the minimum CR was set to 95%. Without setting the CR to >= the minimum, as discussed via twitter, the CR would not update. In hindsight, it would be have been wise to keep the minimum CR at 0 and let the market gradually come back to 95% CR.

The lack of a collateral amount for minting and redeeming was in effect (we do check the collateral balance) but the fact of the matter is that there was an essential “run on the bank” where more funds were withdrawn than in bank.

For example: let’s say there are $1M USDC in the vault. If 1000 users each withdraw 2000 USDf at a 100% CR, each user would be within his/her withdrawal limits but in summation, there is 1M unaccounted for USDf.

the 95% CR move was a reaction to your tweet that the 95% minimum floor didn’t do anything. In hindsight it should have been better planned.

Your other proposed improvements are more protocol-based improvements for a future USDf and are welcomed. The 0.1% CR change would definitely make things much better. Another idea is to use on-chain measurements of the real-time circulating MC of the reserve asset (Gaia or the equivalent) and use that as a benchmark for adjusting CR programmatically.

Robert, how does each option effect your future plans for the protocol?

as it currently stands, we will be reviewing the history of withdrawals / redemptions when the CR was manually set and making a list of users who were unfairly impacted by the CR change.

This will take into account the time at which each user made the withdrawal and how much they lost due to the CR being changed.

So for example, is a user withdrew 1000 USDf when the CR was 65, they would have stood to lose around 650 USDC as at the time of withdrawal, the Gaia was essentially valueless.

1 Like

As mentioned in my tweets, the solution was to bring the MIN_RESERVE_RATIO back to 68%, raise the newRatio_ and then carefully raise the MIN_RESERVE_RATIO to 80% (the USDf price at the time). In my view, the decision to raise the CR to 95% was taken before it was communicated on Twitter, the execution of it was just not correct and needed the additional call.

Correct me if I’m wrong, but neither in the withdrawal() nor in the completewithdrawal() functions is there any check for the collateral amount. This should be in the first withdrawal() already, as now users have funds stuck in limbo.

The USDf contract is deployed by proxy, so I assume that the logic can be updated at will.

1 Like

I have provided such a list of the users that have pending USDf on Twitter. See below:

0xae3bce4a8cdb3eb511ef06e8373e0989d7c5ba2c 112000000000
0xbbde1e05d96c5c4f7e377d5eaed21cac08a92945 52295925000000
0x9072a659029de3367074176528c89bfed8117523 12000000000
0xac8eb5c1c12cc1db3e37bb64cc9f2220e16395d9 10853350000000
0xd72825cc65ae34657f215ac49803213062a2ff23 10898900000
0xac5da6fd4d6ec37aab83e352fbb3f34d10b8d85d 5894000000000
0xebff9b75461fd07b1d0b614ddef1b5af6e512b68 34193000000000
0xadeeb9d09b8bcee10943198fb6f6a4229bab3675 29100000000000
0x00000000034b55ebd82cde9b38a85ab0978b7a47 3090000000000
0x54d6e8f883d1858b4080d10ae2a1c6f0afb5feb3 260000000
0x77c2da8140693996be6bc72776cb1f04a77a4e68 5862915000000
0x18bafc34abc16187b5887742c3dac59e5b51d509 1235997000000
0x067ef3c16f47cca6a3acb5942c6d4bc89ed0a8b1 27508244000000
0xc93678ec2b974a7ae280341cefeb85984a29fff7 14560737000000
0x7d8e4577f39a66d8f63d75aa61d24e635dc9fe89 10000000000
0x1bef2b5d795e1d95ad324c6ff12053ac693097d2 36184000000000
0x89a359a3d37c3a857e62cde9715900441b47acec 5000000000
0x6106e7b682296e3e67de45df3294a706b36a51a6 15263000000000
0xda7fc7825eba671c937d4ec6517f66248caa8ef2 30000000000000

3 Likes

Great @Jasper and @Robert!

With this pending redemption list in hand, now we only need to search for the ETH addresses in the redemption contract to identify the time that each one made the redemption request and check which CR was at the time each request was made. :+1:

Thanks @Robert for the post-mortem. You mentioned that “the total amount of algorithmic backing must always be multiples less than the total market cap of the algorithmic asset”, but later you said “allow Gaia to be given a fair market cap, multiplies higher than what it is backing.” Shouldn’t it be multiples lower?

1 Like

Also appreciate @Jasper for your work in reviewing the contract and preparing the user list for those who are affected by the redemption process. You have been very helpful in the TG group too. I wonder if @Robert could enlist the help of @Jasper in the future development of DP? Many hands make light work :slightly_smiling_face:

2 Likes

I dont think we should ignore the fact that there is more to this than just CR
The redeem function on the site was working weirdly as I mentioned here: Redeem function on website outputs incorrect data

I am not sure why this was happening but was confirmed by another person in the telegram.
If there is a relaunch I believe we should atleast have a 1 week testnet on rinkeby get people familiar with the system and then move to mainnet.

1 Like

I am still trying to grasp the concept of algo stablecoins, but if we were to do a relaunch, isn’t CR of 95% too high? And given the gargantuan amount of Gaia in circulation now, how could we attract users back for the relaunch (i.e. it makes no sense now to distribute Gaia to attract LP)?

Some announcement on 31st is still in power?

Eventually the outcome would have been same
In about 3 days the protocol would have reached 95% CR on its own and it would have still collapsed

I appreciate that the experimentation will continue and that there will be continued investment here.

Is there a way to help compensate those that lost everything in the USDf-GAIA LP and ETH-GAIA LP? I think that would be very appreciated even if it’s some small way. Ideally creating mechanisms allowing for GAIA to appreciate once again, or swapping for a GAIA v02, or providing them with a $SHARE airdrop.

Many of these people lost tens of thousands of dollars

2 Likes

@Jasper @Robert thanks for the list of users and for the desire to return at least part of the lost funds!

thanks for the post-mortem.

I can see why you’d want to restart it but doing so still wouldn’t answer the lingering questions of “how will this prevent a death spiral?”

I think it’s best to experiment with a few solutions to restore the peg. A) Either it works and the Gaia project rebounds immensely or B) You at least have more experience seeing what works and what doesn’t to some degree should Gaia start to spiral.

If V2 Gaia reaches low CR, think it’s safe to assume participants will exit quickly creating a new death spiral so we should see what incentives we can put in for participants to help maintain and restore the peg.

For example, incentivizing adding collateral when the peg is low, or in this case, depleted is clearly one that needs to be figured out, otherwise there’s a huge risk of another bank run.