Skip to content

Commit ee87ed5

Browse files
authored
feat: adding new fileds into uiprovider (#133)
* disable borrow when nft price is stale * add max collateral cap * disable borrow when utilization rate exceed max * add testcases for price stale * fix testcase failure * set flag for mapped assets * add error define * deploy new impl for pool * deploy new oracle & pool * updating nft & reserve fields * add isPriceStale field * updating latest ui provider
1 parent 319fef3 commit ee87ed5

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

contracts/interfaces/IUiPoolDataProvider.sol

+8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ interface IUiPoolDataProvider {
2929
uint256 priceInEth;
3030
uint256 variableRateSlope1;
3131
uint256 variableRateSlope2;
32+
//
33+
uint256 priceInUSD;
34+
uint256 utilizationRate;
35+
uint256 maxUtilizationRate;
3236
}
3337

3438
struct UserReserveData {
@@ -54,6 +58,10 @@ interface IUiPoolDataProvider {
5458
address bNftAddress;
5559
uint256 priceInEth;
5660
uint256 totalCollateral;
61+
//
62+
uint256 priceInUSD;
63+
uint256 maxCollateralCap;
64+
bool isPriceStale;
5765
}
5866

5967
struct UserNftData {

contracts/misc/UiPoolDataProvider.sol

+30-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
2323
using ReserveConfiguration for DataTypes.ReserveConfigurationMap;
2424
using NftConfiguration for DataTypes.NftConfigurationMap;
2525

26+
uint256 public constant RPICE_DECIMAL = 10**18;
27+
address public constant MOCK_ETH_USD_ADDRESS = 0x9ceB4d4C184d1786614a593a03621b7F37F8685F;
28+
2629
IReserveOracleGetter public immutable reserveOracle;
2730
INFTOracleGetter public immutable nftOracle;
2831

@@ -50,12 +53,14 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
5053
address[] memory reserves = lendPool.getReservesList();
5154
AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length);
5255

56+
uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);
57+
5358
for (uint256 i = 0; i < reserves.length; i++) {
5459
AggregatedReserveData memory reserveData = reservesData[i];
5560

5661
DataTypes.ReserveData memory baseData = lendPool.getReserveData(reserves[i]);
5762

58-
_fillReserveData(reserveData, reserves[i], baseData);
63+
_fillReserveData(reserveData, reserves[i], baseData, ethUSDPrice);
5964
}
6065

6166
return (reservesData);
@@ -93,11 +98,13 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
9398
AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length);
9499
UserReserveData[] memory userReservesData = new UserReserveData[](user != address(0) ? reserves.length : 0);
95100

101+
uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);
102+
96103
for (uint256 i = 0; i < reserves.length; i++) {
97104
AggregatedReserveData memory reserveData = reservesData[i];
98105

99106
DataTypes.ReserveData memory baseData = lendPool.getReserveData(reserves[i]);
100-
_fillReserveData(reserveData, reserves[i], baseData);
107+
_fillReserveData(reserveData, reserves[i], baseData, ethUSDPrice);
101108

102109
if (user != address(0)) {
103110
_fillUserReserveData(userReservesData[i], user, reserves[i], baseData);
@@ -110,7 +117,8 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
110117
function _fillReserveData(
111118
AggregatedReserveData memory reserveData,
112119
address reserveAsset,
113-
DataTypes.ReserveData memory baseData
120+
DataTypes.ReserveData memory baseData,
121+
uint256 ethUSDPrice
114122
) internal view {
115123
reserveData.underlyingAsset = reserveAsset;
116124

@@ -124,6 +132,7 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
124132
reserveData.debtTokenAddress = baseData.debtTokenAddress;
125133
reserveData.interestRateAddress = baseData.interestRateAddress;
126134
reserveData.priceInEth = reserveOracle.getAssetPrice(reserveData.underlyingAsset);
135+
reserveData.priceInUSD = (reserveData.priceInEth * ethUSDPrice) / RPICE_DECIMAL;
127136

128137
reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf(reserveData.bTokenAddress);
129138
reserveData.totalVariableDebt = IDebtToken(reserveData.debtTokenAddress).totalSupply();
@@ -139,6 +148,13 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
139148
(reserveData.variableRateSlope1, reserveData.variableRateSlope2) = getInterestRateStrategySlopes(
140149
InterestRate(reserveData.interestRateAddress)
141150
);
151+
152+
if (reserveData.totalVariableDebt > 0) {
153+
reserveData.utilizationRate =
154+
reserveData.totalVariableDebt /
155+
(reserveData.availableLiquidity + reserveData.totalVariableDebt);
156+
}
157+
reserveData.maxUtilizationRate = baseData.maxUtilizationRate;
142158
}
143159

144160
function _fillUserReserveData(
@@ -169,12 +185,14 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
169185
address[] memory nfts = lendPool.getNftsList();
170186
AggregatedNftData[] memory nftsData = new AggregatedNftData[](nfts.length);
171187

188+
uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);
189+
172190
for (uint256 i = 0; i < nfts.length; i++) {
173191
AggregatedNftData memory nftData = nftsData[i];
174192

175193
DataTypes.NftData memory baseData = lendPool.getNftData(nfts[i]);
176194

177-
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan);
195+
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan, ethUSDPrice);
178196
}
179197

