The _burn_dsc() function is designed to burn DSC tokens when users repay debt. It should burn tokens first, then update the user's debt record.
The function reduces the user's debt before calling DSC.burn_from() and does not check the return value. If burn fails, the debt is cleared but tokens remain in circulation, allowing users to withdraw collateral while keeping unbacked DSC.
Likelihood:
The burn_from() function can fail when insufficient allowance exists, the token holder has insufficient balance, or gas limits are reached during execution.
The incorrect order of operations (debt reduction before token burn) means a single failure creates permanent protocol insolvency.
Impact:
Protocol Insolvency: Users clear debt without burning DSC tokens, leaving unbacked stablecoins in circulation.
Collateral Theft: Users with cleared debt withdraw full collateral while retaining DSC tokens to spend or trade.
Attack Steps:
Attacker deposits 10 ETH collateral (~$30,000)
Attacker mints 5,000 DSC
Attacker calls burn_dsc(5,000) with conditions causing burn_from to fail
Debt cleared: user_to_dsc_minted[attacker] = 0
DSC.burn_from() fails silently (no revert)
Attacker withdraws all 10 ETH collateral
Result: Attacker keeps 10 ETH + 5,000 DSC (~$35,000 total)
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.