Skip to content

Commit 8b7b39b

Browse files
committed
feat: add getUpdatablePriceFeeds to market compressor
1 parent d3f4b03 commit 8b7b39b

File tree

3 files changed

+54
-15
lines changed

3 files changed

+54
-15
lines changed

contracts/compressors/MarketCompressor.sol

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import {TokenCompressor} from "./TokenCompressor.sol";
2222
// // EXCEPTIONS
2323
// import "@gearbox-protocol/core-v3/contracts/interfaces/IExceptions.sol";
2424

25+
import {BaseParams} from "../types/BaseState.sol";
2526
import {MarketData, CreditManagerData} from "../types/MarketData.sol";
2627
import {TokenData} from "../types/TokenData.sol";
2728
import {PoolState} from "../types/PoolState.sol";
29+
import {PriceOracleState} from "../types/PriceOracleState.sol";
2830

2931
import {IMarketCompressor} from "../interfaces/IMarketCompressor.sol";
3032

@@ -66,38 +68,74 @@ contract MarketCompressor is IMarketCompressor {
6668
}
6769
}
6870

71+
function getUpdatablePriceFeeds(MarketFilter memory filter)
72+
external
73+
view
74+
returns (BaseParams[] memory updatablePriceFeeds)
75+
{
76+
address[] memory pools = _getPools(filter);
77+
uint256 numPools = pools.length;
78+
PriceOracleState[] memory poStates = new PriceOracleState[](numPools);
79+
uint256 numUpdatable;
80+
for (uint256 i; i < numPools; ++i) {
81+
address[] memory tokens = _getTokens(pools[i]);
82+
address priceOracle = _getPriceOracle(poolCompressor.getPoolState(pools[i]));
83+
poStates[i] = priceOracleCompressor.getPriceOracleState(priceOracle, tokens);
84+
for (uint256 j; j < poStates[i].priceFeedStructure.length; ++j) {
85+
if (poStates[i].priceFeedStructure[j].updatable) ++numUpdatable;
86+
}
87+
}
88+
89+
updatablePriceFeeds = new BaseParams[](numUpdatable);
90+
uint256 k;
91+
for (uint256 i; i < numPools; ++i) {
92+
for (uint256 j; j < poStates[i].priceFeedStructure.length; ++j) {
93+
if (poStates[i].priceFeedStructure[j].updatable) {
94+
updatablePriceFeeds[k++] = poStates[i].priceFeedStructure[j].baseParams;
95+
}
96+
}
97+
}
98+
}
99+
69100
function getMarketData(address pool) public view returns (MarketData memory result) {
101+
result.acl = IPoolV3(pool).acl();
70102
result.pool = poolCompressor.getPoolState(pool);
71103
result.poolQuotaKeeper = poolCompressor.getPoolQuotaKeeperState(result.pool.poolQuotaKeeper);
72104
result.rateKeeper = poolCompressor.getRateKeeperState(result.poolQuotaKeeper.rateKeeper);
73105
result.interestRateModel = poolCompressor.getInterestModelState(result.pool.interestRateModel);
74106

75-
address priceOracle = _getPriceOracle(result.pool);
76-
address[] memory tokens = IPoolQuotaKeeperV3(result.pool.poolQuotaKeeper).quotedTokens();
77-
78-
result.tokens = new TokenData[](tokens.length + 1);
79-
address[] memory underlyingAndTokens = new address[](tokens.length + 1);
80-
result.tokens[0] = tokenCompressor.getTokenInfo(result.pool.underlying);
81-
underlyingAndTokens[0] = result.pool.underlying;
82-
83-
for (uint256 i = 0; i < tokens.length; i++) {
84-
result.tokens[i + 1] = tokenCompressor.getTokenInfo(tokens[i]);
85-
underlyingAndTokens[i + 1] = tokens[i];
107+
address[] memory tokens = _getTokens(pool);
108+
result.tokens = new TokenData[](tokens.length);
109+
for (uint256 i; i < tokens.length; i++) {
110+
result.tokens[i] = tokenCompressor.getTokenInfo(tokens[i]);
86111
}
87112

88113
// creditManager
89-
90114
uint256 len = result.pool.creditManagerDebtParams.length;
91115
result.creditManagers = new CreditManagerData[](len);
92116
for (uint256 i = 0; i < len; i++) {
93117
result.creditManagers[i] =
94118
poolCompressor.getCreditManagerData(result.pool.creditManagerDebtParams[i].creditManager);
95119
}
96-
// How to query if no credit mangers are deployed?
97-
result.priceOracleData = priceOracleCompressor.getPriceOracleState(priceOracle, underlyingAndTokens);
120+
121+
address priceOracle = _getPriceOracle(result.pool);
122+
result.priceOracleData = priceOracleCompressor.getPriceOracleState(priceOracle, tokens);
123+
}
124+
125+
function _getTokens(address pool) internal view returns (address[] memory tokens) {
126+
// under proper configuration, equivalent to price oracle's `getTokens`
127+
address quotaKeeper = IPoolV3(pool).poolQuotaKeeper();
128+
address[] memory quotedTokens = IPoolQuotaKeeperV3(quotaKeeper).quotedTokens();
129+
uint256 numTokens = quotedTokens.length;
130+
tokens = new address[](numTokens + 1);
131+
tokens[0] = IPoolV3(pool).asset();
132+
for (uint256 i; i < numTokens; ++i) {
133+
tokens[i + 1] = quotedTokens[i];
134+
}
98135
}
99136

100137
function _getPriceOracle(PoolState memory ps) internal view returns (address) {
138+
// TODO: read from market configurator instead once structure is known
101139
if (ps.creditManagerDebtParams.length == 0) {
102140
return address(0);
103141
}

contracts/compressors/PriceFeedCompressor.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ contract PriceFeedCompressor is IPriceFeedCompressor {
6969
contractTypes[uint8(PriceFeedType.CURVE_CRYPTO_ORACLE)] = "PF_CURVE_CRYPTO_LP_ORACLE";
7070
contractTypes[uint8(PriceFeedType.CURVE_USD_ORACLE)] = "PF_CURVE_USD_ORACLE";
7171
contractTypes[uint8(PriceFeedType.ERC4626_VAULT_ORACLE)] = "PF_ERC4626_ORACLE";
72-
contractTypes[uint8(PriceFeedType.WRAPPED_AAVE_V2_ORACLE)] = "NOT_USER";
72+
contractTypes[uint8(PriceFeedType.WRAPPED_AAVE_V2_ORACLE)] = "NOT_USED";
7373
contractTypes[uint8(PriceFeedType.WSTETH_ORACLE)] = "PF_WSTETH_ORACLE";
7474
contractTypes[uint8(PriceFeedType.YEARN_ORACLE)] = "PF_YEARN_ORACLE";
7575
contractTypes[uint8(PriceFeedType.MELLOW_LRT_ORACLE)] = "PF_MELLOW_LRT_ORACLE";

contracts/types/MarketData.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct MarketData {
1818
BaseParams baseParams;
1919
// Owner who manages market
2020
address owner;
21+
address acl;
2122
// Syntax sugar ?
2223
// address underlying;
2324
// Risk curator name

0 commit comments

Comments
 (0)