LCOV - code coverage report
Current view: top level - protocol/pool - PoolConfigurator.sol (source / functions) Coverage Total Hit
Test: lcov.info.p Lines: 100.0 % 190 190
Test Date: 2024-09-24 09:34:24 Functions: 100.0 % 43 43
Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: BUSL-1.1
       2                 :             : pragma solidity ^0.8.10;
       3                 :             : 
       4                 :             : import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol';
       5                 :             : import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol';
       6                 :             : import {EModeConfiguration} from '../libraries/configuration/EModeConfiguration.sol';
       7                 :             : import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol';
       8                 :             : import {IDefaultInterestRateStrategyV2} from '../../interfaces/IDefaultInterestRateStrategyV2.sol';
       9                 :             : import {Errors} from '../libraries/helpers/Errors.sol';
      10                 :             : import {PercentageMath} from '../libraries/math/PercentageMath.sol';
      11                 :             : import {DataTypes} from '../libraries/types/DataTypes.sol';
      12                 :             : import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol';
      13                 :             : import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol';
      14                 :             : import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol';
      15                 :             : import {IPool} from '../../interfaces/IPool.sol';
      16                 :             : import {IACLManager} from '../../interfaces/IACLManager.sol';
      17                 :             : import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol';
      18                 :             : import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol';
      19                 :             : import {IERC20Detailed} from '../../dependencies/openzeppelin/contracts/IERC20Detailed.sol';
      20                 :             : 
      21                 :             : /**
      22                 :             :  * @title PoolConfigurator
      23                 :             :  * @author Aave
      24                 :             :  * @dev Implements the configuration methods for the Aave protocol
      25                 :             :  */
      26                 :             : abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator {
      27                 :             :   using PercentageMath for uint256;
      28                 :             :   using ReserveConfiguration for DataTypes.ReserveConfigurationMap;
      29                 :             : 
      30                 :             :   IPoolAddressesProvider internal _addressesProvider;
      31                 :             :   IPool internal _pool;
      32                 :             : 
      33                 :             :   mapping(address => uint256) internal _pendingLtv;
      34                 :             : 
      35                 :             :   uint40 public constant MAX_GRACE_PERIOD = 4 hours;
      36                 :             : 
      37                 :             :   /**
      38                 :             :    * @dev Only pool admin can call functions marked by this modifier.
      39                 :             :    */
      40                 :             :   modifier onlyPoolAdmin() {
      41                 :        1682 :     _onlyPoolAdmin();
      42                 :             :     _;
      43                 :             :   }
      44                 :             : 
      45                 :             :   /**
      46                 :             :    * @dev Only emergency or pool admin can call functions marked by this modifier.
      47                 :             :    */
      48                 :             :   modifier onlyEmergencyOrPoolAdmin() {
      49                 :        2003 :     _onlyPoolOrEmergencyAdmin();
      50                 :             :     _;
      51                 :             :   }
      52                 :             : 
      53                 :             :   /**
      54                 :             :    * @dev Only asset listing or pool admin can call functions marked by this modifier.
      55                 :             :    */
      56                 :             :   modifier onlyAssetListingOrPoolAdmins() {
      57                 :        8651 :     _onlyAssetListingOrPoolAdmins();
      58                 :             :     _;
      59                 :             :   }
      60                 :             : 
      61                 :             :   /**
      62                 :             :    * @dev Only risk or pool admin can call functions marked by this modifier.
      63                 :             :    */
      64                 :             :   modifier onlyRiskOrPoolAdmins() {
      65                 :        7010 :     _onlyRiskOrPoolAdmins();
      66                 :             :     _;
      67                 :             :   }
      68                 :             : 
      69                 :             :   /**
      70                 :             :    * @dev Only risk, pool or emergency admin can call functions marked by this modifier.
      71                 :             :    */
      72                 :             :   modifier onlyRiskOrPoolOrEmergencyAdmins() {
      73                 :        3014 :     _onlyRiskOrPoolOrEmergencyAdmins();
      74                 :             :     _;
      75                 :             :   }
      76                 :             : 
      77                 :             :   function initialize(IPoolAddressesProvider provider) public virtual;
      78                 :             : 
      79                 :             :   /// @inheritdoc IPoolConfigurator
      80                 :             :   function initReserves(
      81                 :             :     ConfiguratorInputTypes.InitReserveInput[] calldata input
      82                 :             :   ) external override onlyAssetListingOrPoolAdmins {
      83                 :        7651 :     IPool cachedPool = _pool;
      84                 :             : 
      85                 :        7651 :     for (uint256 i = 0; i < input.length; i++) {
      86                 :      167016 :       ConfiguratorLogic.executeInitReserve(cachedPool, input[i]);
      87                 :      165016 :       emit ReserveInterestRateDataChanged(
      88                 :             :         input[i].underlyingAsset,
      89                 :             :         input[i].interestRateStrategyAddress,
      90                 :             :         input[i].interestRateData
      91                 :             :       );
      92                 :             :     }
      93                 :             :   }
      94                 :             : 
      95                 :             :   /// @inheritdoc IPoolConfigurator
      96                 :             :   function dropReserve(address asset) external override onlyPoolAdmin {
      97                 :           5 :     _pool.dropReserve(asset);
      98                 :           1 :     emit ReserveDropped(asset);
      99                 :             :   }
     100                 :             : 
     101                 :             :   /// @inheritdoc IPoolConfigurator
     102                 :             :   function updateAToken(
     103                 :             :     ConfiguratorInputTypes.UpdateATokenInput calldata input
     104                 :             :   ) external override onlyPoolAdmin {
     105                 :           1 :     ConfiguratorLogic.executeUpdateAToken(_pool, input);
     106                 :             :   }
     107                 :             : 
     108                 :             :   /// @inheritdoc IPoolConfigurator
     109                 :             :   function updateVariableDebtToken(
     110                 :             :     ConfiguratorInputTypes.UpdateDebtTokenInput calldata input
     111                 :             :   ) external override onlyPoolAdmin {
     112                 :           1 :     ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input);
     113                 :             :   }
     114                 :             : 
     115                 :             :   /// @inheritdoc IPoolConfigurator
     116                 :             :   function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins {
     117                 :        4947 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     118                 :        4947 :     currentConfig.setBorrowingEnabled(enabled);
     119                 :        4947 :     _pool.setConfiguration(asset, currentConfig);
     120                 :        4947 :     emit ReserveBorrowing(asset, enabled);
     121                 :             :   }
     122                 :             : 
     123                 :             :   /// @inheritdoc IPoolConfigurator
     124                 :             :   function configureReserveAsCollateral(
     125                 :             :     address asset,
     126                 :             :     uint256 ltv,
     127                 :             :     uint256 liquidationThreshold,
     128                 :             :     uint256 liquidationBonus
     129                 :             :   ) external override onlyRiskOrPoolAdmins {
     130                 :             :     //validation of the parameters: the LTV can
     131                 :             :     //only be lower or equal than the liquidation threshold
     132                 :             :     //(otherwise a loan against the asset would cause instantaneous liquidation)
     133                 :        9952 :     require(ltv <= liquidationThreshold, Errors.INVALID_RESERVE_PARAMS);
     134                 :             : 
     135                 :        7952 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     136                 :             : 
     137                 :        7952 :     if (liquidationThreshold != 0) {
     138                 :             :       //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less
     139                 :             :       //collateral than needed to cover the debt
     140                 :        6951 :       require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS);
     141                 :             : 
     142                 :             :       //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment
     143                 :             :       //a loan is taken there is enough collateral available to cover the liquidation bonus
     144                 :        5951 :       require(
     145                 :             :         liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR,
     146                 :             :         Errors.INVALID_RESERVE_PARAMS
     147                 :             :       );
     148                 :             :     } else {
     149                 :        1001 :       require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS);
     150                 :             :       //if the liquidation threshold is being set to 0,
     151                 :             :       // the reserve is being disabled as collateral. To do so,
     152                 :             :       //we need to ensure no liquidity is supplied
     153                 :        1001 :       _checkNoSuppliers(asset);
     154                 :             :     }
     155                 :             : 
     156                 :        4952 :     uint256 newLtv = ltv;
     157                 :             : 
     158                 :        4952 :     if (currentConfig.getFrozen()) {
     159                 :        1000 :       _pendingLtv[asset] = ltv;
     160                 :        1000 :       newLtv = 0;
     161                 :             : 
     162                 :        1000 :       emit PendingLtvChanged(asset, ltv);
     163                 :             :     } else {
     164                 :        3952 :       currentConfig.setLtv(ltv);
     165                 :             :     }
     166                 :             : 
     167                 :        4952 :     currentConfig.setLiquidationThreshold(liquidationThreshold);
     168                 :        4952 :     currentConfig.setLiquidationBonus(liquidationBonus);
     169                 :             : 
     170                 :        4952 :     _pool.setConfiguration(asset, currentConfig);
     171                 :             : 
     172                 :        4952 :     emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus);
     173                 :             :   }
     174                 :             : 
     175                 :             :   /// @inheritdoc IPoolConfigurator
     176                 :             :   function setReserveFlashLoaning(
     177                 :             :     address asset,
     178                 :             :     bool enabled
     179                 :             :   ) external override onlyRiskOrPoolAdmins {
     180                 :        3948 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     181                 :             : 
     182                 :        3948 :     currentConfig.setFlashLoanEnabled(enabled);
     183                 :        3948 :     _pool.setConfiguration(asset, currentConfig);
     184                 :        3948 :     emit ReserveFlashLoaning(asset, enabled);
     185                 :             :   }
     186                 :             : 
     187                 :             :   /// @inheritdoc IPoolConfigurator
     188                 :             :   function setReserveActive(address asset, bool active) external override onlyPoolAdmin {
     189                 :          11 :     if (!active) _checkNoSuppliers(asset);
     190                 :          10 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     191                 :          10 :     currentConfig.setActive(active);
     192                 :          10 :     _pool.setConfiguration(asset, currentConfig);
     193                 :          10 :     emit ReserveActive(asset, active);
     194                 :             :   }
     195                 :             : 
     196                 :             :   /// @inheritdoc IPoolConfigurator
     197                 :             :   function setReserveFreeze(
     198                 :             :     address asset,
     199                 :             :     bool freeze
     200                 :             :   ) external override onlyRiskOrPoolOrEmergencyAdmins {
     201                 :        2014 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     202                 :             : 
     203                 :        2014 :     require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE);
     204                 :             : 
     205                 :        2012 :     currentConfig.setFrozen(freeze);
     206                 :             : 
     207                 :        2012 :     uint256 ltvSet;
     208                 :        2012 :     uint256 pendingLtvSet;
     209                 :             : 
     210                 :        2012 :     if (freeze) {
     211                 :        1010 :       pendingLtvSet = currentConfig.getLtv();
     212                 :        1010 :       _pendingLtv[asset] = pendingLtvSet;
     213                 :        1010 :       currentConfig.setLtv(0);
     214                 :             :     } else {
     215                 :        1002 :       ltvSet = _pendingLtv[asset];
     216                 :        1002 :       currentConfig.setLtv(ltvSet);
     217                 :        1002 :       delete _pendingLtv[asset];
     218                 :             :     }
     219                 :             : 
     220                 :        2012 :     emit PendingLtvChanged(asset, pendingLtvSet);
     221                 :        2012 :     emit CollateralConfigurationChanged(
     222                 :             :       asset,
     223                 :             :       ltvSet,
     224                 :             :       currentConfig.getLiquidationThreshold(),
     225                 :             :       currentConfig.getLiquidationBonus()
     226                 :             :     );
     227                 :             : 
     228                 :        2012 :     _pool.setConfiguration(asset, currentConfig);
     229                 :        2012 :     emit ReserveFrozen(asset, freeze);
     230                 :             :   }
     231                 :             : 
     232                 :             :   /// @inheritdoc IPoolConfigurator
     233                 :             :   function setBorrowableInIsolation(
     234                 :             :     address asset,
     235                 :             :     bool borrowable
     236                 :             :   ) external override onlyRiskOrPoolAdmins {
     237                 :        1959 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     238                 :        1959 :     currentConfig.setBorrowableInIsolation(borrowable);
     239                 :        1959 :     _pool.setConfiguration(asset, currentConfig);
     240                 :        1959 :     emit BorrowableInIsolationChanged(asset, borrowable);
     241                 :             :   }
     242                 :             : 
     243                 :             :   /// @inheritdoc IPoolConfigurator
     244                 :             :   function setReservePause(
     245                 :             :     address asset,
     246                 :             :     bool paused,
     247                 :             :     uint40 gracePeriod
     248                 :             :   ) public override onlyEmergencyOrPoolAdmin {
     249                 :       14022 :     if (!paused && gracePeriod != 0) {
     250                 :       10411 :       require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD);
     251                 :             : 
     252                 :        9411 :       uint40 until = uint40(block.timestamp) + gracePeriod;
     253                 :        9411 :       _pool.setLiquidationGracePeriod(asset, until);
     254                 :        9411 :       emit LiquidationGracePeriodChanged(asset, until);
     255                 :             :     }
     256                 :             : 
     257                 :       13022 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     258                 :       13022 :     currentConfig.setPaused(paused);
     259                 :       13022 :     _pool.setConfiguration(asset, currentConfig);
     260                 :       13022 :     emit ReservePaused(asset, paused);
     261                 :             :   }
     262                 :             : 
     263                 :             :   /// @inheritdoc IPoolConfigurator
     264                 :             :   function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin {
     265                 :        1001 :     setReservePause(asset, paused, 0);
     266                 :             :   }
     267                 :             : 
     268                 :             :   /// @inheritdoc IPoolConfigurator
     269                 :             :   function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin {
     270                 :             :     // set the liquidation grace period in the past to disable liquidation grace period
     271                 :        1001 :     _pool.setLiquidationGracePeriod(asset, 0);
     272                 :             : 
     273                 :        1001 :     emit LiquidationGracePeriodDisabled(asset);
     274                 :             :   }
     275                 :             : 
     276                 :             :   /// @inheritdoc IPoolConfigurator
     277                 :             :   function setReserveFactor(
     278                 :             :     address asset,
     279                 :             :     uint256 newReserveFactor
     280                 :             :   ) external override onlyRiskOrPoolAdmins {
     281                 :        1949 :     require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR);
     282                 :             : 
     283                 :        1948 :     _pool.syncIndexesState(asset);
     284                 :             : 
     285                 :        1948 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     286                 :        1948 :     uint256 oldReserveFactor = currentConfig.getReserveFactor();
     287                 :        1948 :     currentConfig.setReserveFactor(newReserveFactor);
     288                 :        1948 :     _pool.setConfiguration(asset, currentConfig);
     289                 :        1948 :     emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor);
     290                 :             : 
     291                 :        1948 :     _pool.syncRatesState(asset);
     292                 :             :   }
     293                 :             : 
     294                 :             :   /// @inheritdoc IPoolConfigurator
     295                 :             :   function setDebtCeiling(
     296                 :             :     address asset,
     297                 :             :     uint256 newDebtCeiling
     298                 :             :   ) external override onlyRiskOrPoolAdmins {
     299                 :        1964 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     300                 :             : 
     301                 :        1964 :     uint256 oldDebtCeiling = currentConfig.getDebtCeiling();
     302                 :        1964 :     if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) {
     303                 :        1960 :       _checkNoSuppliers(asset);
     304                 :             :     }
     305                 :        1963 :     currentConfig.setDebtCeiling(newDebtCeiling);
     306                 :        1963 :     _pool.setConfiguration(asset, currentConfig);
     307                 :             : 
     308                 :        1963 :     if (newDebtCeiling == 0) {
     309                 :        1949 :       _pool.resetIsolationModeTotalDebt(asset);
     310                 :             :     }
     311                 :             : 
     312                 :        1963 :     emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling);
     313                 :             :   }
     314                 :             : 
     315                 :             :   /// @inheritdoc IPoolConfigurator
     316                 :             :   function setSiloedBorrowing(
     317                 :             :     address asset,
     318                 :             :     bool newSiloed
     319                 :             :   ) external override onlyRiskOrPoolAdmins {
     320                 :        1949 :     if (newSiloed) {
     321                 :           3 :       _checkNoBorrowers(asset);
     322                 :             :     }
     323                 :        1948 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     324                 :             : 
     325                 :        1948 :     bool oldSiloed = currentConfig.getSiloedBorrowing();
     326                 :             : 
     327                 :        1948 :     currentConfig.setSiloedBorrowing(newSiloed);
     328                 :             : 
     329                 :        1948 :     _pool.setConfiguration(asset, currentConfig);
     330                 :             : 
     331                 :        1948 :     emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed);
     332                 :             :   }
     333                 :             : 
     334                 :             :   /// @inheritdoc IPoolConfigurator
     335                 :             :   function setBorrowCap(
     336                 :             :     address asset,
     337                 :             :     uint256 newBorrowCap
     338                 :             :   ) external override onlyRiskOrPoolAdmins {
     339                 :        1956 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     340                 :        1956 :     uint256 oldBorrowCap = currentConfig.getBorrowCap();
     341                 :        1956 :     currentConfig.setBorrowCap(newBorrowCap);
     342                 :        1955 :     _pool.setConfiguration(asset, currentConfig);
     343                 :        1955 :     emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap);
     344                 :             :   }
     345                 :             : 
     346                 :             :   /// @inheritdoc IPoolConfigurator
     347                 :             :   function setSupplyCap(
     348                 :             :     address asset,
     349                 :             :     uint256 newSupplyCap
     350                 :             :   ) external override onlyRiskOrPoolAdmins {
     351                 :        2962 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     352                 :        2962 :     uint256 oldSupplyCap = currentConfig.getSupplyCap();
     353                 :        2962 :     currentConfig.setSupplyCap(newSupplyCap);
     354                 :        2961 :     _pool.setConfiguration(asset, currentConfig);
     355                 :        2961 :     emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap);
     356                 :             :   }
     357                 :             : 
     358                 :             :   /// @inheritdoc IPoolConfigurator
     359                 :             :   function setLiquidationProtocolFee(
     360                 :             :     address asset,
     361                 :             :     uint256 newFee
     362                 :             :   ) external override onlyRiskOrPoolAdmins {
     363                 :        1953 :     require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE);
     364                 :        1951 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     365                 :        1951 :     uint256 oldFee = currentConfig.getLiquidationProtocolFee();
     366                 :        1951 :     currentConfig.setLiquidationProtocolFee(newFee);
     367                 :        1951 :     _pool.setConfiguration(asset, currentConfig);
     368                 :        1951 :     emit LiquidationProtocolFeeChanged(asset, oldFee, newFee);
     369                 :             :   }
     370                 :             : 
     371                 :             :   /// @inheritdoc IPoolConfigurator
     372                 :             :   function setEModeCategory(
     373                 :             :     uint8 categoryId,
     374                 :             :     uint16 ltv,
     375                 :             :     uint16 liquidationThreshold,
     376                 :             :     uint16 liquidationBonus,
     377                 :             :     string calldata label
     378                 :             :   ) external override onlyRiskOrPoolAdmins {
     379                 :       10035 :     require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS);
     380                 :       10034 :     require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS);
     381                 :             : 
     382                 :             :     // validation of the parameters: the LTV can
     383                 :             :     // only be lower or equal than the liquidation threshold
     384                 :             :     // (otherwise a loan against the asset would cause instantaneous liquidation)
     385                 :       10033 :     require(ltv <= liquidationThreshold, Errors.INVALID_EMODE_CATEGORY_PARAMS);
     386                 :       10032 :     require(
     387                 :             :       liquidationBonus > PercentageMath.PERCENTAGE_FACTOR,
     388                 :             :       Errors.INVALID_EMODE_CATEGORY_PARAMS
     389                 :             :     );
     390                 :             : 
     391                 :             :     // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment
     392                 :             :     // a loan is taken there is enough collateral available to cover the liquidation bonus
     393                 :       10030 :     require(
     394                 :             :       uint256(liquidationThreshold).percentMul(liquidationBonus) <=
     395                 :             :         PercentageMath.PERCENTAGE_FACTOR,
     396                 :             :       Errors.INVALID_EMODE_CATEGORY_PARAMS
     397                 :             :     );
     398                 :             : 
     399                 :       10029 :     DataTypes.EModeCategoryBaseConfiguration memory categoryData;
     400                 :       10029 :     categoryData.ltv = ltv;
     401                 :       10029 :     categoryData.liquidationThreshold = liquidationThreshold;
     402                 :       10029 :     categoryData.liquidationBonus = liquidationBonus;
     403                 :       10029 :     categoryData.label = label;
     404                 :             : 
     405                 :       10029 :     _pool.configureEModeCategory(categoryId, categoryData);
     406                 :       10029 :     emit EModeCategoryAdded(
     407                 :             :       categoryId,
     408                 :             :       ltv,
     409                 :             :       liquidationThreshold,
     410                 :             :       liquidationBonus,
     411                 :             :       address(0),
     412                 :             :       label
     413                 :             :     );
     414                 :             :   }
     415                 :             : 
     416                 :             :   /// @inheritdoc IPoolConfigurator
     417                 :             :   function setAssetCollateralInEMode(
     418                 :             :     address asset,
     419                 :             :     uint8 categoryId,
     420                 :             :     bool allowed
     421                 :             :   ) external override onlyRiskOrPoolAdmins {
     422                 :       10039 :     uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId);
     423                 :       10039 :     DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset);
     424                 :       10039 :     require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED);
     425                 :       10039 :     collateralBitmap = EModeConfiguration.setReserveBitmapBit(
     426                 :             :       collateralBitmap,
     427                 :             :       reserveData.id,
     428                 :             :       allowed
     429                 :             :     );
     430                 :       10039 :     _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap);
     431                 :       10039 :     emit AssetCollateralInEModeChanged(asset, categoryId, allowed);
     432                 :             :   }
     433                 :             : 
     434                 :             :   /// @inheritdoc IPoolConfigurator
     435                 :             :   function setAssetBorrowableInEMode(
     436                 :             :     address asset,
     437                 :             :     uint8 categoryId,
     438                 :             :     bool borrowable
     439                 :             :   ) external override onlyRiskOrPoolAdmins {
     440                 :        7010 :     uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId);
     441                 :        7010 :     DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset);
     442                 :        7010 :     require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED);
     443                 :        7010 :     borrowableBitmap = EModeConfiguration.setReserveBitmapBit(
     444                 :             :       borrowableBitmap,
     445                 :             :       reserveData.id,
     446                 :             :       borrowable
     447                 :             :     );
     448                 :        7010 :     _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap);
     449                 :        7010 :     emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable);
     450                 :             :   }
     451                 :             : 
     452                 :             :   /// @inheritdoc IPoolConfigurator
     453                 :             :   function setUnbackedMintCap(
     454                 :             :     address asset,
     455                 :             :     uint256 newUnbackedMintCap
     456                 :             :   ) external override onlyRiskOrPoolAdmins {
     457                 :           7 :     DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset);
     458                 :           7 :     uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap();
     459                 :           7 :     currentConfig.setUnbackedMintCap(newUnbackedMintCap);
     460                 :           7 :     _pool.setConfiguration(asset, currentConfig);
     461                 :           7 :     emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap);
     462                 :             :   }
     463                 :             : 
     464                 :             :   /// @inheritdoc IPoolConfigurator
     465                 :             :   function setReserveInterestRateData(
     466                 :             :     address asset,
     467                 :             :     bytes calldata rateData
     468                 :             :   ) external onlyRiskOrPoolAdmins {
     469                 :           2 :     DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset);
     470                 :           2 :     _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData);
     471                 :             :   }
     472                 :             : 
     473                 :             :   /// @inheritdoc IPoolConfigurator
     474                 :             :   function setReserveInterestRateStrategyAddress(
     475                 :             :     address asset,
     476                 :             :     address rateStrategyAddress,
     477                 :             :     bytes calldata rateData
     478                 :             :   ) external override onlyRiskOrPoolAdmins {
     479                 :          44 :     DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset);
     480                 :          44 :     _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData);
     481                 :             :   }
     482                 :             : 
     483                 :             :   /// @inheritdoc IPoolConfigurator
     484                 :             :   function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin {
     485                 :        1003 :     address[] memory reserves = _pool.getReservesList();
     486                 :             : 
     487                 :        1003 :     for (uint256 i = 0; i < reserves.length; i++) {
     488                 :        3009 :       if (reserves[i] != address(0)) {
     489                 :        3009 :         setReservePause(reserves[i], paused, gracePeriod);
     490                 :             :       }
     491                 :             :     }
     492                 :             :   }
     493                 :             : 
     494                 :             :   /// @inheritdoc IPoolConfigurator
     495                 :             :   function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin {
     496                 :           3 :     setPoolPause(paused, 0);
     497                 :             :   }
     498                 :             : 
     499                 :             :   /// @inheritdoc IPoolConfigurator
     500                 :             :   function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin {
     501                 :          14 :     require(
     502                 :             :       newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR,
     503                 :             :       Errors.BRIDGE_PROTOCOL_FEE_INVALID
     504                 :             :     );
     505                 :          13 :     uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE();
     506                 :          13 :     _pool.updateBridgeProtocolFee(newBridgeProtocolFee);
     507                 :          13 :     emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee);
     508                 :             :   }
     509                 :             : 
     510                 :             :   /// @inheritdoc IPoolConfigurator
     511                 :             :   function updateFlashloanPremiumTotal(
     512                 :             :     uint128 newFlashloanPremiumTotal
     513                 :             :   ) external override onlyPoolAdmin {
     514                 :         682 :     require(
     515                 :             :       newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR,
     516                 :             :       Errors.FLASHLOAN_PREMIUM_INVALID
     517                 :             :     );
     518                 :         681 :     uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL();
     519                 :         681 :     _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL());
     520                 :         681 :     emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal);
     521                 :             :   }
     522                 :             : 
     523                 :             :   /// @inheritdoc IPoolConfigurator
     524                 :             :   function updateFlashloanPremiumToProtocol(
     525                 :             :     uint128 newFlashloanPremiumToProtocol
     526                 :             :   ) external override onlyPoolAdmin {
     527                 :         682 :     require(
     528                 :             :       newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR,
     529                 :             :       Errors.FLASHLOAN_PREMIUM_INVALID
     530                 :             :     );
     531                 :         681 :     uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL();
     532                 :         681 :     _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol);
     533                 :         681 :     emit FlashloanPremiumToProtocolUpdated(
     534                 :             :       oldFlashloanPremiumToProtocol,
     535                 :             :       newFlashloanPremiumToProtocol
     536                 :             :     );
     537                 :             :   }
     538                 :             : 
     539                 :             :   /// @inheritdoc IPoolConfigurator
     540                 :             :   function getPendingLtv(address asset) external view override returns (uint256) {
     541                 :        3003 :     return _pendingLtv[asset];
     542                 :             :   }
     543                 :             : 
     544                 :             :   /// @inheritdoc IPoolConfigurator
     545                 :             :   function getConfiguratorLogic() external pure returns (address) {
     546                 :           1 :     return address(ConfiguratorLogic);
     547                 :             :   }
     548                 :             : 
     549                 :             :   function _updateInterestRateStrategy(
     550                 :             :     address asset,
     551                 :             :     DataTypes.ReserveDataLegacy memory reserve,
     552                 :             :     address newRateStrategyAddress,
     553                 :             :     bytes calldata rateData
     554                 :             :   ) internal {
     555                 :          46 :     address oldRateStrategyAddress = reserve.interestRateStrategyAddress;
     556                 :             : 
     557                 :          46 :     _pool.syncIndexesState(asset);
     558                 :             : 
     559                 :          46 :     IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData);
     560                 :          46 :     emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData);
     561                 :             : 
     562                 :          46 :     if (oldRateStrategyAddress != newRateStrategyAddress) {
     563                 :          44 :       _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress);
     564                 :          44 :       emit ReserveInterestRateStrategyChanged(
     565                 :             :         asset,
     566                 :             :         oldRateStrategyAddress,
     567                 :             :         newRateStrategyAddress
     568                 :             :       );
     569                 :             :     }
     570                 :             : 
     571                 :          46 :     _pool.syncRatesState(asset);
     572                 :             :   }
     573                 :             : 
     574                 :             :   function _checkNoSuppliers(address asset) internal view {
     575                 :        2971 :     DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset);
     576                 :        2971 :     uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider())
     577                 :             :       .getATokenTotalSupply(asset);
     578                 :             : 
     579                 :        2971 :     require(
     580                 :             :       totalSupplied == 0 && reserveData.accruedToTreasury == 0,
     581                 :             :       Errors.RESERVE_LIQUIDITY_NOT_ZERO
     582                 :             :     );
     583                 :             :   }
     584                 :             : 
     585                 :             :   function _checkNoBorrowers(address asset) internal view {
     586                 :           3 :     uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt(
     587                 :             :       asset
     588                 :             :     );
     589                 :           3 :     require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO);
     590                 :             :   }
     591                 :             : 
     592                 :             :   function _onlyPoolAdmin() internal view {
     593                 :        7396 :     IACLManager aclManager = IACLManager(_addressesProvider.getACLManager());
     594                 :        7396 :     require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN);
     595                 :             :   }
     596                 :             : 
     597                 :             :   function _onlyPoolOrEmergencyAdmin() internal view {
     598                 :       24030 :     IACLManager aclManager = IACLManager(_addressesProvider.getACLManager());
     599                 :       24030 :     require(
     600                 :             :       aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender),
     601                 :             :       Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN
     602                 :             :     );
     603                 :             :   }
     604                 :             : 
     605                 :             :   function _onlyAssetListingOrPoolAdmins() internal view {
     606                 :        8651 :     IACLManager aclManager = IACLManager(_addressesProvider.getACLManager());
     607                 :        8651 :     require(
     608                 :             :       aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender),
     609                 :             :       Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN
     610                 :             :     );
     611                 :             :   }
     612                 :             : 
     613                 :             :   function _onlyRiskOrPoolAdmins() internal view {
     614                 :       70679 :     IACLManager aclManager = IACLManager(_addressesProvider.getACLManager());
     615                 :       70679 :     require(
     616                 :             :       aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender),
     617                 :             :       Errors.CALLER_NOT_RISK_OR_POOL_ADMIN
     618                 :             :     );
     619                 :             :   }
     620                 :             : 
     621                 :             :   function _onlyRiskOrPoolOrEmergencyAdmins() internal view {
     622                 :        3014 :     IACLManager aclManager = IACLManager(_addressesProvider.getACLManager());
     623                 :        3014 :     require(
     624                 :             :       aclManager.isRiskAdmin(msg.sender) ||
     625                 :             :         aclManager.isPoolAdmin(msg.sender) ||
     626                 :             :         aclManager.isEmergencyAdmin(msg.sender),
     627                 :             :       Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN
     628                 :             :     );
     629                 :             :   }
     630                 :             : }
        

Generated by: LCOV version 2.1-1