diff --git a/contracts/protocol/lendingpool/LendingPool.sol b/contracts/protocol/lendingpool/LendingPool.sol index 1c5f4208..24a9ae4b 100644 --- a/contracts/protocol/lendingpool/LendingPool.sol +++ b/contracts/protocol/lendingpool/LendingPool.sol @@ -289,27 +289,27 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (interestRateMode == DataTypes.InterestRateMode.STABLE) { IStableDebtToken(reserveCache.stableDebtTokenAddress).burn(msg.sender, stableDebt); - reserveCache.newPrincipalStableDebt = reserveCache.newTotalStableDebt = reserveCache - .oldTotalStableDebt + reserveCache.nextPrincipalStableDebt = reserveCache.nextTotalStableDebt = reserveCache + .currTotalStableDebt .sub(stableDebt); IVariableDebtToken(reserveCache.variableDebtTokenAddress).mint( msg.sender, msg.sender, stableDebt, - reserveCache.newVariableBorrowIndex + reserveCache.nextVariableBorrowIndex ); - reserveCache.newScaledVariableDebt = reserveCache.oldScaledVariableDebt.add( - stableDebt.rayDiv(reserveCache.newVariableBorrowIndex) + reserveCache.nextScaledVariableDebt = reserveCache.currScaledVariableDebt.add( + stableDebt.rayDiv(reserveCache.nextVariableBorrowIndex) ); } else { IVariableDebtToken(reserveCache.variableDebtTokenAddress).burn( msg.sender, variableDebt, - reserveCache.newVariableBorrowIndex + reserveCache.nextVariableBorrowIndex ); - reserveCache.newScaledVariableDebt = reserveCache.oldScaledVariableDebt.sub( - variableDebt.rayDiv(reserveCache.newVariableBorrowIndex) + reserveCache.nextScaledVariableDebt = reserveCache.currScaledVariableDebt.sub( + variableDebt.rayDiv(reserveCache.nextVariableBorrowIndex) ); IStableDebtToken(reserveCache.stableDebtTokenAddress).mint( @@ -319,8 +319,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage reserve.currentStableBorrowRate ); - reserveCache.newPrincipalStableDebt = reserveCache.newTotalStableDebt = reserveCache - .oldTotalStableDebt + reserveCache.nextPrincipalStableDebt = reserveCache.nextTotalStableDebt = reserveCache + .currTotalStableDebt .add(stableDebt); } @@ -927,8 +927,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage currentStableRate ); - reserveCache.newPrincipalStableDebt = reserveCache.newTotalStableDebt = reserveCache - .oldTotalStableDebt + reserveCache.nextPrincipalStableDebt = reserveCache.nextTotalStableDebt = reserveCache + .currTotalStableDebt .add(vars.amount); } else { @@ -936,11 +936,11 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage vars.user, vars.onBehalfOf, vars.amount, - reserveCache.newVariableBorrowIndex + reserveCache.nextVariableBorrowIndex ); - reserveCache.newScaledVariableDebt = reserveCache.newScaledVariableDebt.add( - vars.amount.rayDiv(reserveCache.newVariableBorrowIndex) + reserveCache.nextScaledVariableDebt = reserveCache.nextScaledVariableDebt.add( + vars.amount.rayDiv(reserveCache.nextVariableBorrowIndex) ); } @@ -990,7 +990,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, amount); bool isFirstDeposit = - IAToken(reserveCache.aTokenAddress).mint(onBehalfOf, amount, reserveCache.newLiquidityIndex); + IAToken(reserveCache.aTokenAddress).mint(onBehalfOf, amount, reserveCache.nextLiquidityIndex); if (isFirstDeposit) { _usersConfig[onBehalfOf].setUsingAsCollateral(reserve.id, true); @@ -1013,7 +1013,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.newLiquidityIndex + reserveCache.nextLiquidityIndex ); uint256 amountToWithdraw = amount; @@ -1030,7 +1030,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage msg.sender, to, amountToWithdraw, - reserveCache.newLiquidityIndex + reserveCache.nextLiquidityIndex ); if (userConfig.isUsingAsCollateral(reserve.id)) { @@ -1090,17 +1090,17 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (interestRateMode == DataTypes.InterestRateMode.STABLE) { IStableDebtToken(reserveCache.stableDebtTokenAddress).burn(onBehalfOf, paybackAmount); - reserveCache.newPrincipalStableDebt = reserveCache.newTotalStableDebt = reserveCache - .oldTotalStableDebt + reserveCache.nextPrincipalStableDebt = reserveCache.nextTotalStableDebt = reserveCache + .currTotalStableDebt .sub(paybackAmount); } else { IVariableDebtToken(reserveCache.variableDebtTokenAddress).burn( onBehalfOf, paybackAmount, - reserveCache.newVariableBorrowIndex + reserveCache.nextVariableBorrowIndex ); - reserveCache.newScaledVariableDebt = reserveCache.oldScaledVariableDebt.sub( - paybackAmount.rayDiv(reserveCache.newVariableBorrowIndex) + reserveCache.nextScaledVariableDebt = reserveCache.currScaledVariableDebt.sub( + paybackAmount.rayDiv(reserveCache.nextVariableBorrowIndex) ); } diff --git a/contracts/protocol/lendingpool/LendingPoolCollateralManager.sol b/contracts/protocol/lendingpool/LendingPoolCollateralManager.sol index 2f6b0bcb..19908705 100644 --- a/contracts/protocol/lendingpool/LendingPoolCollateralManager.sol +++ b/contracts/protocol/lendingpool/LendingPoolCollateralManager.sol @@ -171,10 +171,10 @@ contract LendingPoolCollateralManager is IVariableDebtToken(debtReserveCache.variableDebtTokenAddress).burn( user, vars.actualDebtToLiquidate, - debtReserveCache.newVariableBorrowIndex + debtReserveCache.nextVariableBorrowIndex ); - debtReserveCache.newScaledVariableDebt = debtReserveCache.oldScaledVariableDebt.sub( - vars.actualDebtToLiquidate.rayDiv(debtReserveCache.newVariableBorrowIndex) + debtReserveCache.nextScaledVariableDebt = debtReserveCache.currScaledVariableDebt.sub( + vars.actualDebtToLiquidate.rayDiv(debtReserveCache.nextVariableBorrowIndex) ); } else { // If the user doesn't have variable debt, no need to try to burn variable debt tokens @@ -182,19 +182,19 @@ contract LendingPoolCollateralManager is IVariableDebtToken(debtReserveCache.variableDebtTokenAddress).burn( user, vars.userVariableDebt, - debtReserveCache.newVariableBorrowIndex + debtReserveCache.nextVariableBorrowIndex ); - debtReserveCache.newScaledVariableDebt = debtReserveCache - .oldScaledVariableDebt - .sub(vars.userVariableDebt.rayDiv(debtReserveCache.newVariableBorrowIndex)); + debtReserveCache.nextScaledVariableDebt = debtReserveCache + .currScaledVariableDebt + .sub(vars.userVariableDebt.rayDiv(debtReserveCache.nextVariableBorrowIndex)); } IStableDebtToken(debtReserveCache.stableDebtTokenAddress).burn( user, vars.actualDebtToLiquidate.sub(vars.userVariableDebt) ); - debtReserveCache.newPrincipalStableDebt = debtReserveCache - .newTotalStableDebt = debtReserveCache.oldTotalStableDebt.sub( + debtReserveCache.nextPrincipalStableDebt = debtReserveCache + .nextTotalStableDebt = debtReserveCache.currTotalStableDebt.sub( vars.actualDebtToLiquidate.sub(vars.userVariableDebt) ); } diff --git a/contracts/protocol/libraries/logic/ReserveLogic.sol b/contracts/protocol/libraries/logic/ReserveLogic.sol index 2db7fe34..1db225ac 100644 --- a/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -186,13 +186,13 @@ library ReserveLogic { ) internal { UpdateInterestRatesLocalVars memory vars; - if (reserveCache.oldTotalStableDebt != reserveCache.newTotalStableDebt) { - reserveCache.newAvgStableBorrowRate = IStableDebtToken(reserveCache.stableDebtTokenAddress) + if (reserveCache.currTotalStableDebt != reserveCache.nextTotalStableDebt) { + reserveCache.nextAvgStableBorrowRate = IStableDebtToken(reserveCache.stableDebtTokenAddress) .getAverageStableRate(); } - reserveCache.newTotalVariableDebt = reserveCache.newScaledVariableDebt.rayMul( - reserveCache.newVariableBorrowIndex + reserveCache.nextTotalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex ); ( @@ -204,9 +204,9 @@ library ReserveLogic { reserveCache.aTokenAddress, liquidityAdded, liquidityTaken, - reserveCache.newTotalStableDebt, - reserveCache.newTotalVariableDebt, - reserveCache.newAvgStableBorrowRate, + reserveCache.nextTotalStableDebt, + reserveCache.nextTotalVariableDebt, + reserveCache.nextAvgStableBorrowRate, reserveCache.reserveConfiguration.getReserveFactorMemory() ); require(vars.newLiquidityRate <= type(uint128).max, Errors.RL_LIQUIDITY_RATE_OVERFLOW); @@ -222,8 +222,8 @@ library ReserveLogic { vars.newLiquidityRate, vars.newStableRate, vars.newVariableRate, - reserveCache.newLiquidityIndex, - reserveCache.newVariableBorrowIndex + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex ); } @@ -260,30 +260,30 @@ library ReserveLogic { } //calculate the last principal variable debt - vars.previousVariableDebt = reserveCache.oldScaledVariableDebt.rayMul( - reserveCache.oldVariableBorrowIndex + vars.previousVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex ); //calculate the new total supply after accumulation of the index - vars.currentVariableDebt = reserveCache.oldScaledVariableDebt.rayMul( - reserveCache.newVariableBorrowIndex + vars.currentVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex ); //calculate the stable debt until the last timestamp update vars.cumulatedStableInterest = MathUtils.calculateCompoundedInterest( - reserveCache.oldAvgStableBorrowRate, + reserveCache.currAvgStableBorrowRate, reserveCache.stableDebtLastUpdateTimestamp, reserveCache.reserveLastUpdateTimestamp ); - vars.previousStableDebt = reserveCache.oldPrincipalStableDebt.rayMul( + vars.previousStableDebt = reserveCache.currPrincipalStableDebt.rayMul( vars.cumulatedStableInterest ); //debt accrued is the sum of the current debt minus the sum of the debt at the last update vars.totalDebtAccrued = vars .currentVariableDebt - .add(reserveCache.oldTotalStableDebt) + .add(reserveCache.currTotalStableDebt) .sub(vars.previousVariableDebt) .sub(vars.previousStableDebt); @@ -291,7 +291,7 @@ library ReserveLogic { if (vars.amountToMint != 0) { reserve.accruedToTreasury = reserve.accruedToTreasury.add( - vars.amountToMint.rayDiv(reserveCache.newLiquidityIndex) + vars.amountToMint.rayDiv(reserveCache.nextLiquidityIndex) ); } } @@ -305,41 +305,41 @@ library ReserveLogic { DataTypes.ReserveData storage reserve, DataTypes.ReserveCache memory reserveCache ) internal { - reserveCache.newLiquidityIndex = reserveCache.oldLiquidityIndex; - reserveCache.newVariableBorrowIndex = reserveCache.oldVariableBorrowIndex; + reserveCache.nextLiquidityIndex = reserveCache.currLiquidityIndex; + reserveCache.nextVariableBorrowIndex = reserveCache.currVariableBorrowIndex; //only cumulating if there is any income being produced - if (reserveCache.oldLiquidityRate > 0) { + if (reserveCache.currLiquidityRate > 0) { uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.oldLiquidityRate, + reserveCache.currLiquidityRate, reserveCache.reserveLastUpdateTimestamp ); - reserveCache.newLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.oldLiquidityIndex + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex ); require( - reserveCache.newLiquidityIndex <= type(uint128).max, + reserveCache.nextLiquidityIndex <= type(uint128).max, Errors.RL_LIQUIDITY_INDEX_OVERFLOW ); - reserve.liquidityIndex = uint128(reserveCache.newLiquidityIndex); + reserve.liquidityIndex = uint128(reserveCache.nextLiquidityIndex); //as the liquidity rate might come only from stable rate loans, we need to ensure //that there is actual variable debt before accumulating - if (reserveCache.oldScaledVariableDebt != 0) { + if (reserveCache.currScaledVariableDebt != 0) { uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.oldVariableBorrowRate, + reserveCache.currVariableBorrowRate, reserveCache.reserveLastUpdateTimestamp ); - reserveCache.newVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.oldVariableBorrowIndex + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex ); require( - reserveCache.newVariableBorrowIndex <= type(uint128).max, + reserveCache.nextVariableBorrowIndex <= type(uint128).max, Errors.RL_VARIABLE_BORROW_INDEX_OVERFLOW ); - reserve.variableBorrowIndex = uint128(reserveCache.newVariableBorrowIndex); + reserve.variableBorrowIndex = uint128(reserveCache.nextVariableBorrowIndex); } } @@ -355,10 +355,10 @@ library ReserveLogic { DataTypes.ReserveCache memory reserveCache; reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.oldLiquidityIndex = reserve.liquidityIndex; - reserveCache.oldVariableBorrowIndex = reserve.variableBorrowIndex; - reserveCache.oldLiquidityRate = reserve.currentLiquidityRate; - reserveCache.oldVariableBorrowRate = reserve.currentVariableBorrowRate; + reserveCache.currLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserve.variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; reserveCache.aTokenAddress = reserve.aTokenAddress; reserveCache.stableDebtTokenAddress = reserve.stableDebtTokenAddress; @@ -366,22 +366,22 @@ library ReserveLogic { reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - reserveCache.oldScaledVariableDebt = reserveCache.newScaledVariableDebt = IVariableDebtToken( + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( reserveCache .variableDebtTokenAddress ) .scaledTotalSupply(); ( - reserveCache.oldPrincipalStableDebt, - reserveCache.oldTotalStableDebt, - reserveCache.oldAvgStableBorrowRate, + reserveCache.currPrincipalStableDebt, + reserveCache.currTotalStableDebt, + reserveCache.currAvgStableBorrowRate, reserveCache.stableDebtLastUpdateTimestamp ) = IStableDebtToken(reserveCache.stableDebtTokenAddress).getSupplyData(); - reserveCache.newPrincipalStableDebt = reserveCache.oldPrincipalStableDebt; - reserveCache.newTotalStableDebt = reserveCache.oldTotalStableDebt; - reserveCache.newAvgStableBorrowRate = reserveCache.oldAvgStableBorrowRate; + reserveCache.nextPrincipalStableDebt = reserveCache.currPrincipalStableDebt; + reserveCache.nextTotalStableDebt = reserveCache.currTotalStableDebt; + reserveCache.nextAvgStableBorrowRate = reserveCache.currAvgStableBorrowRate; return reserveCache; } diff --git a/contracts/protocol/libraries/logic/ValidationLogic.sol b/contracts/protocol/libraries/logic/ValidationLogic.sol index 43629f1f..37f0c6a8 100644 --- a/contracts/protocol/libraries/logic/ValidationLogic.sol +++ b/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -60,7 +60,7 @@ library ValidationLogic { supplyCap == 0 || IAToken(reserveCache.aTokenAddress) .scaledTotalSupply() - .rayMul(reserveCache.newLiquidityIndex) + .rayMul(reserveCache.nextLiquidityIndex) .add(amount) .div(10**reserveDecimals) < supplyCap, @@ -79,7 +79,7 @@ library ValidationLogic { DataTypes.ReserveCache memory reserveCache, uint256 amount, uint256 userBalance - ) external view { + ) internal view { require(amount != 0, Errors.VL_INVALID_AMOUNT); require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); @@ -162,13 +162,13 @@ library ValidationLogic { vars.borrowCap = reserveCache.reserveConfiguration.getBorrowCapMemory(); - if (vars.borrowCap > 0) { + if (vars.borrowCap != 0) { { - vars.totalSupplyVariableDebt = reserveCache.oldScaledVariableDebt.rayMul( - reserveCache.newVariableBorrowIndex + vars.totalSupplyVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex ); - vars.totalDebt = reserveCache.oldTotalStableDebt.add(vars.totalSupplyVariableDebt).add( + vars.totalDebt = reserveCache.currTotalStableDebt.add(vars.totalSupplyVariableDebt).add( amount ); require( @@ -357,7 +357,7 @@ library ValidationLogic { //if the liquidity rate is below REBALANCE_UP_THRESHOLD of the max variable APR at 95% usage, //then we allow rebalancing of the stable rate positions. - uint256 currentLiquidityRate = reserveCache.oldLiquidityRate; + uint256 currentLiquidityRate = reserveCache.currLiquidityRate; uint256 maxVariableBorrowRate = IReserveInterestRateStrategy(reserve.interestRateStrategyAddress).getMaxVariableBorrowRate(); diff --git a/contracts/protocol/libraries/types/DataTypes.sol b/contracts/protocol/libraries/types/DataTypes.sol index fd05fa89..4a2ce981 100644 --- a/contracts/protocol/libraries/types/DataTypes.sol +++ b/contracts/protocol/libraries/types/DataTypes.sol @@ -53,22 +53,21 @@ library DataTypes { enum InterestRateMode {NONE, STABLE, VARIABLE} struct ReserveCache { - uint256 oldScaledVariableDebt; - uint256 oldTotalVariableDebt; - uint256 newScaledVariableDebt; - uint256 newTotalVariableDebt; - uint256 oldPrincipalStableDebt; - uint256 oldAvgStableBorrowRate; - uint256 oldTotalStableDebt; - uint256 newPrincipalStableDebt; - uint256 newAvgStableBorrowRate; - uint256 newTotalStableDebt; - uint256 oldLiquidityIndex; - uint256 newLiquidityIndex; - uint256 oldVariableBorrowIndex; - uint256 newVariableBorrowIndex; - uint256 oldLiquidityRate; - uint256 oldVariableBorrowRate; + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 nextTotalVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextPrincipalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; DataTypes.ReserveConfigurationMap reserveConfiguration; address aTokenAddress; address stableDebtTokenAddress;