diff --git a/contracts/interfaces/ILendingPoolConfigurator.sol b/contracts/interfaces/ILendingPoolConfigurator.sol index fea5560c..4d8459ba 100644 --- a/contracts/interfaces/ILendingPoolConfigurator.sol +++ b/contracts/interfaces/ILendingPoolConfigurator.sol @@ -190,4 +190,130 @@ interface ILendingPoolConfigurator { address indexed proxy, address indexed implementation ); + + /** + * @dev Initializes reserves in batch + * @param input The array of reserves initialization parameters + **/ + function batchInitReserve(InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve + * @param input The aToken update paramenters + **/ + function updateAToken(UpdateATokenInput calldata input) external; + + /** + * @dev Updates the stable debt token implementation for the reserve + * @param input The stableDebtToken update parameters + **/ + function updateStableDebtToken(UpdateDebtTokenInput calldata input) external; + + /** + * @dev Updates the variable debt token implementation for the asset + * @param input The variableDebtToken update parameters + **/ + function updateVariableDebtToken(UpdateDebtTokenInput calldata input) external; + + /** + * @dev Enables borrowing on a reserve + * @param asset The address of the underlying asset of the reserve + * @param borrowCap The borrow cap for this specific asset, in absolute units of tokens + * @param stableBorrowRateEnabled True if stable borrow rate needs to be enabled by default on this reserve + **/ + function enableBorrowingOnReserve(address asset, uint256 borrowCap, bool stableBorrowRateEnabled) external; + + /** + * @dev Disables borrowing on a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function disableBorrowingOnReserve(address asset) external; + + /** + * @dev Configures the reserve collateralization parameters + * all the values are expressed in percentages with two decimals of precision. A valid value is 10000, which means 100.00% + * @param asset The address of the underlying asset of the reserve + * @param ltv The loan to value of the asset when used as collateral + * @param liquidationThreshold The threshold at which loans using this asset as collateral will be considered undercollateralized + * @param liquidationBonus The bonus liquidators receive to liquidate this asset. The values is always above 100%. A value of 105% + * means the liquidator will receive a 5% bonus + **/ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @dev Enable stable rate borrowing on a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function enableReserveStableRate(address asset) external; + + /** + * @dev Disable stable rate borrowing on a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function disableReserveStableRate(address asset) external; + + /** + * @dev Activates a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function activateReserve(address asset) external; + + /** + * @dev Deactivates a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function deactivateReserve(address asset) external; + + /** + * @dev Freezes a reserve. A frozen reserve doesn't allow any new deposit, borrow or rate swap + * but allows repayments, liquidations, rate rebalances and withdrawals + * @param asset The address of the underlying asset of the reserve + **/ + function freezeReserve(address asset) external; + + /** + * @dev Unfreezes a reserve + * @param asset The address of the underlying asset of the reserve + **/ + function unfreezeReserve(address asset) external; + + /** + * @dev Updates the reserve factor of a reserve + * @param asset The address of the underlying asset of the reserve + * @param reserveFactor The new reserve factor of the reserve + **/ + function setReserveFactor(address asset, uint256 reserveFactor) external; + + /** + * @dev Sets the interest rate strategy of a reserve + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The new address of the interest strategy contract + **/ + function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) + external; + + /** + * @dev pauses or unpauses all the actions of the protocol, including aToken transfers + * @param val true if protocol needs to be paused, false otherwise + **/ + function setPoolPause(bool val) external; + + /** + * @dev Updates the borrow cap of a reserve + * @param asset The address of the underlying asset of the reserve + * @param borrowCap The new borrow of the reserve + **/ + function setBorrowCap(address asset, uint256 borrowCap) external; + + /** + * @dev Updates the supply cap of a reserve + * @param asset The address of the underlying asset of the reserve + * @param supplyCap The new supply of the reserve + **/ + function setSupplyCap(address asset, uint256 supplyCap) external; } diff --git a/contracts/protocol/lendingpool/LendingPoolConfigurator.sol b/contracts/protocol/lendingpool/LendingPoolConfigurator.sol index 4b8662c7..5b517ad5 100644 --- a/contracts/protocol/lendingpool/LendingPoolConfigurator.sol +++ b/contracts/protocol/lendingpool/LendingPoolConfigurator.sol @@ -30,17 +30,17 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur using PercentageMath for uint256; using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - ILendingPoolAddressesProvider internal addressesProvider; - ILendingPool internal pool; + ILendingPoolAddressesProvider internal _addressesProvider; + ILendingPool internal _pool; modifier onlyPoolAdmin { - require(addressesProvider.getPoolAdmin() == msg.sender, Errors.CALLER_NOT_POOL_ADMIN); + require(_addressesProvider.getPoolAdmin() == msg.sender, Errors.CALLER_NOT_POOL_ADMIN); _; } modifier onlyEmergencyAdmin { require( - addressesProvider.getEmergencyAdmin() == msg.sender, + _addressesProvider.getEmergencyAdmin() == msg.sender, Errors.LPC_CALLER_NOT_EMERGENCY_ADMIN ); _; @@ -53,15 +53,13 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur } function initialize(ILendingPoolAddressesProvider provider) public initializer { - addressesProvider = provider; - pool = ILendingPool(addressesProvider.getLendingPool()); + _addressesProvider = provider; + _pool = ILendingPool(_addressesProvider.getLendingPool()); } - /** - * @dev Initializes reserves in batch - **/ - function batchInitReserve(InitReserveInput[] calldata input) external onlyPoolAdmin { - ILendingPool cachedPool = pool; + /// @inheritdoc ILendingPoolConfigurator + function batchInitReserve(InitReserveInput[] calldata input) external override onlyPoolAdmin { + ILendingPool cachedPool = _pool; for (uint256 i = 0; i < input.length; i++) { _initReserve(cachedPool, input[i]); } @@ -141,11 +139,9 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur ); } - /** - * @dev Updates the aToken implementation for the reserve - **/ - function updateAToken(UpdateATokenInput calldata input) external onlyPoolAdmin { - ILendingPool cachedPool = pool; + /// @inheritdoc ILendingPoolConfigurator + function updateAToken(UpdateATokenInput calldata input) external override onlyPoolAdmin { + ILendingPool cachedPool = _pool; DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); @@ -169,11 +165,13 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); } - /** - * @dev Updates the stable debt token implementation for the reserve - **/ - function updateStableDebtToken(UpdateDebtTokenInput calldata input) external onlyPoolAdmin { - ILendingPool cachedPool = pool; + /// @inheritdoc ILendingPoolConfigurator + function updateStableDebtToken(UpdateDebtTokenInput calldata input) + external + override + onlyPoolAdmin + { + ILendingPool cachedPool = _pool; DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); @@ -204,11 +202,13 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur ); } - /** - * @dev Updates the variable debt token implementation for the asset - **/ - function updateVariableDebtToken(UpdateDebtTokenInput calldata input) external onlyPoolAdmin { - ILendingPool cachedPool = pool; + /// @inheritdoc ILendingPoolConfigurator + function updateVariableDebtToken(UpdateDebtTokenInput calldata input) + external + override + onlyPoolAdmin + { + ILendingPool cachedPool = _pool; DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); @@ -239,57 +239,42 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur ); } - /** - * @dev Enables borrowing on a reserve - * @param asset The address of the underlying asset of the reserve - * @param stableBorrowRateEnabled True if stable borrow rate needs to be enabled by default on this reserve - **/ + /// @inheritdoc ILendingPoolConfigurator function enableBorrowingOnReserve( address asset, uint256 borrowCap, bool stableBorrowRateEnabled - ) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + ) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setBorrowingEnabled(true); currentConfig.setBorrowCap(borrowCap); currentConfig.setStableRateBorrowingEnabled(stableBorrowRateEnabled); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit BorrowCapChanged(asset, borrowCap); emit BorrowingEnabledOnReserve(asset, stableBorrowRateEnabled); } - /** - * @dev Disables borrowing on a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function disableBorrowingOnReserve(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function disableBorrowingOnReserve(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setBorrowingEnabled(false); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit BorrowingDisabledOnReserve(asset); } - /** - * @dev Configures the reserve collateralization parameters - * all the values are expressed in percentages with two decimals of precision. A valid value is 10000, which means 100.00% - * @param asset The address of the underlying asset of the reserve - * @param ltv The loan to value of the asset when used as collateral - * @param liquidationThreshold The threshold at which loans using this asset as collateral will be considered undercollateralized - * @param liquidationBonus The bonus liquidators receive to liquidate this asset. The values is always above 100%. A value of 105% - * means the liquidator will receive a 5% bonus - **/ + /// @inheritdoc ILendingPoolConfigurator function configureReserveAsCollateral( address asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus - ) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + ) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); //validation of the parameters: the LTV can //only be lower or equal than the liquidation threshold @@ -322,139 +307,108 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur currentConfig.setLiquidationThreshold(liquidationThreshold); currentConfig.setLiquidationBonus(liquidationBonus); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit CollateralConfigurationChanged(asset, ltv, liquidationThreshold, liquidationBonus); } - /** - * @dev Enable stable rate borrowing on a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function enableReserveStableRate(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function enableReserveStableRate(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setStableRateBorrowingEnabled(true); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit StableRateEnabledOnReserve(asset); } - /** - * @dev Disable stable rate borrowing on a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function disableReserveStableRate(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function disableReserveStableRate(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setStableRateBorrowingEnabled(false); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit StableRateDisabledOnReserve(asset); } - /** - * @dev Activates a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function activateReserve(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function activateReserve(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setActive(true); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit ReserveActivated(asset); } - /** - * @dev Deactivates a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function deactivateReserve(address asset) external onlyPoolAdmin { + /// @inheritdoc ILendingPoolConfigurator + function deactivateReserve(address asset) external override onlyPoolAdmin { _checkNoLiquidity(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setActive(false); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit ReserveDeactivated(asset); } - /** - * @dev Freezes a reserve. A frozen reserve doesn't allow any new deposit, borrow or rate swap - * but allows repayments, liquidations, rate rebalances and withdrawals - * @param asset The address of the underlying asset of the reserve - **/ - function freezeReserve(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function freezeReserve(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setFrozen(true); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit ReserveFrozen(asset); } - /** - * @dev Unfreezes a reserve - * @param asset The address of the underlying asset of the reserve - **/ - function unfreezeReserve(address asset) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function unfreezeReserve(address asset) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setFrozen(false); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit ReserveUnfrozen(asset); } - /** - * @dev Updates the reserve factor of a reserve - * @param asset The address of the underlying asset of the reserve - * @param reserveFactor The new reserve factor of the reserve - **/ - function setReserveFactor(address asset, uint256 reserveFactor) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + /// @inheritdoc ILendingPoolConfigurator + function setReserveFactor(address asset, uint256 reserveFactor) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setReserveFactor(reserveFactor); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit ReserveFactorChanged(asset, reserveFactor); } - /** - * @dev Updates the borrow cap of a reserve - * @param asset The address of the underlying asset of the reserve - * @param borrowCap The new borrow of the reserve - **/ - function setBorrowCap(address asset, uint256 borrowCap) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + ///@inheritdoc ILendingPoolConfigurator + function setBorrowCap(address asset, uint256 borrowCap) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setBorrowCap(borrowCap); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit BorrowCapChanged(asset, borrowCap); } - /** - * @dev Updates the supply cap of a reserve - * @param asset The address of the underlying asset of the reserve - * @param supplyCap The new supply of the reserve - **/ - function setSupplyCap(address asset, uint256 supplyCap) external onlyPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = pool.getConfiguration(asset); + ///@inheritdoc ILendingPoolConfigurator + function setSupplyCap(address asset, uint256 supplyCap) external override onlyPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); currentConfig.setSupplyCap(supplyCap); - pool.setConfiguration(asset, currentConfig.data); + _pool.setConfiguration(asset, currentConfig.data); emit SupplyCapChanged(asset, supplyCap); } @@ -466,18 +420,16 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur **/ function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) external + override onlyPoolAdmin { - pool.setReserveInterestRateStrategyAddress(asset, rateStrategyAddress); + _pool.setReserveInterestRateStrategyAddress(asset, rateStrategyAddress); emit ReserveInterestRateStrategyChanged(asset, rateStrategyAddress); } - /** - * @dev pauses or unpauses all the actions of the protocol, including aToken transfers - * @param val true if protocol needs to be paused, false otherwise - **/ - function setPoolPause(bool val) external onlyEmergencyAdmin { - pool.setPause(val); + /// @inheritdoc ILendingPoolConfigurator + function setPoolPause(bool val) external override onlyEmergencyAdmin { + _pool.setPause(val); } function _initTokenWithProxy(address implementation, bytes memory initParams) @@ -504,7 +456,7 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur } function _checkNoLiquidity(address asset) internal view { - DataTypes.ReserveData memory reserveData = pool.getReserveData(asset); + DataTypes.ReserveData memory reserveData = _pool.getReserveData(asset); uint256 availableLiquidity = IERC20Detailed(asset).balanceOf(reserveData.aTokenAddress);