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 lowertargetReserves
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.