Skip to content

Commit

Permalink
fix: update liquidator contract
Browse files Browse the repository at this point in the history
  • Loading branch information
doomsower committed May 24, 2024
1 parent 1a219b9 commit 9d911ed
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 25 deletions.
36 changes: 20 additions & 16 deletions contracts/Liquidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand All @@ -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)
Expand Down Expand Up @@ -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(
Expand Down
10 changes: 1 addition & 9 deletions contracts/interfaces/ILiquidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 9d911ed

Please sign in to comment.