burn_dsc() allows borrowers to repay DSC debt and reduce liability.
After burning tokens, the function executes self._revert_if_health_factor_is_broken(msg.sender).
If a position is already undercollateralized (health factor < 1.0), partial repayments that do not immediately restore the health factor above 1.0 revert, blocking borrowers from reducing risk.
In dsc_engine.vy, burn_dsc() includes a health factor assertion after reducing the borrower's debt:
In _calculate_health_factor():
$$
Because total_dsc_minted is the denominator, reducing debt strictly improves the borrower's health factor.
However, if an account's health factor drops below MIN_HEALTH_FACTOR (1.0) due to price depreciation, and the user attempts a partial repayment, the resulting health factor may still be below 1.0 (e.g., rising from 0.70 to 0.95). Because 0.95 is still < MIN_HEALTH_FACTOR, the function reverts.
Likelihood: High
Occurs whenever an undercollateralized borrower attempts partial debt repayment to de-risk their position.
Impact: High
Borrowers unable to repay 100% of their shortfall in a single transaction are trapped and forced into liquidation, creating unnecessary liquidation penalties and increasing protocol bad debt.
Severity: High
Explanation: The user attempt to de-risk by repaying 5 DSC reverts because the health check enforces user_health_factor >= MIN_HEALTH_FACTOR, trapping the borrower.
Remove the health factor check from burn_dsc(). Burning debt can only increase or maintain solvency:
Explanation: Burning debt monotonically improves health factor; removing this check allows borrowers to repay debt incrementally during market distress.
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.