Skip to content

Commit 8456414

Browse files
committed
feat: price updates in batch liquidator
1 parent 39d90ac commit 8456414

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

contracts/BatchLiquidator.sol

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,23 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
88
import {SafeERC20} from "@1inch/solidity-utils/contracts/libraries/SafeERC20.sol";
99

1010
import {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";
1218
import {ICreditAccountV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditAccountV3.sol";
1319
import {ICreditManagerV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditManagerV3.sol";
1420
import {ICreditFacadeV3} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditFacadeV3.sol";
1521
import {IPriceOracleV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPriceOracleV3.sol";
1622
import {ICreditFacadeV3Multicall} from "@gearbox-protocol/core-v3/contracts/interfaces/ICreditFacadeV3Multicall.sol";
1723
import {MultiCall, MultiCallOps} from "@gearbox-protocol/core-v2/contracts/libraries/MultiCall.sol";
1824
import {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;

contracts/interfaces/IBatchLiquidator.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import {Balance} from "@gearbox-protocol/core-v2/contracts/libraries/Balances.so
77
import {MultiCall} from "@gearbox-protocol/core-v2/contracts/libraries/MultiCall.sol";
88
import {PathOption} from "./IRouterV3.sol";
99

10+
struct PriceUpdate {
11+
address token;
12+
bool reserve;
13+
bytes data;
14+
}
15+
1016
struct RouterLiqParams {
1117
address creditAccount;
1218
Balance[] expectedBalances;
@@ -16,6 +22,7 @@ struct RouterLiqParams {
1622
PathOption[] pathOptions;
1723
uint256 iterations;
1824
bool force;
25+
PriceUpdate[] priceUpdates;
1926
}
2027

2128
struct LiqParams {

0 commit comments

Comments
 (0)