From 2019b5f500b2c1ef8bc076a6b8331a4258d7a36d Mon Sep 17 00:00:00 2001 From: Hadrien Charlanes Date: Mon, 10 May 2021 10:01:50 +0200 Subject: [PATCH] feat: implemented pause validation for reserve assets --- .../protocol/lendingpool/LendingPool.sol | 3 +- .../protocol/libraries/helpers/Errors.sol | 3 +- .../libraries/logic/ValidationLogic.sol | 50 ++++++++++++------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/contracts/protocol/lendingpool/LendingPool.sol b/contracts/protocol/lendingpool/LendingPool.sol index f61826f0..ad7f8948 100644 --- a/contracts/protocol/lendingpool/LendingPool.sol +++ b/contracts/protocol/lendingpool/LendingPool.sol @@ -465,7 +465,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage ) external override whenNotPaused { FlashLoanLocalVars memory vars; - ValidationLogic.validateFlashloan(assets, amounts); + ValidationLogic.validateFlashloan(assets, amounts, _reserves); address[] memory aTokenAddresses = new address[](assets.length); uint256[] memory premiums = new uint256[](assets.length); @@ -728,6 +728,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (fromConfig.isUsingAsCollateral(reserveId)) { if (fromConfig.isBorrowingAny()) { ValidationLogic.validateHealthFactor( + asset, from, _reserves, _usersConfig[from], diff --git a/contracts/protocol/libraries/helpers/Errors.sol b/contracts/protocol/libraries/helpers/Errors.sol index 9fa7e96e..2b6f015a 100644 --- a/contracts/protocol/libraries/helpers/Errors.sol +++ b/contracts/protocol/libraries/helpers/Errors.sol @@ -119,6 +119,7 @@ library Errors { NO_ACTIVE_RESERVE, HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD, INVALID_EQUAL_ASSETS_TO_SWAP, - FROZEN_RESERVE + FROZEN_RESERVE, + PAUSED_RESERVE } } diff --git a/contracts/protocol/libraries/logic/ValidationLogic.sol b/contracts/protocol/libraries/logic/ValidationLogic.sol index 177300b7..7e410dea 100644 --- a/contracts/protocol/libraries/logic/ValidationLogic.sol +++ b/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -40,19 +40,15 @@ library ValidationLogic { * @param reserve The reserve object on which the user is depositing * @param amount The amount to be deposited */ -<<<<<<< HEAD function validateDeposit(DataTypes.ReserveData storage reserve, uint256 amount) internal view { DataTypes.ReserveConfigurationMap memory reserveConfiguration = reserve.configuration; - (bool isActive, bool isFrozen, , ) = reserveConfiguration.getFlagsMemory(); + (bool isActive, bool isFrozen, , bool isPaused) = reserveConfiguration.getFlagsMemory(); (, , , uint256 reserveDecimals, ) = reserveConfiguration.getParamsMemory(); uint256 supplyCap = reserveConfiguration.getSupplyCapMemory(); -======= - function validateDeposit(DataTypes.ReserveData storage reserve, uint256 amount) external view { - (bool isActive, bool isFrozen, , , ) = reserve.configuration.getFlags(); ->>>>>>> 2e1af3c (feat: added bool isPaused in data reserve config) require(amount != 0, Errors.VL_INVALID_AMOUNT); require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require(!isPaused, Errors.VL_RESERVE_PAUSED); require(!isFrozen, Errors.VL_RESERVE_FROZEN); require( supplyCap == 0 || @@ -76,8 +72,9 @@ library ValidationLogic { require(amount != 0, Errors.VL_INVALID_AMOUNT); require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); - (bool isActive, , , , ) = reservesData[reserveAddress].configuration.getFlags(); + (bool isActive, , , , bool isPaused) = reservesData[reserveAddress].configuration.getFlags(); require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require(!isPaused, Errors.VL_RESERVE_PAUSED); } struct ValidateBorrowLocalVars { @@ -130,7 +127,6 @@ library ValidationLogic { ) internal view { ValidateBorrowLocalVars memory vars; -<<<<<<< HEAD DataTypes.ReserveConfigurationMap memory reserveConfiguration = reserve.configuration; (, , , vars.reserveDecimals, ) = reserveConfiguration.getParamsMemory(); @@ -138,13 +134,9 @@ library ValidationLogic { vars.isActive, vars.isFrozen, vars.borrowingEnabled, - vars.stableRateBorrowingEnabled + vars.stableRateBorrowingEnabled, + vars.isPaused ) = reserveConfiguration.getFlagsMemory(); -======= - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.stableRateBorrowingEnabled, vars.isPaused) = reserve - .configuration - .getFlags(); ->>>>>>> 2e1af3c (feat: added bool isPaused in data reserve config) require(vars.isActive, Errors.VL_NO_ACTIVE_RESERVE); require(!vars.isPaused, Errors.VL_RESERVE_PAUSED); @@ -251,9 +243,9 @@ library ValidationLogic { uint256 stableDebt, uint256 variableDebt ) external view { - bool isActive = reserve.configuration.getActive(); - + (bool isActive, , , , bool isPaused) = reserve.configuration.getFlags(); require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require(!isPaused, Errors.VL_RESERVE_PAUSED); require(amountSent > 0, Errors.VL_INVALID_AMOUNT); @@ -363,6 +355,9 @@ library ValidationLogic { */ function validateSetUseReserveAsCollateral(DataTypes.ReserveData storage reserve) external view { uint256 underlyingBalance = IERC20(reserve.aTokenAddress).balanceOf(msg.sender); + bool isPaused = reserve.configuration.getPaused(); + + require(!isPaused, Errors.VL_RESERVE_PAUSED); require(underlyingBalance > 0, Errors.VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0); } @@ -372,7 +367,17 @@ library ValidationLogic { * @param assets The assets being flashborrowed * @param amounts The amounts for each asset being borrowed **/ - function validateFlashloan(address[] memory assets, uint256[] memory amounts) external pure { + function validateFlashloan( + address[] memory assets, + uint256[] memory amounts, + mapping(address => DataTypes.ReserveData) storage reservesData + ) external view { + for (uint 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); } @@ -401,6 +406,14 @@ library ValidationLogic { Errors.VL_NO_ACTIVE_RESERVE ); } + if ( + collateralReserve.configuration.getPaused() || principalReserve.configuration.getPaused() + ) { + return ( + uint256(Errors.CollateralManagerErrors.PAUSED_RESERVE), + Errors.VL_RESERVE_PAUSED + ); + } if (userHealthFactor >= GenericLogic.HEALTH_FACTOR_LIQUIDATION_THRESHOLD) { return ( @@ -441,6 +454,7 @@ library ValidationLogic { * @param oracle The price oracle */ function validateHealthFactor( + address reserveAddress, address from, mapping(address => DataTypes.ReserveData) storage reservesData, DataTypes.UserConfigurationMap storage userConfig, @@ -448,6 +462,8 @@ library ValidationLogic { uint256 reservesCount, address oracle ) internal view { + bool isPaused = reservesData[reserveAddress].configuration.getPaused(); + require(!isPaused, Errors.VL_RESERVE_PAUSED); (, , , , uint256 healthFactor) = GenericLogic.calculateUserAccountData( from,