180198
return (nftsData);
@@ -217,13 +235,15 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
217235
AggregatedNftData[] memory nftsData = new AggregatedNftData[](nfts.length);
218236
UserNftData[] memory userNftsData = new UserNftData[](user != address(0) ? nfts.length : 0);
219237

238+
uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);
239+
220240
for (uint256 i = 0; i < nfts.length; i++) {
221241
AggregatedNftData memory nftData = nftsData[i];
222242
UserNftData memory userNftData = userNftsData[i];
223243

224244
DataTypes.NftData memory baseData = lendPool.getNftData(nfts[i]);
225245

226-
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan);
246+
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan, ethUSDPrice);
227247
if (user != address(0)) {
228248
_fillUserNftData(userNftData, user, nfts[i], baseData, lendPoolLoan);
229249
}
@@ -236,13 +256,16 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
236256
AggregatedNftData memory nftData,
237257
address nftAsset,
238258
DataTypes.NftData memory baseData,
239-
ILendPoolLoan lendPoolLoan
259+
ILendPoolLoan lendPoolLoan,
260+
uint256 ethUSDPrice
240261
) internal view {
241262
nftData.underlyingAsset = nftAsset;
242263

243264
// nft current state
244265
nftData.bNftAddress = baseData.bNftAddress;
245266
nftData.priceInEth = nftOracle.getAssetPrice(nftData.underlyingAsset);
267+
nftData.priceInUSD = (nftData.priceInEth * ethUSDPrice) / RPICE_DECIMAL;
268+
nftData.isPriceStale = nftOracle.isPriceStale(nftData.underlyingAsset);
246269

247270
nftData.totalCollateral = lendPoolLoan.getNftCollateralAmount(nftAsset);
248271

@@ -258,6 +281,7 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
258281
.getAuctionParamsMemory();
259282
(nftData.isActive, nftData.isFrozen) = baseData.configuration.getFlagsMemory();
260283
nftData.minBidFine = baseData.configuration.getMinBidFineMemory();
284+
nftData.maxCollateralCap = baseData.maxCollateralCap;
261285
}
262286

263287
function _fillUserNftData(

deployments/deployed-contracts-main.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
128128
},
129129
"UIPoolDataProvider": {
130-
"address": "0x132E3E3eC6652299B235A26D601aa9C68806e3FE",
130+
"address": "0x05664B848B40904a79e24A6B7A087fb0EccDeB38",
131131
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
132132
},
133133
"BendProxyAdminWTL": {

deployments/deployed-contracts-sepolia.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
129129
},
130130
"UIPoolDataProvider": {
131-
"address": "0x65fe0C8E9d18b4959BF7f49B63796Ba9f4F9a0fb",
131+
"address": "0x000D94a62C5Cf4a9CD53fdc1A4968D3b07625D7f",
132132
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
133133
},
134134
"ChainlinkAggregatorHelperImpl": {

0 commit comments

Comments
 (0)