@@ -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 " ;
2526import {MarketData, CreditManagerData} from "../types/MarketData.sol " ;
2627import {TokenData} from "../types/TokenData.sol " ;
2728import {PoolState} from "../types/PoolState.sol " ;
29+ import {PriceOracleState} from "../types/PriceOracleState.sol " ;
2830
2931import {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 }
0 commit comments