mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	refactor: further refactored cache, changed linkage behavior of GenericLogic
This commit is contained in:
		
							parent
							
								
									666c6a0666
								
							
						
					
					
						commit
						760be1cb42
					
				|  | @ -20,8 +20,8 @@ import {Errors} from '../libraries/helpers/Errors.sol'; | |||
| import {WadRayMath} from '../libraries/math/WadRayMath.sol'; | ||||
| import {PercentageMath} from '../libraries/math/PercentageMath.sol'; | ||||
| import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; | ||||
| import {GenericLogic} from '../libraries/logic/GenericLogic.sol'; | ||||
| import {ValidationLogic} from '../libraries/logic/ValidationLogic.sol'; | ||||
| import {GenericLogic} from '../libraries/logic/GenericLogic.sol'; | ||||
| import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; | ||||
| import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; | ||||
| import {DataTypes} from '../libraries/types/DataTypes.sol'; | ||||
|  | @ -190,7 +190,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
|     uint16 referralCode, | ||||
|     address onBehalfOf | ||||
|   ) external override whenNotPaused { | ||||
|     DataTypes.ReserveData storage reserve = _reserves[asset]; | ||||
|     _executeBorrow( | ||||
|       ExecuteBorrowParams( | ||||
|         asset, | ||||
|  | @ -372,7 +371,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
|     DataTypes.ReserveData storage reserve = _reserves[asset]; | ||||
|     DataTypes.ReserveCache memory reserveCache = reserve.cache(); | ||||
| 
 | ||||
|     ValidationLogic.validateSetUseReserveAsCollateral(reserve, reserveCache); | ||||
|     ValidationLogic.validateSetUseReserveAsCollateral(reserveCache); | ||||
| 
 | ||||
|     _usersConfig[msg.sender].setUsingAsCollateral(reserve.id, useAsCollateral); | ||||
| 
 | ||||
|  | @ -619,7 +618,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
|       ltv, | ||||
|       currentLiquidationThreshold, | ||||
|       healthFactor | ||||
|     ) = GenericLogic.calculateUserAccountData( | ||||
|     ) = GenericLogic.getUserAccountData( | ||||
|       user, | ||||
|       _reserves, | ||||
|       _usersConfig[user], | ||||
|  | @ -990,7 +989,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
| 
 | ||||
|     reserve.updateState(reserveCache); | ||||
| 
 | ||||
|     ValidationLogic.validateDeposit(reserve, reserveCache, amount); | ||||
|     ValidationLogic.validateDeposit(reserveCache, amount); | ||||
| 
 | ||||
|     reserve.updateInterestRates(reserveCache, asset, amount, 0); | ||||
| 
 | ||||
|  | @ -1029,7 +1028,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
|       amountToWithdraw = userBalance; | ||||
|     } | ||||
| 
 | ||||
|     ValidationLogic.validateWithdraw(reserve, reserveCache, amountToWithdraw, userBalance); | ||||
|     ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); | ||||
| 
 | ||||
|     reserve.updateInterestRates(reserveCache, asset, 0, amountToWithdraw); | ||||
| 
 | ||||
|  | @ -1077,7 +1076,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage | |||
|     DataTypes.InterestRateMode interestRateMode = DataTypes.InterestRateMode(rateMode); | ||||
| 
 | ||||
|     ValidationLogic.validateRepay( | ||||
|       reserve, | ||||
|       reserveCache, | ||||
|       amount, | ||||
|       interestRateMode, | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| // SPDX-License-Identifier: agpl-3.0 | ||||
| pragma solidity 0.6.12; | ||||
| 
 | ||||
| pragma experimental ABIEncoderV2; | ||||
| 
 | ||||
| import {SafeMath} from '../../dependencies/openzeppelin/contracts//SafeMath.sol'; | ||||
| import {IERC20} from '../../dependencies/openzeppelin/contracts//IERC20.sol'; | ||||
| import {IAToken} from '../../interfaces/IAToken.sol'; | ||||
|  | @ -9,7 +11,6 @@ import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; | |||
| import {IPriceOracleGetter} from '../../interfaces/IPriceOracleGetter.sol'; | ||||
| import {ILendingPoolCollateralManager} from '../../interfaces/ILendingPoolCollateralManager.sol'; | ||||
| import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; | ||||
| import {GenericLogic} from '../libraries/logic/GenericLogic.sol'; | ||||
| import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; | ||||
| import {Helpers} from '../libraries/helpers/Helpers.sol'; | ||||
| import {WadRayMath} from '../libraries/math/WadRayMath.sol'; | ||||
|  | @ -54,6 +55,7 @@ contract LendingPoolCollateralManager is | |||
|     uint256 healthFactor; | ||||
|     uint256 liquidatorPreviousATokenBalance; | ||||
|     IAToken collateralAtoken; | ||||
|     IPriceOracleGetter oracle; | ||||
|     bool isCollateralEnabled; | ||||
|     DataTypes.InterestRateMode borrowRateMode; | ||||
|     uint256 errorCode; | ||||
|  | @ -89,33 +91,25 @@ contract LendingPoolCollateralManager is | |||
|   ) external override returns (uint256, string memory) { | ||||
|     DataTypes.ReserveData storage collateralReserve = _reserves[collateralAsset]; | ||||
|     DataTypes.ReserveData storage debtReserve = _reserves[debtAsset]; | ||||
|     DataTypes.ReserveCache memory debtReserveCache = debtReserve.cache(); | ||||
|     DataTypes.UserConfigurationMap storage userConfig = _usersConfig[user]; | ||||
| 
 | ||||
|     LiquidationCallLocalVars memory vars; | ||||
| 
 | ||||
|     (, , , , vars.healthFactor) = GenericLogic.calculateUserAccountData( | ||||
| 
 | ||||
|     (vars.userStableDebt, vars.userVariableDebt) = Helpers.getUserCurrentDebt(user, debtReserve); | ||||
|     vars.oracle =  IPriceOracleGetter(_addressesProvider.getPriceOracle()); | ||||
| 
 | ||||
|     (vars.errorCode, vars.errorMsg) = ValidationLogic.validateLiquidationCall( | ||||
|       collateralReserve, | ||||
|       debtReserveCache, | ||||
|       vars.userStableDebt.add(vars.userVariableDebt), | ||||
|       user, | ||||
|       _reserves, | ||||
|       userConfig, | ||||
|       _reservesList, | ||||
|       _reservesCount, | ||||
|       _addressesProvider.getPriceOracle() | ||||
|     ); | ||||
| 
 | ||||
|     DataTypes.ReserveCache memory debtReserveCache = debtReserve.cache(); | ||||
|     DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); | ||||
| 
 | ||||
|     (vars.userStableDebt, vars.userVariableDebt) = Helpers.getUserCurrentDebt(user, debtReserve); | ||||
| 
 | ||||
|     (vars.errorCode, vars.errorMsg) = ValidationLogic.validateLiquidationCall( | ||||
|       collateralReserve, | ||||
|       debtReserve, | ||||
|       debtReserveCache, | ||||
|       collateralReserveCache, | ||||
|       userConfig, | ||||
|       vars.healthFactor, | ||||
|       vars.userStableDebt, | ||||
|       vars.userVariableDebt | ||||
|       address(vars.oracle) | ||||
|     ); | ||||
| 
 | ||||
|     if (Errors.CollateralManagerErrors(vars.errorCode) != Errors.CollateralManagerErrors.NO_ERROR) { | ||||
|  | @ -139,11 +133,12 @@ contract LendingPoolCollateralManager is | |||
|       vars.debtAmountNeeded | ||||
|     ) = _calculateAvailableCollateralToLiquidate( | ||||
|       collateralReserve, | ||||
|       debtReserve, | ||||
|       debtReserveCache, | ||||
|       collateralAsset, | ||||
|       debtAsset, | ||||
|       vars.actualDebtToLiquidate, | ||||
|       vars.userCollateralBalance | ||||
|       vars.userCollateralBalance, | ||||
|       vars.oracle | ||||
|     ); | ||||
| 
 | ||||
|     // If debtAmountNeeded < actualDebtToLiquidate, there isn't enough | ||||
|  | @ -210,6 +205,7 @@ contract LendingPoolCollateralManager is | |||
|         emit ReserveUsedAsCollateralEnabled(collateralAsset, msg.sender); | ||||
|       } | ||||
|     } else { | ||||
|       DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); | ||||
|       collateralReserve.updateState(collateralReserveCache); | ||||
|       collateralReserve.updateInterestRates( | ||||
|         collateralReserveCache, | ||||
|  | @ -223,7 +219,7 @@ contract LendingPoolCollateralManager is | |||
|         user, | ||||
|         msg.sender, | ||||
|         vars.maxCollateralToLiquidate, | ||||
|         collateralReserve.liquidityIndex | ||||
|         collateralReserveCache.nextLiquidityIndex | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|  | @ -237,7 +233,7 @@ contract LendingPoolCollateralManager is | |||
|     // Transfers the debt asset being repaid to the aToken, where the liquidity is kept | ||||
|     IERC20(debtAsset).safeTransferFrom( | ||||
|       msg.sender, | ||||
|       debtReserve.aTokenAddress, | ||||
|       debtReserveCache.aTokenAddress, | ||||
|       vars.actualDebtToLiquidate | ||||
|     ); | ||||
| 
 | ||||
|  | @ -270,7 +266,7 @@ contract LendingPoolCollateralManager is | |||
|    * - This function needs to be called after all the checks to validate the liquidation have been performed, | ||||
|    *   otherwise it might fail. | ||||
|    * @param collateralReserve The data of the collateral reserve | ||||
|    * @param debtReserve The data of the debt reserve | ||||
|    * @param debtReserveCache The cached data of the debt reserve | ||||
|    * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation | ||||
|    * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation | ||||
|    * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover | ||||
|  | @ -281,15 +277,15 @@ contract LendingPoolCollateralManager is | |||
|    **/ | ||||
|   function _calculateAvailableCollateralToLiquidate( | ||||
|     DataTypes.ReserveData storage collateralReserve, | ||||
|     DataTypes.ReserveData storage debtReserve, | ||||
|     DataTypes.ReserveCache memory debtReserveCache, | ||||
|     address collateralAsset, | ||||
|     address debtAsset, | ||||
|     uint256 debtToCover, | ||||
|     uint256 userCollateralBalance | ||||
|     uint256 userCollateralBalance, | ||||
|     IPriceOracleGetter oracle | ||||
|   ) internal view returns (uint256, uint256) { | ||||
|     uint256 collateralAmount = 0; | ||||
|     uint256 debtAmountNeeded = 0; | ||||
|     IPriceOracleGetter oracle = IPriceOracleGetter(_addressesProvider.getPriceOracle()); | ||||
| 
 | ||||
|     AvailableCollateralToLiquidateLocalVars memory vars; | ||||
| 
 | ||||
|  | @ -299,7 +295,7 @@ contract LendingPoolCollateralManager is | |||
|     (, , vars.liquidationBonus, vars.collateralDecimals, ) = collateralReserve | ||||
|       .configuration | ||||
|       .getParams(); | ||||
|     vars.debtAssetDecimals = debtReserve.configuration.getDecimals(); | ||||
|     vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimalsMemory(); | ||||
| 
 | ||||
|     // This is the maximum possible amount of the selected collateral that can be liquidated, given the | ||||
|     // max amount of liquidatable debt | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ library ReserveConfiguration { | |||
|    * @param self The reserve configuration | ||||
|    * @return The loan to value | ||||
|    **/ | ||||
|   function getLtvMemory(DataTypes.ReserveConfigurationMap memory self) internal view returns (uint256) { | ||||
|   function getLtvMemory(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { | ||||
|     return self.data & ~LTV_MASK; | ||||
|   } | ||||
| 
 | ||||
|  | @ -104,18 +104,6 @@ library ReserveConfiguration { | |||
|     return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * @dev Gets the liquidation threshold of the reserve | ||||
|    * @param self The reserve configuration | ||||
|    * @return The liquidation threshold | ||||
|    **/ | ||||
|   function getLiquidationThresholdMemory(DataTypes.ReserveConfigurationMap memory self) | ||||
|     internal | ||||
|     view | ||||
|     returns (uint256) | ||||
|   { | ||||
|     return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; | ||||
|   } | ||||
|   /** | ||||
|    * @dev Sets the liquidation bonus of the reserve | ||||
|    * @param self The reserve configuration | ||||
|  | @ -172,7 +160,6 @@ library ReserveConfiguration { | |||
|     return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   /** | ||||
|    * @dev Gets the decimals of the underlying asset of the reserve | ||||
|    * @param self The reserve configuration | ||||
|  | @ -180,7 +167,7 @@ library ReserveConfiguration { | |||
|    **/ | ||||
|   function getDecimalsMemory(DataTypes.ReserveConfigurationMap memory self) | ||||
|     internal | ||||
|     view | ||||
|     pure | ||||
|     returns (uint256) | ||||
|   { | ||||
|     return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; | ||||
|  | @ -336,7 +323,7 @@ library ReserveConfiguration { | |||
|    **/ | ||||
|   function getReserveFactorMemory(DataTypes.ReserveConfigurationMap memory self) | ||||
|     internal | ||||
|     view | ||||
|     pure | ||||
|     returns (uint256) | ||||
|   { | ||||
|     return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; | ||||
|  |  | |||
|  | @ -198,4 +198,36 @@ library GenericLogic { | |||
|     availableBorrowsETH = availableBorrowsETH.sub(totalDebtInETH); | ||||
|     return availableBorrowsETH; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * @dev proxy call for calculateUserAccountData as external function.  | ||||
|    * Used in LendingPool to work around contract size limit issues | ||||
|    * @param user The address of the user | ||||
|    * @param reservesData Data of all the reserves | ||||
|    * @param userConfig The configuration of the user | ||||
|    * @param reserves The list of the available reserves | ||||
|    * @param oracle The price oracle address | ||||
|    * @return The total collateral and total debt of the user in ETH, the avg ltv, liquidation threshold and the HF | ||||
|    **/ | ||||
|   function getUserAccountData( | ||||
|     address user, | ||||
|     mapping(address => DataTypes.ReserveData) storage reservesData, | ||||
|     DataTypes.UserConfigurationMap memory userConfig, | ||||
|     mapping(uint256 => address) storage reserves, | ||||
|     uint256 reservesCount, | ||||
|     address oracle | ||||
|   ) | ||||
|     external | ||||
|     view | ||||
|     returns ( | ||||
|       uint256, | ||||
|       uint256, | ||||
|       uint256, | ||||
|       uint256, | ||||
|       uint256 | ||||
|     ) | ||||
|   { | ||||
|     return | ||||
|       calculateUserAccountData(user, reservesData, userConfig, reserves, reservesCount, oracle); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -186,7 +186,6 @@ library ReserveLogic { | |||
|   ) internal { | ||||
|     UpdateInterestRatesLocalVars memory vars; | ||||
| 
 | ||||
| 
 | ||||
|     reserveCache.nextTotalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( | ||||
|       reserveCache.nextVariableBorrowIndex | ||||
|     ); | ||||
|  | @ -386,25 +385,29 @@ library ReserveLogic { | |||
|     uint256 stableDebtBurned, | ||||
|     uint256 variableDebtMinted, | ||||
|     uint256 variableDebtBurned | ||||
|   ) internal { | ||||
|     uint256 scaledVariableDebtMinted = variableDebtMinted.rayDiv(cache.nextVariableBorrowIndex); | ||||
|     uint256 scaledVariableDebtBurned = variableDebtBurned.rayDiv(cache.nextVariableBorrowIndex); | ||||
| 
 | ||||
|     if (cache.currTotalStableDebt.add(stableDebtMinted) > stableDebtBurned) { | ||||
|       cache.nextPrincipalStableDebt = cache.nextTotalStableDebt = cache | ||||
|         .currTotalStableDebt | ||||
|         .add(stableDebtMinted) | ||||
|         .sub(stableDebtBurned); | ||||
|       if (stableDebtMinted != 0 || stableDebtBurned != 0) { | ||||
|         cache.nextAvgStableBorrowRate = IStableDebtToken(cache.stableDebtTokenAddress) | ||||
|           .getAverageStableRate(); | ||||
|   ) internal view { | ||||
|     if (stableDebtMinted != 0 || stableDebtBurned != 0) { | ||||
|       if (cache.currTotalStableDebt.add(stableDebtMinted) > stableDebtBurned) { | ||||
|         cache.nextPrincipalStableDebt = cache.nextTotalStableDebt = cache | ||||
|           .currTotalStableDebt | ||||
|           .add(stableDebtMinted) | ||||
|           .sub(stableDebtBurned); | ||||
|         if (stableDebtMinted != 0 || stableDebtBurned != 0) { | ||||
|           cache.nextAvgStableBorrowRate = IStableDebtToken(cache.stableDebtTokenAddress) | ||||
|             .getAverageStableRate(); | ||||
|         } | ||||
|       } else { | ||||
|         cache.nextPrincipalStableDebt = cache.nextTotalStableDebt = cache | ||||
|           .nextAvgStableBorrowRate = 0; | ||||
|       } | ||||
|     } else { | ||||
|       cache.nextPrincipalStableDebt = cache.nextTotalStableDebt = cache.nextAvgStableBorrowRate = 0; | ||||
|     } | ||||
| 
 | ||||
|     cache.nextScaledVariableDebt = cache.currScaledVariableDebt.add(scaledVariableDebtMinted).sub( | ||||
|       scaledVariableDebtBurned | ||||
|     ); | ||||
|     if (variableDebtMinted != 0 || variableDebtBurned != 0) { | ||||
|       uint256 scaledVariableDebtMinted = variableDebtMinted.rayDiv(cache.nextVariableBorrowIndex); | ||||
|       uint256 scaledVariableDebtBurned = variableDebtBurned.rayDiv(cache.nextVariableBorrowIndex); | ||||
|       cache.nextScaledVariableDebt = cache.currScaledVariableDebt.add(scaledVariableDebtMinted).sub( | ||||
|         scaledVariableDebtBurned | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import {Helpers} from '../helpers/Helpers.sol'; | |||
| import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; | ||||
| import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; | ||||
| import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; | ||||
| import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; | ||||
| import {IAToken} from '../../../interfaces/IAToken.sol'; | ||||
| import {DataTypes} from '../types/DataTypes.sol'; | ||||
| import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; | ||||
|  | @ -39,14 +40,13 @@ library ValidationLogic { | |||
| 
 | ||||
|   /** | ||||
|    * @dev Validates a deposit action | ||||
|    * @param reserve The reserve object on which the user is depositing | ||||
|    * @param reserveCache The cached data of the reserve | ||||
|    * @param amount The amount to be deposited | ||||
|    */ | ||||
|   function validateDeposit( | ||||
|     DataTypes.ReserveData storage reserve, | ||||
|     DataTypes.ReserveCache memory reserveCache, | ||||
|     uint256 amount | ||||
|   ) internal view { | ||||
|   function validateDeposit(DataTypes.ReserveCache memory reserveCache, uint256 amount) | ||||
|     internal | ||||
|     view | ||||
|   { | ||||
|     (bool isActive, bool isFrozen, , , bool isPaused) = | ||||
|       reserveCache.reserveConfiguration.getFlagsMemory(); | ||||
|     (, , , uint256 reserveDecimals, ) = reserveCache.reserveConfiguration.getParamsMemory(); | ||||
|  | @ -70,16 +70,15 @@ library ValidationLogic { | |||
| 
 | ||||
|   /** | ||||
|    * @dev Validates a withdraw action | ||||
|    * @param reserve The reserve object | ||||
|    * @param reserveCache The cached data of the reserve | ||||
|    * @param amount The amount to be withdrawn | ||||
|    * @param userBalance The balance of the user | ||||
|    */ | ||||
|   function validateWithdraw( | ||||
|     DataTypes.ReserveData storage reserve, | ||||
|     DataTypes.ReserveCache memory reserveCache, | ||||
|     uint256 amount, | ||||
|     uint256 userBalance | ||||
|   ) internal view { | ||||
|   ) internal pure { | ||||
|     require(amount != 0, Errors.VL_INVALID_AMOUNT); | ||||
|     require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); | ||||
| 
 | ||||
|  | @ -245,21 +244,20 @@ library ValidationLogic { | |||
| 
 | ||||
|   /** | ||||
|    * @dev Validates a repay action | ||||
|    * @param reserve The reserve state from which the user is repaying | ||||
|    * @param reserveCache The cached data of the reserve | ||||
|    * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) | ||||
|    * @param onBehalfOf The address of the user msg.sender is repaying for | ||||
|    * @param stableDebt The borrow balance of the user | ||||
|    * @param variableDebt The borrow balance of the user | ||||
|    */ | ||||
|   function validateRepay( | ||||
|     DataTypes.ReserveData storage reserve, | ||||
|     DataTypes.ReserveCache memory reserveCache, | ||||
|     uint256 amountSent, | ||||
|     DataTypes.InterestRateMode rateMode, | ||||
|     address onBehalfOf, | ||||
|     uint256 stableDebt, | ||||
|     uint256 variableDebt | ||||
|   ) external view { | ||||
|   ) internal view { | ||||
|     (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlagsMemory(); | ||||
|     require(isActive, Errors.VL_NO_ACTIVE_RESERVE); | ||||
|     require(!isPaused, Errors.VL_RESERVE_PAUSED); | ||||
|  | @ -371,12 +369,12 @@ library ValidationLogic { | |||
| 
 | ||||
|   /** | ||||
|    * @dev Validates the action of setting an asset as collateral | ||||
|    * @param reserve The state of the reserve that the user is enabling or disabling as collateral | ||||
|    * @param reserveCache The cached data of the reserve | ||||
|    */ | ||||
|   function validateSetUseReserveAsCollateral( | ||||
|     DataTypes.ReserveData storage reserve, | ||||
|     DataTypes.ReserveCache memory reserveCache | ||||
|   ) external view { | ||||
|   function validateSetUseReserveAsCollateral(DataTypes.ReserveCache memory reserveCache) | ||||
|     external | ||||
|     view | ||||
|   { | ||||
|     uint256 underlyingBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); | ||||
|     (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlagsMemory(); | ||||
| 
 | ||||
|  | @ -395,68 +393,88 @@ library ValidationLogic { | |||
|     address[] memory assets, | ||||
|     uint256[] memory amounts, | ||||
|     mapping(address => DataTypes.ReserveData) storage reservesData | ||||
|   ) external view { | ||||
|   ) internal view { | ||||
|     for (uint256 i = 0; i < assets.length; i++) { | ||||
|       require(!reservesData[assets[i]].configuration.getPaused(), Errors.VL_RESERVE_PAUSED); | ||||
|     } | ||||
|     require(assets.length == amounts.length, Errors.VL_INCONSISTENT_FLASHLOAN_PARAMS); | ||||
|   } | ||||
| 
 | ||||
|   struct ValidateLiquidationCallLocalVars { | ||||
|     uint256 healthFactor; | ||||
|     bool collateralReserveActive; | ||||
|     bool collateralReservePaused; | ||||
|     bool principalReserveActive; | ||||
|     bool principalReservePaused; | ||||
|     bool isCollateralEnabled; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * @dev Validates the liquidation action | ||||
|    * @param collateralReserve The reserve data of the collateral | ||||
|    * @param principalReserve The reserve data of the principal | ||||
|    * @param userConfig The user configuration | ||||
|    * @param userHealthFactor The user's health factor | ||||
|    * @param userStableDebt Total stable debt balance of the user | ||||
|    * @param userVariableDebt Total variable debt balance of the user | ||||
|    * @param totalDebt Total debt balance of the user | ||||
|    **/ | ||||
|   function validateLiquidationCall( | ||||
|     DataTypes.ReserveData storage collateralReserve, | ||||
|     DataTypes.ReserveData storage principalReserve, | ||||
|     DataTypes.ReserveCache memory collateralReserveCache, | ||||
|     DataTypes.ReserveCache memory principalReserveCache, | ||||
|     uint256 totalDebt, | ||||
|     address user, | ||||
|     mapping(address => DataTypes.ReserveData) storage reservesData, | ||||
|     DataTypes.UserConfigurationMap storage userConfig, | ||||
|     uint256 userHealthFactor, | ||||
|     uint256 userStableDebt, | ||||
|     uint256 userVariableDebt | ||||
|     mapping(uint256 => address) storage reserves, | ||||
|     uint256 reservesCount, | ||||
|     address oracle | ||||
|   ) internal view returns (uint256, string memory) { | ||||
|     (bool collateralReserveActive, , , , bool collateralReservePaused) = | ||||
|       collateralReserveCache.reserveConfiguration.getFlagsMemory(); | ||||
|     ValidateLiquidationCallLocalVars memory vars; | ||||
| 
 | ||||
|     (bool principalReserveActive, , , , bool principalReservePaused) = | ||||
|       collateralReserveCache.reserveConfiguration.getFlagsMemory(); | ||||
|     (vars.collateralReserveActive, , , , vars.collateralReservePaused) = collateralReserve | ||||
|       .configuration | ||||
|       .getFlagsMemory(); | ||||
| 
 | ||||
|     if (!collateralReserveActive || !principalReserveActive) { | ||||
|     (vars.principalReserveActive, , , , vars.principalReservePaused) = principalReserveCache | ||||
|       .reserveConfiguration | ||||
|       .getFlagsMemory(); | ||||
| 
 | ||||
|     if (!vars.collateralReserveActive || !vars.principalReserveActive) { | ||||
|       return ( | ||||
|         uint256(Errors.CollateralManagerErrors.NO_ACTIVE_RESERVE), | ||||
|         Errors.VL_NO_ACTIVE_RESERVE | ||||
|       ); | ||||
|     } | ||||
|     if (collateralReservePaused || principalReservePaused) { | ||||
|     if (vars.collateralReservePaused || vars.principalReservePaused) { | ||||
|       return (uint256(Errors.CollateralManagerErrors.PAUSED_RESERVE), Errors.VL_RESERVE_PAUSED); | ||||
|     } | ||||
| 
 | ||||
|     if (userHealthFactor >= GenericLogic.HEALTH_FACTOR_LIQUIDATION_THRESHOLD) { | ||||
|     (, , , , vars.healthFactor) = GenericLogic.calculateUserAccountData( | ||||
|       user, | ||||
|       reservesData, | ||||
|       userConfig, | ||||
|       reserves, | ||||
|       reservesCount, | ||||
|       oracle | ||||
|     ); | ||||
| 
 | ||||
|     if (vars.healthFactor >= GenericLogic.HEALTH_FACTOR_LIQUIDATION_THRESHOLD) { | ||||
|       return ( | ||||
|         uint256(Errors.CollateralManagerErrors.HEALTH_FACTOR_ABOVE_THRESHOLD), | ||||
|         Errors.LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     bool isCollateralEnabled = | ||||
|       collateralReserveCache.reserveConfiguration.getLiquidationThresholdMemory() > 0 && | ||||
|         userConfig.isUsingAsCollateral(collateralReserve.id); | ||||
|     vars.isCollateralEnabled = | ||||
|       collateralReserve.configuration.getLiquidationThreshold() > 0 && | ||||
|       userConfig.isUsingAsCollateral(collateralReserve.id); | ||||
| 
 | ||||
|     //if collateral isn't enabled as collateral by user, it cannot be liquidated | ||||
|     if (!isCollateralEnabled) { | ||||
|     if (!vars.isCollateralEnabled) { | ||||
|       return ( | ||||
|         uint256(Errors.CollateralManagerErrors.COLLATERAL_CANNOT_BE_LIQUIDATED), | ||||
|         Errors.LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     if (userStableDebt == 0 && userVariableDebt == 0) { | ||||
|     if (totalDebt == 0) { | ||||
|       return ( | ||||
|         uint256(Errors.CollateralManagerErrors.CURRRENCY_NOT_BORROWED), | ||||
|         Errors.LPCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER | ||||
|  | @ -482,7 +500,7 @@ library ValidationLogic { | |||
|     mapping(uint256 => address) storage reserves, | ||||
|     uint256 reservesCount, | ||||
|     address oracle | ||||
|   ) internal view { | ||||
|   ) external view { | ||||
|     (, , , , uint256 healthFactor) = | ||||
|       GenericLogic.calculateUserAccountData( | ||||
|         from, | ||||
|  |  | |||
|  | @ -188,7 +188,8 @@ export const deployAaveLibraries = async ( | |||
|   return { | ||||
|     ['__$de8c0cf1a7d7c36c802af9a64fb9d86036$__']: validationLogic.address, | ||||
|     ['__$22cd43a9dda9ce44e9b92ba393b88fb9ac$__']: reserveLogic.address, | ||||
|   }; | ||||
|     ["__$52a8a86ab43135662ff256bbc95497e8e3$__"]: genericLogic.address, | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| export const deployLendingPool = async (verify?: boolean) => { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 emilio
						emilio