refactor: optimization on getUserAccountData()

This commit is contained in:
The3D 2021-06-28 14:30:07 +02:00
parent 71b3b77677
commit d2d7e48ee3

View File

@ -48,11 +48,12 @@ library GenericLogic {
uint256 normalizedIncome; uint256 normalizedIncome;
uint256 normalizedDebt; uint256 normalizedDebt;
uint256 exposureCap; uint256 exposureCap;
uint256 aTokenSupply;
bool healthFactorBelowThreshold; bool healthFactorBelowThreshold;
address currentReserveAddress; address currentReserveAddress;
bool usageAsCollateralEnabled; bool usageAsCollateralEnabled;
bool userUsesReserveAsCollateral; bool userUsesReserveAsCollateral;
bool exposureCapped; bool exposureCapCrossed;
} }
/** /**
@ -109,20 +110,28 @@ library GenericLogic {
vars.assetPrice = IPriceOracleGetter(oracle).getAssetPrice(vars.currentReserveAddress); vars.assetPrice = IPriceOracleGetter(oracle).getAssetPrice(vars.currentReserveAddress);
if (vars.liquidationThreshold != 0 && userConfig.isUsingAsCollateral(vars.i)) { if (vars.liquidationThreshold != 0 && userConfig.isUsingAsCollateral(vars.i)) {
vars.userBalance = IScaledBalanceToken(currentReserve.aTokenAddress).scaledBalanceOf(user); vars.normalizedIncome = currentReserve.getNormalizedIncome();
if (vars.userBalance > 0) {
vars.normalizedIncome = currentReserve.getNormalizedIncome(); if (vars.exposureCap != 0) {
(vars.userBalance, vars.aTokenSupply) = IScaledBalanceToken(currentReserve.aTokenAddress)
.getScaledUserBalanceAndSupply(user);
vars.userBalance = vars.userBalance.rayMul(vars.normalizedIncome); vars.userBalance = vars.userBalance.rayMul(vars.normalizedIncome);
vars.aTokenSupply = vars.aTokenSupply.rayMul(vars.normalizedIncome);
} else {
vars.userBalance = IScaledBalanceToken(currentReserve.aTokenAddress).scaledBalanceOf(
user
);
vars.aTokenSupply = 0;
} }
vars.userBalanceETH = vars.assetPrice.mul(vars.userBalance).div(vars.assetUnit); vars.userBalanceETH = vars.assetPrice.mul(vars.userBalance).div(vars.assetUnit);
vars.totalCollateralInETH = vars.totalCollateralInETH.add(vars.userBalanceETH); vars.totalCollateralInETH = vars.totalCollateralInETH.add(vars.userBalanceETH);
vars.exposureCapped = vars.exposureCapCrossed =
vars.exposureCap != 0 && vars.exposureCap != 0 &&
IERC20(currentReserve.aTokenAddress).totalSupply().div(10**vars.decimals) > vars.aTokenSupply.div(10**vars.decimals) > vars.exposureCap;
vars.exposureCap;
vars.avgLtv = vars.avgLtv.add(vars.exposureCapped ? 0 : vars.userBalanceETH.mul(vars.ltv)); vars.avgLtv = vars.avgLtv.add(vars.exposureCapCrossed ? 0 : vars.userBalanceETH.mul(vars.ltv));
vars.avgLiquidationThreshold = vars.avgLiquidationThreshold.add( vars.avgLiquidationThreshold = vars.avgLiquidationThreshold.add(
vars.userBalanceETH.mul(vars.liquidationThreshold) vars.userBalanceETH.mul(vars.liquidationThreshold)
); );
@ -206,7 +215,7 @@ library GenericLogic {
} }
/** /**
* @dev proxy call for calculateUserAccountData as external function. * @dev proxy call for calculateUserAccountData as external function.
* Used in LendingPool to work around contract size limit issues * Used in LendingPool to work around contract size limit issues
* @param user The address of the user * @param user The address of the user
* @param reservesData Data of all the reserves * @param reservesData Data of all the reserves