Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions contracts/interfaces/IUiPoolDataProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ interface IUiPoolDataProvider {
uint256 priceInEth;
uint256 variableRateSlope1;
uint256 variableRateSlope2;
//
uint256 priceInUSD;
uint256 utilizationRate;
uint256 maxUtilizationRate;
}

struct UserReserveData {
Expand All @@ -54,6 +58,10 @@ interface IUiPoolDataProvider {
address bNftAddress;
uint256 priceInEth;
uint256 totalCollateral;
//
uint256 priceInUSD;
uint256 maxCollateralCap;
bool isPriceStale;
}

struct UserNftData {
Expand Down
2 changes: 1 addition & 1 deletion contracts/libraries/logic/ValidationLogic.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import {Errors} from "../helpers/Errors.sol";
import {DataTypes} from "../types/DataTypes.sol";
import {IInterestRate} from "../../interfaces/IInterestRate.sol";
import {ILendPoolLoan} from "../../interfaces/ILendPoolLoan.sol";
import {IDebtToken} from "../../interfaces/IDebtToken.sol";
import {INFTOracleGetter} from "../../interfaces/INFTOracleGetter.sol";
import {IDebtToken} from "../../interfaces/IDebtToken.sol";

import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
Expand Down
36 changes: 30 additions & 6 deletions contracts/misc/UiPoolDataProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
using ReserveConfiguration for DataTypes.ReserveConfigurationMap;
using NftConfiguration for DataTypes.NftConfigurationMap;

uint256 public constant RPICE_DECIMAL = 10**18;
address public constant MOCK_ETH_USD_ADDRESS = 0x9ceB4d4C184d1786614a593a03621b7F37F8685F;

IReserveOracleGetter public immutable reserveOracle;
INFTOracleGetter public immutable nftOracle;

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

uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);

for (uint256 i = 0; i < reserves.length; i++) {
AggregatedReserveData memory reserveData = reservesData[i];

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

_fillReserveData(reserveData, reserves[i], baseData);
_fillReserveData(reserveData, reserves[i], baseData, ethUSDPrice);
}

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

uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);

for (uint256 i = 0; i < reserves.length; i++) {
AggregatedReserveData memory reserveData = reservesData[i];

DataTypes.ReserveData memory baseData = lendPool.getReserveData(reserves[i]);
_fillReserveData(reserveData, reserves[i], baseData);
_fillReserveData(reserveData, reserves[i], baseData, ethUSDPrice);

if (user != address(0)) {
_fillUserReserveData(userReservesData[i], user, reserves[i], baseData);
Expand All @@ -110,7 +117,8 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
function _fillReserveData(
AggregatedReserveData memory reserveData,
address reserveAsset,
DataTypes.ReserveData memory baseData
DataTypes.ReserveData memory baseData,
uint256 ethUSDPrice
) internal view {
reserveData.underlyingAsset = reserveAsset;

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

reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf(reserveData.bTokenAddress);
reserveData.totalVariableDebt = IDebtToken(reserveData.debtTokenAddress).totalSupply();
Expand All @@ -139,6 +148,13 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
(reserveData.variableRateSlope1, reserveData.variableRateSlope2) = getInterestRateStrategySlopes(
InterestRate(reserveData.interestRateAddress)
);

if (reserveData.totalVariableDebt > 0) {
reserveData.utilizationRate =
reserveData.totalVariableDebt /
(reserveData.availableLiquidity + reserveData.totalVariableDebt);
}
reserveData.maxUtilizationRate = baseData.maxUtilizationRate;
}

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

uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);

for (uint256 i = 0; i < nfts.length; i++) {
AggregatedNftData memory nftData = nftsData[i];

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

_fillNftData(nftData, nfts[i], baseData, lendPoolLoan);
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan, ethUSDPrice);
}

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

uint256 ethUSDPrice = reserveOracle.getAssetPrice(MOCK_ETH_USD_ADDRESS);

