From 948bd960be1bc345b2c54171271717039e0e076f Mon Sep 17 00:00:00 2001 From: The3D <frangellaemilio@gmail.com> Date: Mon, 28 Sep 2020 19:33:39 +0200 Subject: [PATCH] Initial commit --- .../lendingpool/LendingPoolConfigurator.sol | 87 ++++++++++--------- contracts/libraries/helpers/Errors.sol | 1 + test/configurator.spec.ts | 2 +- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/contracts/lendingpool/LendingPoolConfigurator.sol b/contracts/lendingpool/LendingPoolConfigurator.sol index 6bedff76..69b32cab 100644 --- a/contracts/lendingpool/LendingPoolConfigurator.sol +++ b/contracts/lendingpool/LendingPoolConfigurator.sol @@ -14,7 +14,7 @@ import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddresses import {ILendingPool} from '../interfaces/ILendingPool.sol'; import {IERC20Detailed} from '../interfaces/IERC20Detailed.sol'; import {Errors} from '../libraries/helpers/Errors.sol'; - +import {PercentageMath} from '../libraries/math/PercentageMath.sol'; /** * @title LendingPoolConfigurator contract * @author Aave @@ -56,25 +56,19 @@ contract LendingPoolConfigurator is VersionedInitializable { event BorrowingDisabledOnReserve(address indexed asset); /** - * @dev emitted when a reserve is enabled as collateral. + * @dev emitted when a a reserve collateralization risk parameters are updated. * @param asset the address 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 **/ - event ReserveEnabledAsCollateral( + event CollateralConfigurationChanged( address indexed asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus ); - /** - * @dev emitted when a reserve is disabled as collateral - * @param asset the address of the reserve - **/ - event ReserveDisabledAsCollateral(address indexed asset); - /** * @dev emitted when stable rate borrowing is enabled on a reserve * @param asset the address of the reserve @@ -326,41 +320,45 @@ contract LendingPoolConfigurator is VersionedInitializable { } /** - * @dev enables a reserve to be used as collateral + * @dev configures the reserve collateralization parameters * @param asset the address 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 **/ - function enableReserveAsCollateral( + function configureReserveAsCollateral( address asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus ) external onlyAaveAdmin { + ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); + //validation of the parameters: the LTV can + //only be lower or equal than the liquidation threshold + //(otherwise a loan against the asset would cause instantaneous liquidation) + require(ltv <= liquidationThreshold, Errors.INVALID_CONFIGURATION); + + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to repay the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_CONFIGURATION); + + + //if the liquidation threshold is being set to 0, + // the reserve is being disabled as collateral. To do so, + //we need to ensure no liquidity is deposited + if(liquidationThreshold == 0) { + _checkNoLiquidity(asset); + } + currentConfig.setLtv(ltv); currentConfig.setLiquidationThreshold(liquidationThreshold); currentConfig.setLiquidationBonus(liquidationBonus); pool.setConfiguration(asset, currentConfig.data); - emit ReserveEnabledAsCollateral(asset, ltv, liquidationThreshold, liquidationBonus); - } - - /** - * @dev disables a reserve as collateral - * @param asset the address of the reserve - **/ - function disableReserveAsCollateral(address asset) external onlyAaveAdmin { - ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); - - currentConfig.setLtv(0); - - pool.setConfiguration(asset, currentConfig.data); - - emit ReserveDisabledAsCollateral(asset); + emit CollateralConfigurationChanged(asset, ltv, liquidationThreshold, liquidationBonus); } /** @@ -410,22 +408,8 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve **/ function deactivateReserve(address asset) external onlyAaveAdmin { - ( - uint256 availableLiquidity, - uint256 totalStableDebt, - uint256 totalVariableDebt, - , - , - , - , - , - , - - ) = pool.getReserveData(asset); - require( - availableLiquidity == 0 && totalStableDebt == 0 && totalVariableDebt == 0, - Errors.RESERVE_LIQUIDITY_NOT_0 - ); + + _checkNoLiquidity(asset); ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); @@ -601,4 +585,23 @@ contract LendingPoolConfigurator is VersionedInitializable { function setPoolPause(bool val) external onlyAaveAdmin { pool.setPause(val); } + + function _checkNoLiquidity(address asset) internal view { + ( + uint256 availableLiquidity, + uint256 totalStableDebt, + uint256 totalVariableDebt, + , + , + , + , + , + , + + ) = pool.getReserveData(asset); + require( + availableLiquidity == 0 && totalStableDebt == 0 && totalVariableDebt == 0, + Errors.RESERVE_LIQUIDITY_NOT_0 + ); + } } diff --git a/contracts/libraries/helpers/Errors.sol b/contracts/libraries/helpers/Errors.sol index 48fc7f32..3488fdae 100644 --- a/contracts/libraries/helpers/Errors.sol +++ b/contracts/libraries/helpers/Errors.sol @@ -61,6 +61,7 @@ library Errors { //require error messages - LendingPoolConfiguration string public constant CALLER_NOT_AAVE_ADMIN = '35'; // 'The caller must be the aave admin' string public constant RESERVE_LIQUIDITY_NOT_0 = '36'; // 'The liquidity of the reserve needs to be 0' + string public constant INVALID_CONFIGURATION = '52'; // 'Invalid risk parameters for the reserve' //require error messages - LendingPoolAddressesProviderRegistry string public constant PROVIDER_NOT_REGISTERED = '37'; // 'Provider is not registered' diff --git a/test/configurator.spec.ts b/test/configurator.spec.ts index 0fa3289c..7baf6838 100644 --- a/test/configurator.spec.ts +++ b/test/configurator.spec.ts @@ -104,7 +104,7 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { it('Deactivates the ETH reserve as collateral', async () => { const {configurator, pool, weth} = testEnv; - await configurator.disableReserveAsCollateral(weth.address); + await configurator.configureReserveAsCollateral(weth.address, 0, 0, 0); const {usageAsCollateralEnabled} = await pool.getReserveConfigurationData(weth.address); expect(usageAsCollateralEnabled).to.be.equal(false); });