when a user deposits collateral, the protocol should increase that user’s collateral balance by the amount of tokens the engine actually receives. This is important because the recorded collateral balance is later used to compute the user’s USD collateral value, health factor, and maximum mintable DSC.
_deposit_collateral() increments internal accounting using the user-supplied amount_collateral before verifying how many tokens were transferred in practice. The code assumes that transferFrom(msg.sender, self, amount_collateral) always results in the engine receiving exactly amount_collateral, which is not true for fee-on-transfer, taxed, deflationary, or burn-on-transfer tokens.
If such a token is ever supported, the contract will over-credit the depositor and overestimate the amount of collateral backing their debt. Because the engine later uses this inflated balance in get_account_collateral_value(), health_factor(), and mint checks, the user can mint more DSC than the actual collateral can support.
The result is immediate hidden insolvency: the protocol’s accounting says the position is safe, but the engine holds fewer real assets than required to redeem or liquidate that position safely.
Likelihood:
This occurs whenever a supported collateral token charges transfer fees, burns on transfer, or otherwise transfers less than requested.
The current code does not verify the actual received balance.
Impact:
Borrowing power becomes inflated.
The system can become undercollateralized immediately and later redemptions can fail due to missing backing.
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.