for (uint256 i = 0; i < nfts.length; i++) {
AggregatedNftData memory nftData = nftsData[i];
UserNftData memory userNftData = userNftsData[i];

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

_fillNftData(nftData, nfts[i], baseData, lendPoolLoan);
_fillNftData(nftData, nfts[i], baseData, lendPoolLoan, ethUSDPrice);
if (user != address(0)) {
_fillUserNftData(userNftData, user, nfts[i], baseData, lendPoolLoan);
}
Expand All @@ -236,13 +256,16 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
AggregatedNftData memory nftData,
address nftAsset,
DataTypes.NftData memory baseData,
ILendPoolLoan lendPoolLoan
ILendPoolLoan lendPoolLoan,
uint256 ethUSDPrice
) internal view {
nftData.underlyingAsset = nftAsset;

// nft current state
nftData.bNftAddress = baseData.bNftAddress;
nftData.priceInEth = nftOracle.getAssetPrice(nftData.underlyingAsset);
nftData.priceInUSD = (nftData.priceInEth * ethUSDPrice) / RPICE_DECIMAL;
nftData.isPriceStale = nftOracle.isPriceStale(nftData.underlyingAsset);

nftData.totalCollateral = lendPoolLoan.getNftCollateralAmount(nftAsset);

Expand All @@ -258,6 +281,7 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
.getAuctionParamsMemory();
(nftData.isActive, nftData.isFrozen) = baseData.configuration.getFlagsMemory();
nftData.minBidFine = baseData.configuration.getMinBidFineMemory();
nftData.maxCollateralCap = baseData.maxCollateralCap;
}

