Summary
A proposal to implement a “Forced Liquidation” mechanism. This mechanism aims to liquidate accounts holding BUSD borrow positions, thereby returning BUSD to the Venus Core Pool and allowing users to redeem their supplied BUSD. This initiative is part of an ongoing effort to wind down the market.
Motivation
The community has approved the initial stage of the BUSD deprecation plan, which involved:
- Freezing new supply and borrow by reducing supply and borrow caps to 0.
- Increasing BUSD Reserve Factor to 100%
- Pause MINT - complementary to setting supply caps to 0
- Pausing BORROW - complementary to setting borrow caps to 0
- Pausing ENTER_MARKET - will not allow users to start using BUSD as collateral. Users who have already enabled BUSD as collateral will not be affected by this update.
- Setting XVS rewards in the BUSD market to 0.
Since the proposal has been implemented, nearly 35M BUSD supplied have been redeemed, and over 23M BUSD borrows have been repaid.
At this time, there are millions of outstanding borrowed BUSD by users that haven’t been repaid despite the borrow APYs surpassing 70% since August 28, 2023. Given that these positions are inelastic to the high APYs and could potentially be inactive, the community can choose to utilize a “Force Liquidation” mechanism. This would facilitate the liquidation of these positions, returning BUSD to the Venus Core pool and allowing suppliers to redeem them prior to Paxos discontinuing its support for BUSD in February 2024.
The “Force Liquidation” mechanism permits the liquidation of borrow positions within a specific market, even when a user’s health rate is above 1. Additionally, it bypasses the close factor check, enabling the liquidation of the entire debt in a single transaction.
Implementation Details
This feature is based on the implementation done by Compound V2 here. Compound V2 allows “forced liquidations” on markets as soon as the Collateral factor is zero, the Reserve factor is 100%, and the borrows are paused. Venus defines a feature flag to enable/disable “forced liquidations”, configurable directly via VIP, not based on other parameters. The discussion about this feature on the Compound governance forum can be found in this post.
Scope:
- Initially: Core pool
- Upcoming weeks: isolated pools
Details of Implementation:
- Add a new storage variable: mapping(address ⇒ bool) public isForcedLiquidationEnabled in a new ComptrollerStorage contract. It’ll have a feature flag per market in the pool, setting if the “force liquidation” feature is enabled or disabled (default).
- Add a new function in the Comptroller contract to allow the set of this variable only by authorized accounts, accepting a market address as a parameter and checking if the address is for a valid and listed market. This function should be controlled by the AccessControlManager contract. Only the Normal, Fast-track, and Critical timelocks should be authorized to invoke it, so only Normal, Fast-track, and Critical VIPs will be able to invoke it. This function will enable or disable the “force liquidation” feature in a specific market.
- Modify the *Comptroller.liquidateBorrowAllowed* function to check isForcedLiquidationEnabled. If force liquidation is enabled for the borrowed vToken, the checks on the existence of a shortfall and the close factor limit will be skipped, and the liquidation will be allowed (if the repayment amount is lower than or equal to the debt).
Example
Given:
-
vUSDT
collateral factor: 80% - 1 USDT = 1 BUSD = 1 USDC = $1 (for simplicity)
- Close factor: 50%
- Liquidation incentive: 10%
- User with the following positions:
- Supply: 500 USDT
- Borrow: 200 BUSD
- Borrow: 100 USDC
The health rate for this user would be (500 * 0.8) / (200 + 100) = 1.33
. So, in normal circumstances, this user is not eligible to be liquidated.
Now, let’s say we enable the forced liquidations in the BUSD market (via VIP). Then:
- Anyone will be allowed to liquidate the BUSD position of the previous user. Moreover, the close factor limit won’t be taken into account. So, the following liquidation would be doable:
- Repay amount: 200 BUSD
- Collateral market to seize: USDT
- By executing this liquidation, 220 USDT (repay amount + liquidation incentive) would be seized from the user’s collateral.
- After the liquidation, the global position of our user would be:
- Supply: 280 USDT (500 USDT - 220 USDT seized during the liquidation)
- Borrow: 0 BUSD
- Borrow: 100 USDC
- So, the new health rate would be
(280 * 0.8 / 100) = 2.24
. They will still be ineligible for regular liquidations - Because forced liquidation is not enabled in the USDC market, the USDC debt cannot be liquidated (because the health rate is greater than 1).
Next Steps
If the community approves this proposal (via Snapshot), we recommend implementing the forced liquidation no later than November 1st, but with a preference for one month after approval. This approach should grant users ample time to make necessary preparations and potentially repay their BUSD positions, all while ensuring a reasonable buffer period before Paxos halts its support for BUSD.