LCOV - code coverage report
Current view: top level - misc - PriceOracleSentinel.sol (source / functions) Coverage Total Hit
Test: lcov.info.p Lines: 100.0 % 17 17
Test Date: 2024-09-24 09:34:24 Functions: 100.0 % 10 10
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 {Errors} from '../protocol/libraries/helpers/Errors.sol';
       5                 :             : import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol';
       6                 :             : import {IPriceOracleSentinel} from '../interfaces/IPriceOracleSentinel.sol';
       7                 :             : import {ISequencerOracle} from '../interfaces/ISequencerOracle.sol';
       8                 :             : import {IACLManager} from '../interfaces/IACLManager.sol';
       9                 :             : 
      10                 :             : /**
      11                 :             :  * @title PriceOracleSentinel
      12                 :             :  * @author Aave
      13                 :             :  * @notice It validates if operations are allowed depending on the PriceOracle health.
      14                 :             :  * @dev Once the PriceOracle gets up after an outage/downtime, users can make their positions healthy during a grace
      15                 :             :  *  period. So the PriceOracle is considered completely up once its up and the grace period passed.
      16                 :             :  */
      17                 :             : contract PriceOracleSentinel is IPriceOracleSentinel {
      18                 :             :   /**
      19                 :             :    * @dev Only pool admin can call functions marked by this modifier.
      20                 :             :    */
      21                 :             :   modifier onlyPoolAdmin() {
      22                 :           2 :     IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager());
      23                 :           2 :     require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN);
      24                 :             :     _;
      25                 :             :   }
      26                 :             : 
      27                 :             :   /**
      28                 :             :    * @dev Only risk or pool admin can call functions marked by this modifier.
      29                 :             :    */
      30                 :             :   modifier onlyRiskOrPoolAdmins() {
      31                 :           2 :     IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager());
      32                 :           2 :     require(
      33                 :             :       aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender),
      34                 :             :       Errors.CALLER_NOT_RISK_OR_POOL_ADMIN
      35                 :             :     );
      36                 :             :     _;
      37                 :             :   }
      38                 :             : 
      39                 :             :   IPoolAddressesProvider public immutable override ADDRESSES_PROVIDER;
      40                 :             : 
      41                 :             :   ISequencerOracle internal _sequencerOracle;
      42                 :             : 
      43                 :             :   uint256 internal _gracePeriod;
      44                 :             : 
      45                 :             :   /**
      46                 :             :    * @dev Constructor
      47                 :             :    * @param provider The address of the PoolAddressesProvider
      48                 :             :    * @param oracle The address of the SequencerOracle
      49                 :             :    * @param gracePeriod The duration of the grace period in seconds
      50                 :             :    */
      51                 :             :   constructor(IPoolAddressesProvider provider, ISequencerOracle oracle, uint256 gracePeriod) {
      52                 :          31 :     ADDRESSES_PROVIDER = provider;
      53                 :          28 :     _sequencerOracle = oracle;
      54                 :          20 :     _gracePeriod = gracePeriod;
      55                 :             :   }
      56                 :             : 
      57                 :             :   /// @inheritdoc IPriceOracleSentinel
      58                 :             :   function isBorrowAllowed() external view override returns (bool) {
      59                 :           5 :     return _isUpAndGracePeriodPassed();
      60                 :             :   }
      61                 :             : 
      62                 :             :   /// @inheritdoc IPriceOracleSentinel
      63                 :             :   function isLiquidationAllowed() external view override returns (bool) {
      64                 :           5 :     return _isUpAndGracePeriodPassed();
      65                 :             :   }
      66                 :             : 
      67                 :             :   /**
      68                 :             :    * @notice Checks the sequencer oracle is healthy: is up and grace period passed.
      69                 :             :    * @return True if the SequencerOracle is up and the grace period passed, false otherwise
      70                 :             :    */
      71                 :             :   function _isUpAndGracePeriodPassed() internal view returns (bool) {
      72                 :          10 :     (, int256 answer, uint256 startedAt, , ) = _sequencerOracle.latestRoundData();
      73                 :          10 :     return answer == 0 && block.timestamp - startedAt > _gracePeriod;
      74                 :             :   }
      75                 :             : 
      76                 :             :   /// @inheritdoc IPriceOracleSentinel
      77                 :             :   function setSequencerOracle(address newSequencerOracle) external onlyPoolAdmin {
      78                 :           1 :     _sequencerOracle = ISequencerOracle(newSequencerOracle);
      79                 :           1 :     emit SequencerOracleUpdated(newSequencerOracle);
      80                 :             :   }
      81                 :             : 
      82                 :             :   /// @inheritdoc IPriceOracleSentinel
      83                 :             :   function setGracePeriod(uint256 newGracePeriod) external onlyRiskOrPoolAdmins {
      84                 :           1 :     _gracePeriod = newGracePeriod;
      85                 :           1 :     emit GracePeriodUpdated(newGracePeriod);
      86                 :             :   }
      87                 :             : 
      88                 :             :   /// @inheritdoc IPriceOracleSentinel
      89                 :             :   function getSequencerOracle() external view returns (address) {
      90                 :           1 :     return address(_sequencerOracle);
      91                 :             :   }
      92                 :             : 
      93                 :             :   /// @inheritdoc IPriceOracleSentinel
      94                 :             :   function getGracePeriod() external view returns (uint256) {
      95                 :           1 :     return _gracePeriod;
      96                 :             :   }
      97                 :             : }
        

Generated by: LCOV version 2.1-1