function _fillUserNftData(
Expand Down
24 changes: 12 additions & 12 deletions deployments/deployed-contracts-main.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"address": "0x3b241a4338f0C3f67aFE0e130ccB653D0Ef3767C"
},
"NFTOracleImpl": {
"address": "0x359424a81392588206cbb33159d6AebC292Cb404"
"address": "0xbCa9005Da4DdcF608B5cA9BBC62a8C1622B3b327"
},
"NFTOracle": {
"address": "0x7C2A19e54e48718f6C60908a9Cff3396E4Ea1eBA"
Expand All @@ -32,39 +32,39 @@
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"ReserveLogic": {
"address": "0x561bc6b912a677A29B799aCef65156D0e40eFcce",
"address": "0xCC814F74083D7b96BBD9f4E0176e692fEDa366bB",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"NftLogic": {
"address": "0x6F6D907a4AD9b6Ab93c0dAd8668Df3C7a44777aA",
"address": "0x312ba89f3C28776D8a899caA544aC888C1B34129",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"GenericLogic": {
"address": "0xa5C59eAAdCec1F2De31B509304ebB08bd25c39e4",
"address": "0xeA1ff60e53EdfEC16Bd36D630B2D93567C8fEFF0",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"ValidationLogic": {
"address": "0x883E3A1a1C7d1F0aaD28FE77E87a8F45C4D0ed76",
"address": "0x11bb1dD65245f9Ff6c9D6AaD01CaFBD94EC8D97d",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"SupplyLogic": {
"address": "0x066A28d0f844aF0A51ACb80Fc9eF9c584d09b2c9",
"address": "0xcE082CB801f99e5CDa73efd713536e4b9EfaCC1C",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"BorrowLogic": {
"address": "0x7EDF3f0d854CbB032f05B9ea640BBE99D9Ab4996",
"address": "0x6916Df756FE31b155Bf3B8f9ad5D2B93C7de6DF8",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"LiquidateLogic": {
"address": "0xB7A7EfbFbAa052FEF35963c5EeA3f38fF39998EB",
"address": "0xd801d22b3495abB71B4c6a0a0DdBB16065B5c05F",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"ConfiguratorLogic": {
"address": "0xe4e70Fc5739A9E65654D26A25336e32182c69A26",
"address": "0xa5b27656A474ee73A08BE70a6724DC0A015FC279",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"LendPoolImpl": {
"address": "0x290afB1f68131D39De177199b57Fb613a31066a4"
"address": "0x9015b2c79064a07C7a40f390485177931C2817c3"
},
"LendPool": {
"address": "0x70b97A0da65C15dfb0FFA02aEE6FA36e507C2762"
Expand All @@ -76,7 +76,7 @@
"address": "0x5f6ac80CdB9E87f3Cfa6a90E5140B9a16A361d5C"
},
"LendPoolConfiguratorImpl": {
"address": "0xbD96056E10c2748D41F072649f4Dcc37874aB603"
"address": "0xd64c8CB68fF4301430816Ffeb3F9cDb8A95e18Bb"
},
"LendPoolConfigurator": {
"address": "0x4f694372ced64B8Cf389A04f13E67ac0035A6449"
Expand Down Expand Up @@ -127,7 +127,7 @@
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"UIPoolDataProvider": {
"address": "0x132E3E3eC6652299B235A26D601aa9C68806e3FE",
"address": "0x05664B848B40904a79e24A6B7A087fb0EccDeB38",
"deployer": "0x868964fa49a6fd6e116FE82c8f4165904406f479"
},
"BendProxyAdminWTL": {
Expand Down
24 changes: 12 additions & 12 deletions deployments/deployed-contracts-sepolia.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,39 +28,39 @@
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"GenericLogic": {
"address": "0xD0cA9d0caBc13F6c8Ee3dA8bafb4a4DE7f09F5aB",
"address": "0x158BeB02559f4828cb48136DD140938bdCF2cd97",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"ReserveLogic": {
"address": "0x4BB3029EDdBaFE9C83068FE39643B687F15ED3dC",
"address": "0xDffbfdE273F44d91d6d438b67CeF4AC569FA9307",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"NftLogic": {
"address": "0x1C1A282F9892d1E565D7215a764E8fcd17726C3f",
"address": "0x7f87344614bB4A3b97440790E9546c837BF8F723",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"ValidationLogic": {
"address": "0x89a60BB6cE83D4514dA956165664Ba6Ee4c15687",
"address": "0x77F323Aa86093a66548832213c2f6e434d1D28B3",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"SupplyLogic": {
"address": "0x1C9Ef41AC8aEC7Ec1A9F03e42AEcAF433629fEE6",
"address": "0xDf7b8402fdDac5f35804B5A80A42b808Cee392BC",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"BorrowLogic": {
"address": "0xdeE5158389802b006dD4610BddA929436B3FbD32",
"address": "0x7fd1dCDe1bc38cA18975f5fe8Ed80A7f1dd797b1",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"LiquidateLogic": {
"address": "0x37A76Db446bDB3EF1b73112a8D5E6868de06464f",
"address": "0x032f811BdC66b179b934d0988b097FF581450630",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"ConfiguratorLogic": {
"address": "0xdDD7c8B889fB0f599359f4dD90fE55e101EE67b9",
"address": "0xd6aB5a7eFc17dC0fec51e0d89b1d9A28261C482c",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"LendPoolImpl": {
"address": "0xb0A1Df91157E08F63126Be78A722C096D857D7ce"
"address": "0x9e665366133E12CD7eb9D4F12094816114D2216e"
},
"LendPool": {
"address": "0xC0a03A1c61ECf436d2C6F3285992D7270a0e8a3F"
Expand All @@ -72,7 +72,7 @@
"address": "0xaA04774b15FC5555DabC2b87Bdd6976B6C9f4Bc0"
},
"LendPoolConfiguratorImpl": {
"address": "0x8DC063164483a1548f62697bE9308081210Dd0D6"
"address": "0x6C0B302D04E8C4C658824fBeE0F99B2a5CFA8d8B"
},
"LendPoolConfigurator": {
"address": "0x1252Ee9B28A632a653061bE91000f2Ccf40A9b26"
Expand All @@ -93,7 +93,7 @@
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"NFTOracleImpl": {
"address": "0xA7bb6431BF998D4e3380ed73DcB226e23E37AA27"
"address": "0x8FB70fF20eb3d00c20D82Fccaca71282F4937651"
},
"NFTOracle": {
"address": "0xF143144Fb2703C8aeefD0c4D06d29F5Bb0a9C60A"
Expand Down Expand Up @@ -128,7 +128,7 @@
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"UIPoolDataProvider": {
"address": "0x65fe0C8E9d18b4959BF7f49B63796Ba9f4F9a0fb",
"address": "0x000D94a62C5Cf4a9CD53fdc1A4968D3b07625D7f",
"deployer": "0xafF5C36642385b6c7Aaf7585eC785aB2316b5db6"
},
"ChainlinkAggregatorHelperImpl": {
Expand Down
Loading