From 9d911ede473ce2a4324c37ed1b55f34f92f244c6 Mon Sep 17 00:00:00 2001 From: doomsower <12031673+doomsower@users.noreply.github.com> Date: Fri, 24 May 2024 07:52:45 -0400 Subject: [PATCH] fix: update liquidator contract --- contracts/Liquidator.sol | 36 +++++++++++++++------------- contracts/interfaces/ILiquidator.sol | 10 +------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/contracts/Liquidator.sol b/contracts/Liquidator.sol index 9fb3db1..5e779c6 100644 --- a/contracts/Liquidator.sol +++ b/contracts/Liquidator.sol @@ -270,16 +270,7 @@ contract Liquidator is Ownable { address creditAccount, uint256 hfOptimal, IPartialLiquidationBotV3.PriceUpdate[] memory priceUpdates - ) - external - returns ( - address tokenOut, - uint256 optimalAmount, - uint256 flashLoanAmount, - uint256 repaidAmount, - bool isOptimalRepayable - ) - { + ) external returns (address tokenOut, uint256 optimalAmount, uint256 repaidAmount, bool isOptimalRepayable) { ICreditManagerV3 creditManager = ICreditManagerV3(ICreditAccountV3(creditAccount).creditManager()); IPriceOracleV3 priceOracle = IPriceOracleV3(creditManager.priceOracle()); @@ -289,7 +280,6 @@ contract Liquidator is Ownable { (optimalAmount, repaidAmount, isOptimalRepayable) = _getOptimalAmount(creditAccount, tokenOut, hfOptimal, creditManager, priceOracle); - flashLoanAmount = priceOracle.convert(optimalAmount, tokenOut, creditManager.underlying()); } function _getBestTokenOut(address creditAccount, ICreditManagerV3 creditManager, IPriceOracleV3 priceOracle) @@ -349,17 +339,31 @@ contract Liquidator is Ownable { uint256 optimalAmount = priceOracle.convert(optimalValueSeized, underlying, tokenOut); uint256 repaidAmount = optimalValueSeized * discount / PERCENTAGE_FACTOR; - (uint128 minDebt,) = ICreditFacadeV3(creditManager.creditFacade()).debtLimits(); + return _adjustToDebtLimits(creditManager, optimalAmount, repaidAmount, CreditLogic.calcTotalDebt(cdd)); + } - uint256 surplusDebt = CreditLogic.calcTotalDebt(cdd) - minDebt; + function _adjustToDebtLimits( + ICreditManagerV3 creditManager, + uint256 optimalAmount, + uint256 repaidAmount, + uint256 totalDebt + ) internal view returns (uint256, uint256, bool) { + (uint128 minDebt, uint128 maxDebt) = ICreditFacadeV3(creditManager.creditFacade()).debtLimits(); - if (repaidAmount <= surplusDebt) { - return (optimalAmount, repaidAmount, true); - } else { + if (totalDebt > maxDebt && repaidAmount < totalDebt - maxDebt) { + uint256 requiredRepay = totalDebt - maxDebt; + optimalAmount = optimalAmount * requiredRepay * 1005 / (repaidAmount * 1000); + repaidAmount = requiredRepay * 1005 / 1000; + return (optimalAmount, repaidAmount, false); + } else if (totalDebt < minDebt) { + return (0, 0, false); + } else if (repaidAmount > totalDebt - minDebt) { + uint256 surplusDebt = totalDebt - minDebt; optimalAmount = optimalAmount * surplusDebt * 995 / (repaidAmount * 1000); repaidAmount = surplusDebt * 995 / 1000; return (optimalAmount, repaidAmount, false); } + return (optimalAmount, repaidAmount, true); } function _applyOnDemandPriceUpdates( diff --git a/contracts/interfaces/ILiquidator.sol b/contracts/interfaces/ILiquidator.sol index d58b52c..102e77c 100644 --- a/contracts/interfaces/ILiquidator.sol +++ b/contracts/interfaces/ILiquidator.sol @@ -43,15 +43,7 @@ interface ILiquidator { address creditAccount, uint256 hfOptimal, IPartialLiquidationBotV3.PriceUpdate[] memory priceUpdates - ) - external - returns ( - address tokenOut, - uint256 optimalAmount, - uint256 flashLoanAmount, - uint256 repaidAmount, - bool isOptimalRepayable - ); + ) external returns (address tokenOut, uint256 optimalAmount, uint256 repaidAmount, bool isOptimalRepayable); function registerCM(address creditManager) external;