burn_dsc calls _revert_if_health_factor_is_broken after burning DSC. Burning debt can only improve health factor, so this check can never fail. But it calls the oracle via _health_factor -> _get_usd_value -> _stale_check_latest_round_data. If the oracle is stale or down, users cannot reduce their own debt.
_revert_if_health_factor_is_broken checks user_health_factor >= MIN_HEALTH_FACTOR. After burning DSC, the user's debt is lower, so their HF can only be equal or higher. The check passes in 100% of cases.
But _health_factor -> _get_account_information -> _get_account_collateral_value -> _get_usd_value -> oracle_lib._stale_check_latest_round_data, which asserts seconds_since <= TIMEOUT. If the oracle is stale (or returns price <= 0 per M-01), this reverts.
Debt repayment is the one operation that should always be safe regardless of oracle state. Blocking it during a crisis forces users to watch their positions deteriorate while holding the DSC they need to save themselves.
Likelihood:
Oracle outages happen. The oracle_lib docstring explicitly acknowledges this: "So if the Chainlink network explodes and you have a lot of money locked in the protocol... too bad."
ZKsync Era L2 sequencer downtime compounds this risk.
Impact:
Users cannot reduce their debt during oracle outages, the exact time they'd most want to.
Positions that could have been saved by burning DSC instead get pushed into liquidation territory (or the H-01 dead zone).
Remove the redundant health factor check. Burning DSC is provably safe.
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.