[Gauntlet] Compound reserves and targetReserves update (1/23/24)

Simple Summary

Gauntlet would like to provide the community with an update on the targetReserves comet parameter and the current reserves levels across the Compound ecosystem.

Our analysis indicates that the comets face minimal risk under current reserves and targetReserves values. Nonetheless, the community should remain aware of these levels and decide on long-term risk preferences. We invite an open discussion on this topic below. Afterwards, we will provide our recommendations.

Analysis

Role of the targetReserves Parameter

Per Compound’s documentation, the targetReserves parameter is:

The target amount of reserves of the base token. If the protocol holds greater than or equal to this amount of reserves, the buyCollateral function can no longer be successfully called.

This was an experimental design choice for the protocol to HODL some riskier assets once a certain amount of reserves were accumulated.

Current targetReserves Levels

Presently, targetReserves are set at 5M tokens ($5M) for USDC comets and 5k tokens ($11M) for WETH comets.

Below is a breakdown of current reserves vs targetReserves in each comet.

Comet Current Reserves (Tokens) targetReserves (Tokens) % of Target
Ethereum USDC 4,136,029 5,000,000 82.7
Polygon USDC.e 74,054 5,000,000 1.5
Arbitrum USDC (Native) 29,946 5,000,000 0.6
Arbitrum USDC.e 25,938 5,000,000 0.5
Base USDbC 25,226 5,000,000 0.5
Ethereum WETH 684 5,000 13.7
Base WETH 6 5,000 0.1

The comets closest to reaching these targets are Ethereum USDC (82.7%) and Ethereum WETH (13.7%).

Compound’s Existing Reserves

Compound maintains approximately $56.8M in reserves across all markets, with stablecoins comprising $47.4M (83.5%) and volatile assets about $9.4M (16.5%).

The getReserves() function outputs the reserves within the comet, which are then compared against the targetReserves. Reserves are calculated in the function using the following formula:

balance - totalSupply_ + totalBorrow_

Each parameter in this formula is defined as follows:

Parameter Definition
balance Number of base asset tokens in the comet’s ownership
totalSupply_ Number of base asset tokens owed to suppliers
totalBorrow_ Number of base asset tokens borrowed

Scenario 1

Suppose the comet starts with $5M in reserves and there are only two users. One supplies $77M in USDC, while the other supplies $100M in WBTC (with a 77% Liquidation Factor and 5% Liquidation Penalty) and borrows $77M USDC, reaching 100% utilization.

In an absorption scenario, the $100M WBTC collateral is absorbed, and the user would be entitled to $95M in USDC. Considering their existing $77M USDC borrow, they would receive an additional $18M USDC. Upon absorption, the absorbed user’s borrows drop to $0, and they are credited with a $18M USDC supply. In this scenario, getReserves() would update as follows:

Pre-absorption Post-absorption
balance $5M $5M
totalSupply_ $77M $95M (+$18M)
totalBorrow_ $77M $0M (-$77M)
getReserves() $5M -$90M (-$95M)

Hence, the $5M targetReserves parameter does not prevent users from buying absorbed collateral in cases of large absorptions relative to the reserves, even if the reserves were at the targetReserves level prior to the absorption.

Scenario 2

Suppose the comet starts with $15M in reserves and there are only two users. One supplies $7.7M in USDC, while the other supplies $10M in WBTC (with a 77% Liquidation Factor and 5% Liquidation Penalty) and borrows $7.7M USDC, reaching 100% utilization.

In an absorption scenario, the $10M WBTC collateral is absorbed, and the user would be entitled to $9.5M in USDC. Considering their existing $7.7M USDC borrow, they would receive an additional $1.8M USDC. Upon absorption, the absorbed user’s borrows drop to $0, and they are credited with a $1.8M USDC supply. In this scenario, getReserves() would update as follows:

Pre-absorption Post-absorption
balance $15M $15M
totalSupply_ $7.7M $9.5M (+$1.8M)
totalBorrow_ $7.7M $0M (-$7.7M)
getReserves() $15M $5.5M (-$9.5M)

In this case, the $5M targetReserves parameter would inhibit users from purchasing absorbed collateral in the case of a $10M absorption, given initial reserves of $15M and a $5M targetReserves threshold.

Calculating when current reserves and targetReserves inhibit collateral purchases during absorptions

During an absorption event, users will not be able to purchase absorbed collateral as long as the following condition is met:

Recommendations

Considering the method of calculating reserves during absorptions and the current reserve amounts relative to the targetReserves parameters, Gauntlet’s analysis suggests that the comets currently face minimal risk. Nonetheless, the community should remain aware of these levels and decide on long-term risk preferences. If the community is in favor of keeping this mechanism, we will provide recommendations on specific targetReserves values to set across the different comets.

Other Considerations

Compound Labs has noted they are facing limitations in contract space and that eliminating parameters like targetReserves will free up additional space.

Next Steps

We invite an open discussion on this topic below. Some questions to consider include:

  • Is the community interested in having this HODL mechanism in the first place? If not, then in the short term we propose adjusting the targetReserves values well above $5M for all comets, so they likely never become relevant. Then long term Compound Labs can eliminate the parameter altogether to free up additional space.
  • If the community is in favor of the HODL mechanism, what targetReserves values are acceptable? A lower targetReserves value enables the protocol to gain more from absorptions, as it avoids relinquishing a portion of the Liquidation Penalty to buyers of the collateral. However, this also exposes the protocol to risks associated with the price volatility of collateral assets.

If the community is in favor of keeping this mechanism, we will provide recommendations on specific targetReserves values to set across the different comets.