The liquidate function allows liquidators to pay down an unhealthy user's DSC debt in exchange for an equivalent amount of collateral plus a 10% liquidation bonus (LIQUIDATION_BONUS = 10).
However, the function enforces a strict post-condition: assert ending_user_health_factor > starting_user_health_factor. Because the liquidator takes 110% of the covered debt's value in collateral, if a user's collateral-to-debt ratio falls below 110% (underwater or near-underwater positions), redeeming collateral at a 110% rate decreases the user's collateral faster than it decreases their debt. This causes the ending health factor to be lower than the starting health factor, making the transaction revert and rendering underwater accounts impossible to liquidate.
Likelihood:
This scenario occurs whenever rapid market price drops push an undercollateralized borrower below 110% collateralization before liquidators can act.
Impact:
High. Protocol insolvency. The protocol cannot liquidate insolvent or severely undercollateralized borrowers, accumulating permanent bad debt and breaking the stablecoin peg.
When a borrower holds $105 of collateral against$100 of debt, covering $100 requires transferring$110 worth of collateral, which either fails or results in a worse health factor, triggering the assert revert.
Remove the strict ending_user_health_factor > starting_user_health_factor assertion, or allow bad debt absorption/partial liquidation that caps seized collateral to the user's available balance without requiring health factor increase when fully liquidating.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.