@@ -8,16 +8,23 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
88import {SafeERC20} from "@1inch/solidity-utils/contracts/libraries/SafeERC20.sol " ;
99
1010import {IRouterV3, RouterResult} from "./interfaces/IRouterV3.sol " ;
11- import {IBatchLiquidator, RouterLiqParams, LiquidationResult, LiqParams} from "./interfaces/IBatchLiquidator.sol " ;
11+ import {
12+ IBatchLiquidator,
13+ RouterLiqParams,
14+ LiquidationResult,
15+ LiqParams,
16+ PriceUpdate
17+ } from "./interfaces/IBatchLiquidator.sol " ;
1218import {ICreditAccountV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditAccountV3.sol " ;
1319import {ICreditManagerV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditManagerV3.sol " ;
1420import {ICreditFacadeV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditFacadeV3.sol " ;
1521import {IPriceOracleV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPriceOracleV3.sol " ;
1622import {ICreditFacadeV3Multicall} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditFacadeV3Multicall.sol " ;
1723import {MultiCall, MultiCallOps} from "@gearbox-protocol/core-v2/contracts/libraries/MultiCall.sol " ;
1824import {Balance} from "@gearbox-protocol/core-v2/contracts/libraries/Balances.sol " ;
25+ import {IUpdatablePriceFeed} from "@gearbox-protocol/core-v2/contracts/interfaces/IPriceFeed.sol " ;
1926
20- contract BatchLiquidator is IBatchLiquidator , Ownable {
27+ contract BatchLiquidator is Ownable {
2128 using SafeERC20 for IERC20 ;
2229 using MultiCallOps for MultiCall[];
2330
@@ -47,6 +54,8 @@ contract BatchLiquidator is IBatchLiquidator, Ownable {
4754 results = new LiquidationResult [](len);
4855
4956 for (uint256 i = 0 ; i < len;) {
57+ _applyOnDemandPriceUpdates (params[i].creditAccount, params[i].priceUpdates);
58+
5059 results[i].creditAccount = params[i].creditAccount;
5160
5261 (bool pathSuccess , RouterResult memory res ) = _findBestClosePath (params[i]);
@@ -120,6 +129,24 @@ contract BatchLiquidator is IBatchLiquidator, Ownable {
120129 underlying = ICreditManagerV3 (creditManager).underlying ();
121130 }
122131
132+ function _getPriceOracle (address creditAccount ) internal view returns (address priceOracle ) {
133+ address creditManager = ICreditAccountV3 (creditAccount).creditManager ();
134+ priceOracle = ICreditManagerV3 (creditManager).priceOracle ();
135+ }
136+
137+ /// @dev Applies on-demand price feed updates, reverts if trying to update unknown price feeds
138+ function _applyOnDemandPriceUpdates (address creditAccount , PriceUpdate[] calldata priceUpdates ) internal {
139+ address priceOracle = _getPriceOracle (creditAccount);
140+
141+ uint256 len = priceUpdates.length ;
142+ for (uint256 i; i < len; ++ i) {
143+ PriceUpdate calldata update = priceUpdates[i];
144+ address priceFeed = IPriceOracleV3 (priceOracle).priceFeedsRaw (update.token, update.reserve);
145+ if (priceFeed == address (0 )) revert ("Price feed does not exist " );
146+ IUpdatablePriceFeed (priceFeed).updatePrice (update.data);
147+ }
148+ }
149+
123150 function setWhitelistedStatus (address account , bool status ) external onlyOwner {
124151 if (isWhitelisted[account] != status) {
125152 isWhitelisted[account] = status;
0 commit comments