In _doLiquidation function where the contract checks that collateralBalance >= fee before transferring the fee to the liquidator(msg.sender). This is incorrect because, in calculateLiquidation, the fee is already included in the liquidationAmount returned and is removed from the user's collateral.
Vulnerability Details
The function double-counts the fee in the collateral balance check. The fee is included in the liquidationAmount(already removed from the user's balance), but the contract still checks if the remaining balance is sufficient to pay the fee again.
_doLiquidation removes 100 from collateralBalance, leaving 9.
The fee check collateralBalance >= fee fails (9<10).
Fee transfer to the liquidator does not occur, even though tokens are already removed from the user.
@3 = calculateLiquidation is returning (debtToBurn + fee, , fee,);
@1 = collateral is reduced by amountLiquidated (debtToBurn + fee converted to yield token)
@2 = after removing the fee from the collateral, collateralBalance >= feeInYield is required to transfer fee to the liquidator
Impact Details
If users' collateralBalance is just above the liquidationAmount then removing liquidationAmount leaves only 9 tokens, the subsequent check (collateralBalance >= fee) fails (9 < 10), so the fee transfer to the liquidator does not occur and the funds are stuck in the protocol, even though the fee was already deducted. This means:
The fee is reduced from the user's collateral but is never transferred to the liquidator.